多因子选股模型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).filter(valuation.code.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:一个sqlalchemy.orm.query.Query对象, 可以通过全局的 query 函数获取 Query 对象;

date:查询日期, 一个字符串(格式类似'2015-10-15')或者[datetime.date]/[datetime.datetime]对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:

你可能感兴趣的:(多因子选股模型python)