多因子选股模型python_量化交易——因子选股、多因子选股策略
多因⼦选股模型python_量化交易——因⼦选股、多因⼦选股
策略
⼀、因⼦选股策略
1、因⼦
因⼦:选择股票的某种标准。因⼦是能够预测股票收益的变量。
(1)基本⾯因⼦
基本⾯因⼦描述了⼀个公司的财务状况,最常见的基本⾯因⼦是由利润表,资产负债表以及现⾦流量表中的数据直接计算出的⽐率。通过财务报表可以构建出⽆数的财务⽐率及财务报表变量的组合,并以此来预测股票的收益率。
⼀般将基本⾯因⼦分为6⼩类:估值因⼦、偿债能⼒因⼦、营运效率因⼦、盈利能⼒因⼦、财务风险因⼦以及流动性风险因⼦。
(2)技术⾯因⼦
⼤多数技术⾯因⼦是由过去的价格、成交量以及其他可获得的⾦融信息所构建的,技术⾯因⼦⼀⼤优势是能够持续更新。新的基本⾯数据最多只能按季度获取,相反,最新的技术指标每隔⼏秒就可以获得。
(3)经济因⼦
最初的套利定价模型是基于经济指标来构建的。⽐较流⾏的经济因⼦包括:GDP增速、失业率以及通货膨胀率等,它们⼏乎会影响到市场的每⼀个⾓落。
(4)其他因⼦
其他因⼦的类型包括但不限于:分析师预测因⼦、事件驱动因⼦。
2、选股策略(策略模型)
对于某个因⼦,选取表现最好(因⼦最⼤或最⼩)的N⽀股票持仓。
每隔⼀段时间调仓⼀次。
3、⼩市场策略
选取股票池中市值最⼩的N只股票持仓。
⼆、聚宽实现因⼦选股策略——⼩市值策略
沪深300中,根据市值最⼩的20只股票选股:
#初始化函数,设定基准等等
definitialize(context):#设定沪深300作为基准
set_benchmark('000300.XSHG')#开启动态复权模式(真实价格)
set_option('use_real_price', True)#输出内容到⽇志 log.info()怎样自制葡萄酒
log.info('初始函数开始运⾏且全局只运⾏⼀次')#股票类每笔交易时的⼿续费是:买⼊时佣⾦万分之三,卖出时佣⾦万分之三加千分之⼀印花税, 每笔交易佣⾦最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')#获取指数成份股
g.security = get_index_stocks('000300.XSHG')#valuation:财务数据表,code是对应的股票代码
#这⾥不能使⽤ in 操作, 要使⽤in_()函数,到沪深300股份对应的财务数据
g.q =query(valuation).de.in_(g.security))
g.N= 20 #20只股票
run_monthly(handle,1) #第⼀个参数是对应的函数,第⼆个参数指第⼏个交易⽇
defhandle(context):
df= get_fundamentals(g.q)[['code', 'market_cap']] #花式索引选出股票代码和市值
df = df.sort_values("market_cap").iloc[:g.N,:] #pandas排序函数,将数据集依照某个字段中的数据进⾏排序
#期待持有的股票
to_hold = df['code'].valuesfor stock incontext.portfolio.positions:if stock not into_hold:#⽬标股数下单,卖出⾮标的的股票
order_target(stock, 0)#期待持有且还未持仓的股票
to_buy = [stock for stock in to_hold if stock not incontext.portfolio.positions]if len(to_buy) > 0: #需要调仓
#每只股票预计投⼊的资⾦
cash_per_stock = context.portfolio.available_cash /len(to_buy)for stock into_buy:#按价值下单,买⼊需买⼊的股票
order_value(stock, cash_per_stock)
执⾏效果:
这个策略在短线情况下表现⼀般,长线情况下效果不错。
1、查询财务数据
查询财务数据,详细数据字段描述见:财务数据⽂档
get_fundamentals(query_object, date=None, statDate=None)
(1)参数介绍
query_object:⼀个query.Query对象, 可以通过全局的 query 函数获取 Query 对象;
date:查询⽇期, ⼀个字符串(格式类似'2015-10-15')或者[datetime.date]/[datetime.datetime]对象, 可以是None, 使⽤默认⽇期. 这个默认⽇期在回测和研究模块上有点差别:
回测模块: 默认值会随着回测⽇期变化⽽变化, 等于 context.current_dt 的前⼀天(实际⽣活中我们只能看到前⼀天的财报和市值数据, 所以要⽤前⼀天)
研究模块: 使⽤平台财务数据的最新⽇期, ⼀般是昨天。如果传⼊的date不是交易⽇,则使⽤这个⽇期之前的最近的⼀个交易⽇。
statDate:财报统计的季度或者年份, ⼀个字符串, 有两种格式:
季度: 格式是: 年 + 'q' + 季度序号, 例如: '2015q1', '2013q4'.
年份: 格式就是年份的数字, 例如: '2015', '2016'.
(2)date和statDate参数只能传⼊⼀个
传⼊date时, 查询指定⽇期date收盘后所能看到的最近(对市值表来说, 最近⼀天, 对其他表来说, 最近⼀个季度)的数据, 我们会查上市公司在这个⽇期之前(包括此⽇期)发布的数据, 不会有未来函数.
传⼊statDate时, 查询 statDate 指定的季度或者年份的财务数据.
(3)执⾏⽰例
definitialize(context):#设定沪深300作为基准
set_benchmark('000300.XSHG')#开启动态复权模式(真实价格)
set_option('use_real_price', True)#输出内容到⽇志 log.info()
log.info('初始函数开始运⾏且全局只运⾏⼀次')#股票类每笔交易时的⼿续费是:买⼊时佣⾦万分之三,卖出时佣⾦万分之三加千分之⼀印花税, 每笔交易佣⾦最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')#获取指数成份股
g.security = get_index_stocks('000300.XSHG')#valuation:财务数据表,code是对应的股票代码
#这⾥不能使⽤ in 操作, 要使⽤in_()函数,到沪深300股份对应的财务数据
g.q =query(valuation).de.in_(g.security))
g.N= 20 #20只股票
run_monthly(handle,1) #第⼀个参数是对应的函数,第⼆个参数指第⼏个交易⽇
defhandle(context):
df= get_fundamentals(g.q)[['code', 'market_cap']] #花式索引选出股票代码和市值重庆有哪些大学
df = df.sort_values("market_cap").iloc[:g.N,:] #pandas排序函数,将数据集依照某个字段中的数据进⾏排序
我的u盘打不开
print(df)
每⽉执⾏⼀次出市值最低的20只股票,执⾏效果:
2、每30天执⾏⼀次
(1)基于handle_data实现
#初始化函数,设定基准等等
definitialize(context):#设定沪深300作为基准
set_benchmark('000300.XSHG')#开启动态复权模式(真实价格)
set_option('use_real_price', True)#输出内容到⽇志 log.info()
log.info('初始函数开始运⾏且全局只运⾏⼀次')#股票类每笔交易时的⼿续费是:买⼊时佣⾦万分之三,卖出时佣⾦万分之三加千分之⼀印花税, 每笔交易佣⾦最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')#获取指数成份股
g.security = get_index_stocks('000300.XSHG')#valuation:财务数据表,code是对应的股票代码
#这⾥不能使⽤ in 操作, 要使⽤in_()函数,到沪深300股份对应的财务数据
g.q =query(valuation).de.in_(g.security))
g.days= -1 #加1后,可第⼀天就执⾏
defhandle_data(context, data):
g.days+= 1
if g.days % 30 == 0: #每30天执⾏⼀次
#code
(2)基于定时运⾏策略实现
三种定时运⾏策略:run_daily/run_weekly/run_monthly。
#初始化函数,设定基准等等
definitialize(context):#设定沪深300作为基准
set_benchmark('000300.XSHG')#开启动态复权模式(真实价格)
set_option('use_real_price', True)#输出内容到⽇志 log.info()
log.info('初始函数开始运⾏且全局只运⾏⼀次')#股票类每笔交易时的⼿续费是:买⼊时佣⾦万分之三,卖出时佣⾦万分之三加千分之⼀印花税, 每笔交易佣⾦最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')#获取指数成份股
g.security = get_index_stocks('000300.XSHG')#valuation:财务数据表,code是对应的股票代码
#这⾥不能使⽤ in 操作, 要使⽤in_()函数,到沪深300股份对应的财务数据
g.q =query(valuation).de.in_(g.security))
run_monthly(handle,1) #第⼀个参数是对应的函数,第⼆个参数指第⼏个交易⽇
defhandle(context):print("Hello")
2019-1-1到2019-6-30执⾏效果:
2019-01-01 00:00:00 - INFO -初始函数开始运⾏且全局只运⾏⼀次2019-01-02 09:30:00 - INFO -Hello2019-02-01 09:30:00 -INFO -Hello2019-03-01 09:30:00 - INFO -Hello2019-04-01 09:30:00 - INFO -Hello2019-05-06 09:30:00 - INFO -
Hello2019-06-03 09:30:00 - INFO - Hello
三、多因⼦选股策略
1、如何同时综合多个因⼦来选股
多因⼦选股模型的建⽴过程主要分为候选因⼦的选取、选股因⼦有效性的检验、有效但冗余囚⼦的剔除、综合评分模型的建⽴和模型的评价及持续改进5个步骤。
候选因⼦的选取:候选因⼦可能是⼀些基本⾯指标,如PB、PE、EPS增长率等,也可能是⼀些技术⾯指标,如动量、换⼿率、波动等;或者是其他指标,如预期收益增长、分析师⼀致预期变化、宏观经济变量等。候选因⼦的选择主要依赖于经济逻辑和市场经验,但选择更多和更有效的因了⽆疑是增强模型信息捕获能⼒,提⾼收益的关键因素之⼀。
冬奥奖牌选股因⼦有效性检验:检验⽅法主要采⽤排序的⽅法检验候选因⼦的选股有效性。对于任意⼀个候选因⼦,在模型形成期的第⼀个⽉初开始计算市场中每只正常交易股票的该因⼦的⼤⼩,按从⼩到⼤的顺序对样本股票进⾏排序,并平均分为n个组合,⼀直持有到⽉末,在下⽉初再按同样的⽅法重新构建n个组合并持有到⽉末,每⽉如此,⼀直重复到模型形成期末。组合构建完毕后,计算这n个组合的年化复合收益、相对于业绩基准的超出收益、在不同市场状况下的⾼收益组合跑赢基准和低收益组合跑输基准的概率等。
综合评分模型的建⽴:综合评分模型迭取去除冗余后的有效因⼦,在模型运⾏期的每个⽉初对市场中正常交易的个股计算每个因⼦的最新得分,并按照⼀定的权重求得所有因⼦的平均分。如果有的因⼦在某些⽉份可能⽆法取值(例如,有的个股因缺少分析师预期数据⽆法计算预期相关因⼦),那么按剩
下的因了分值求加权平均。最后,根据模型所得出的综合平均分对股票进⾏排序,然后根据需要选择排名靠前的股票。例如,选取得分最⾼的前20%股票,或者选取得分最⾼的50~100只股票等。
模型的评价及持续改进:⼀⽅⾯,由于量选股⽅法是建⽴在市场⽆效或弱有效的前提之下,随着使⽤多因⼦选股模型的投资者数量的不断增加,有的因⼦会逐渐失效,⽽另⼀些新的因素可能被验证有效⽽加⼊到模型中;另⼀⽅⾯,⼀些因⼦可能在过去的市场环境下⽐较有效,⽽随着市场风格的改变,这些因⼦可能短期内失效,⽽另外⼀些以前⽆效的因⼦会在当前市场环境下表现较好。另外,计算综合评分的过程中,各因⼦得分的权重设计、交易成本考虑和风险控制等都存在进⼀步改进的空间。因此在综合评分选股模型的使⽤过程中,会对选⽤的因⼦、模型本⾝做持续再评价和不断改进以适应变化的市场环境。
2、评分模型
每个股票针对每个因⼦进⾏评分,将评分相加;
选出总评分最⼤的N只股票持仓;
如何计算股票在某个因⼦下的评分:归⼀化(标准化)。
3、数据预处理——归⼀化/标准化/正则化
对于多因⼦策略,不同因⼦的量纲和数量级不同,为实现不同指标的可加性,需要对原始指标数据进⾏标准化处理。
(1)数据标准化⽅法分类
直线型:极值法、标准差法
折线型:三折线法
曲线型:半正态性分布
(2)数据标准化处理
数据同趋化:主要解决不同性质数据问题,使所有指标对评测⽅案的作⽤⼒同趋化
⽆量纲化:主要解决数据的可⽐性
数据标准化原理是将数据按⽐例缩放,使所有数据落⼊⼀个⼩的特定区间。最常见的就是归⼀化,将数据统⼀映射到[0,1]之间。
归⼀化是标准化的特例,标准化是特征缩放的特例。
(3)数据标准化⽅法
1)最⼩-最⼤标准化(Min-max normalization)
min-max标准化⼜称为离差标准化,是常见的归⼀化处理。将原始数据转化为⼀个0到1的数。
获取因⼦值最⼤值max,最⼩值min;
对数据进⾏线性变化
缺点:若有新数据加⼊,可能导致min和max的变化。
演⽰⽰例:
importnumpy as np
a= np.random.uniform(-10, 20, 100) #100个-10到20之间的随机数
print(a) #[ 2.74793518 6.41071562 15.34009849 ... -1.33143778 -7.95168854]
b= (a - a.min()) / (a.max() -a.min())print(b) #[0.1371042 0.04541101 0.14368817 0.35814033 0.27530808 ...
0.76208966 0.41034195]
2)Z-score标准化
将原始数据转化为 均值为0,标准差为1 的正态分布的随机变量。
演⽰⽰例:
1500米自由泳世界纪录
importnumpy as np
a= np.random.uniform(-10, 20, 100) #100个-10到20之间的随机数
print(a) #[ 2.74793518 6.41071562 15.34009849 ... -1.33143778 -7.95168854]
c= (a - a.mean()) /a.std()print(c) #[ 0.73462873 -1.2513859 -1.73108227 -1.05090879 ... 0.80783486 1.66651732]四、多因⼦选股策略实现——市值+ROE(净资产收益率)
双因⼦评分:市盈率越⾼越好,市值越⼩越好。
definitialize(context):#设定沪深300作为基准
喜剧片排行榜
set_benchmark('000300.XSHG')#开启动态复权模式(真实价格)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。