一、因子选股策略
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, 使用默认日期. 这个默认日期在回测和研究模块上有点差别: