试论因子的筛选,股票期货策略,以及基于多因子策略的机器学习算法
前言
之前参加泰迪杯的,但又没什么时间,自己又是python新手,量化投资新手,还有不熟悉量化投资软件的使用。做的一塌糊涂。。往后却没有时间参加。
写这个文章,虽然也很糟糕,但也算是提供一种思路吧,便于新手入门的参考吧,也算是自己的一种收获吧。
正文
本文以python3.7上点宽网采用2016-01-01至2018-09-30时期的平台数据,以及回测框架。
股票因子的筛选
因子:能引起股票产生变化的因素,常见的有价值类因子PB,PE等等。。。见链接
因子获取:
这里以获取价值类的因子数据为例(那里共有12大类):
# -*- coding: utf-8 -*- ##支持中文输入
from atrader import * # 导入atrader工具包,点宽回测必须的包
import pandas as pd # 导入pandas工具包
import os ###处理文件和目录
因子类名='价值类'
因子类=['NegMktValue','PE','PB','PS','MktValue','PCF','LFLO','LCAP','NLSIZE','ForwardPE','StaticPE','ETOP','CETOP','PEG3Y','PEG5Y','CTOP','TA2EV','ETP5','CTP5']
股票 = pd.DataFrame(get_code_list('hs300', date='2018-09-30')) ##获取 2018 年 9 月 30 日沪深 300 指数的成分股及权重:
for 序号, 数据 in 股票.iterrows(): ##进入循环
多个因子 = pd.ExcelWriter("C:\\因子\\%s\\%s_%d_%s.xlsx" % (因子类名,因子类名,序号, 数据['name']))
isExists=os.path.exists("C:\\因子\\%s\\"%因子类名)
if not isExists:
os.makedirs(r"C:\\因子\\%s\\"%因子类名)
因子数值 = get_factor_by_code(factor_list=因子类,target=数据['code'],
begin_date='2016-01-1', end_date='2018-09-30') #这里是获取某个日期范围内的数据
文件 = pd.DataFrame(data=因子数值) ##
文件.to_excel(多个因子, sheet_name=数据['name'], index=False)
print("已完成第%d个,本企业代码为%s"%(序号,数据['code']))
多个因子.save() ###文件保存
print("已完成!!")
其中,利用点宽的函数get_code_list(‘hs300’, date=‘2018-09-30’),数据前几行长这样:
完成后有300家股票对应的因子数据,第一家平安银行的因子数据前几行长这样:
因子处理:
# -*- coding: utf-8 -*-
from atrader import *
import numpy as np
import pandas as pd
import ffn
各类因子 = ["基础科目与衍生类","质量类","收益风险类","情绪类","成长类","常用技术指标类","动量类","价值类","每股指标类","模式识别类",
"行业、分析师类","特色技术指标类"]
hs300 = pd.read_excel('G:\\泰迪杯\\\\A\\因子\\hs300.xlsx')
table=pd.DataFrame()
for i, j in hs300.iterrows():
##获取时期内单个股票的bar,循环,连续300个股票的bar
kdata = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\bar\\bar_%d_%s.xlsx' % (i, j['name'])))
dataclose = kdata.close
datavolume = kdata.volume
dataopen = kdata.open
datahigh = kdata.high
datalow = kdata.low
dataamount = kdata.amount
##数据读入并处理删除整列空值的以及删除日期列-----
d0 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[0], 各类因子[0], i, j['name']))).dropna(
axis=1, how="all")
d1 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[1], 各类因子[1], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d2 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[2], 各类因子[2], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d3 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[3], 各类因子[3], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d4 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[4], 各类因子[4], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d5 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子