股票因子可以有多个,但通常不会只用其中一个因子作为最终的策略。此时需要对这若干个因子进行组合来构建策略,并通过调优来形成最终的多因子策略用于交易。本篇以中证500指数和其成分股为数据基础,并以营收年化增长率因子和市净率因子为多因子模型基础来构建我们的选股策略。当中没有考虑换手率频率控制以及交易成本,这个可以根据实际情况需要来增加。
首先导入所需的module和数据:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入成分股年化营收增长率数据
revenue_yoy = pd.read_csv('revenue_yoy_zz500.csv', index_col=0)
# 导入成分股市净率数据
pb = pd.read_csv('pb_zz500.csv', index_col=0)
# 导入成分股日收益率数据
returns = pd.read_csv('returns_zz500.csv', index_col=0)*0.01
同时我们将未做处理的中证500指数的增长率作为业绩比较基准,并绘制累积收益曲线:
# 导入中证500指数的收益率
zz500_index = pd.read_csv('zz500_index.csv', index_col=0)['000905.SH'] #指数收益率为series格式
# 计算比较基准的累积增长数据(此处直接将日收益率相加,也可用对数值相加计算)
benchmark_returns = zz500_index.pct_change().fillna(0.).cumsum().tolist() # 累积收益数据存放在list中
# 绘制曲线
plt.plot(benchmark_returns)
plt.title('benchmark_returns')
每日对股票revenue和pb求rank,并做归一会处理使得rank在0-1之间:
rev_rank = revenue_yoy.rank(axis=1)/500 #每一行里面对revenue进行排序
pb_rank = pb.rank(axis=1)/500 #每一行里对pb进行排序
多因子策略构建1,revenue因子权重50%,pb因子权重50%的情况下选取每日前20%排位的股票,计算累积收益率并绘图:
strat_returns = [0]
for i in range(len(returns)-1):
selected = (rev_rank.iloc[i] * 0.5 + pb_rank.iloc[i] * 0.5) > 0.8
ret = returns.iloc[i + 1].loc[selected].mean() #等权重持仓,也可以按其他权重持仓
strat_returns.append(ret)
# 计算每日收益率的累积函数(也可根据需要取对数后求和)
plt.plot(pd.Series(strat_returns).cumsum(), label='strategy')
plt.plot(benchmark_returns, label='zz500')
plt.title('strategy vs zz500')
plt.legend()
多因子策略构建2,我们也可以每日按照年化revenue增速因子排名为前20%,同时按照pb因子排名也在前20%的股票才作为选股对象,同样计算累积收益率并绘图。此时可以看出,按照第二个策略得到的超额收益是更高的。
strat_returns = [0]
for i in range(len(returns)-1):
selected = (pb_rank.iloc[i] > 0.8) & (rev_rank.iloc[i] > 0.8)
ret = returns.iloc[i + 1].loc[selected].mean() #等权重持仓,也可以按其他权重持仓
strat_returns.append(ret)
# 计算每日收益率的累积函数(也可根据需要取对数后求和)
plt.plot(pd.Series(strat_returns).cumsum(), label='strategy')
plt.plot(benchmark_returns, label='zz500')
plt.title('strategy vs zz500')
plt.legend()
总结,对于两个或多个因子以上的因子构建横截面选股策略其实可以有多种选择,实际情况好坏可以通过前述的参数调优的方法进行优化。因子之间也不一定要按照线性组合方式来组合,更多逻辑关系作为选股方案更便于投资直觉的实现。此外,这里按照等权重进行组合构建,如考虑流动性等问题可以做一些权重倾斜。另外,出于控制手续费的考虑,可以对换仓频率进行控制,比如每10天,20天进行一次调仓,调仓频率可以作为策略构建时的一个参数。最后,对于构建出来的多因子策略,我们依然可以按照我之前的文章《股票因子--IC分析》和《股票因子--回归分析》来做相关的分析并改进。