Python量化交易学习——Part6:多因子选股策略实战(2)

本节主要是针对上节讲解的进行回测:
策略:
首先根据上节所选的因子进行选股,各个因子的权重都设置为1,之后对加权后的因子进行排序,选择因子权重值大的5只股票,进行买入,每个月执行一次上述策略,看最终收益率情况如何。

首先先编写函数代码,新建一个py文件,我们这里就命名为grow_yinzi_strange.py,内部代码如下:

import numpy as np
import pandas as pd
import gm.api as gm
import datetime
from dateutil.relativedelta import relativedelta
from sklearn.preprocessing import MinMaxScaler


def min_max_scaling(data):
    min_val = np.min(data)
    max_val = np.max(data)
    return (data - min_val) / (max_val - min_val)

def grow_yinzi(index,now):
    HS300_array = gm.stk_get_index_constituents(index) #获取沪深300成分股数据
    """
    按照股票代码从大到小进行排序,注意下面这句非常重要,因为在实际使用过程中我发现,gm.stk_get_finance_deriv()和参数symbols=HS300_symbol_list中的顺序
    并不一样,这回导致我们采用for循环中得到的参数数据和采用gm.stk_get_finance_deriv()顺序完全不同,所以我们先对股票代码进行排序,以控制for循环中返回的参数数据
    之后我们再把gm.stk_get_finance_deriv()中得到的顺序同样进行从大到小排序,才能保持两组数据完全一致。
    """
    HS300_array = HS300_array.sort_values(["symbol"],ascending=False)  # 按照股票代码从大到小排序
    HS300_symbol_array = HS300_array['symbol'].values
    HS300_symbol_list = list(HS300_symbol_array) # 转换为list类型才能进行后续处理


    # 采用pd.DataFrame建立二维数据表,初始化数据表,后续可以将数据存储到表中
    factor_matrix = pd.DataFrame([])
    factor_matrix["symbol"] = HS300_symbol_list
    # factor_matrix["earnings before interest and tax"] = -999    # 息税前收益增长率,很多数据都差不到,暂时不用这个因子
    factor_matrix["net_prof_yoy"] = -999    # 净利润同比增长率
    factor_matrix["oper_prof_yoy"] = -999   # 营业利润同比增长率
    factor_matrix["ttl_asset_yoy"] = -999   # 总资产同比增长率
    factor_matrix["net_cf_oper_yoy"] = -999 # 经营活动产生的现金流量净额同比增长率
    factor_matrix["net_asset_yoy"] = -999   # 净资产同比增长率
    factor_matrix["eps_bas_yoy"] = -999     # 基本每股收益同比增长率
    factor_matrix["roe_yoy"] = -999         # 净资产收益率同比增长率(摊薄)
    factor_matrix["ttl_prof_yoy"] = -999    # 利润总额同比增长率
    """
    在这里所有的值都被定义为-999,这样做的目的是在读取数据的时候,防止有数据缺失或者出错,将默认值设置成现实数据中可能遇到的最小值。
    这样做的好处是在后续计算时可以自动将出错的数据的计算结果降为最差的结果,自动排除出错的数据集
    后面我们也可以这样做,先批量获取数据值,之后判断数据有无缺失,如果产生缺失,就逐个获取对应因子的数据,对于缺失的因子数据,采用-999进行填充
    """
    day_time,hour_and_mins = str(now.strftime('%Y-%m-%d %H:%M:%S')).split(" ")  # 调用datetime函数获取最新时间
    six_months_ago = now - relativedelta(months=3) # 获取9个月前的时间作为后续查询数据的起始时间(主要是息税前收益增长率的计算需要T-1的数据,所有这里设置需要大于6个月)
    last_day_time,last_hour_and_mins = str(six_months_ago.strftime('%Y-%m-%d %H:%M:%S')).split(" ") # 转换时间格式到str
    # 求息税前收益增长率,这个没有现成的公式,需要手动计算,计算公式为息税前收益增长率=(本期息税前利润 – 上期息税前利润) / 上期息税前利润 × 100%
    # 采用dataframe格式获取数据,因为有一些数据无法获取到,所以运行起来特别慢,先注释掉,不采用这个参数

    """
    for number in range(len(HS300_symbol_list))

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-12 21:34:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-12 21:34:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-12 21:34:04       82 阅读
  4. Python语言-面向对象

    2024-06-12 21:34:04       91 阅读

热门阅读

  1. Nginx GeoIP 使用指南-宝塔识别ip屏蔽地区

    2024-06-12 21:34:04       31 阅读
  2. Thinkphp5实现自定义路由和使用方法

    2024-06-12 21:34:04       29 阅读
  3. E. 日期计算

    2024-06-12 21:34:04       27 阅读
  4. 主机加固方案分享

    2024-06-12 21:34:04       26 阅读
  5. docker拉取镜像失败处理

    2024-06-12 21:34:04       34 阅读
  6. 边界值测试中的边界情况数据

    2024-06-12 21:34:04       31 阅读
  7. 记一次网络故障排查could not load plugin “ifcfg-rh“

    2024-06-12 21:34:04       29 阅读