核心内容摘要
窥探欲望边界:成人黄漫的另类美学与叙事深度
免责声明本文基于个人学习经验整理仅供技术交流参考不构成投资建议。
前言从事期货量化交易二十年我最大的感悟是单一因子的策略越来越难赚钱了。
多因子策略通过组合多个因子可以提高策略的稳健性。
今天这篇文章我来分享一下期货多因子策略的开发入门。
什么是多因子策略多因子策略的核心思想因子能够预测未来收益的特征如动量、波动率等多因子组合多个因子取长补短因子组合通过加权等方式综合多个因子
常用期货因子
1 动量因子defcalc_momentum(df,period
:动量因子过去N日收益率df[momentum]df[close].pct_change(period)returndf[momentum]
2 波动率因子importnumpyasnpdefcalc_volatility(df,period
:波动率因子过去N日收益率标准差returnsdf[close].pct_change()df[volatility]returns.rolling(period).std()returndf[volatility]
3 均线偏离因子defcalc_ma_deviation(df,period
:均线偏离因子价格相对均线的偏离度madf[close].rolling(period).mean()df[ma_deviation](df[close]-ma)/mareturndf[ma_deviation]
4 成交量因子defcalc_volume_ratio(df,period
:成交量比率因子当前成交量/平均成交量avg_volumedf[volume].rolling(period).mean()df[volume_ratio]df[volume]/avg_volumereturndf[volume_ratio]
5 RSI因子defcalc_rsi(df,period
:RSI因子deltadf[close].diff()gaindelta.where(delta0,
loss-delta.where(delta0,
avg_gaingain.rolling(period).mean()avg_lossloss.rolling(period).mean()rsavg_gain/avg_loss df[rsi]100-(100/(1rs))returndf[rsi]
因子计算完整示例fromtqsdkimportTqApi,TqAuthimportpandasaspdimportnumpyasnp apiTqApi(authTqAuth(账户,密码))symbolSHFE.rb2505klinesapi.get_kline_serial(symbol,60*60*24,
# 日线api.wait_update()# 转为DataFramedfklines.to_dataframe()# 计算各因子defcalc_all_factors(df):计算所有因子#
动量因子df[momentum_5]df[close].pct_change(
df[momentum_20]df[close].pct_change(
#
波动率因子returnsdf[close].pct_change()df[volatility]returns.rolling(
.std()#
均线偏离ma20df[close].rolling(
.mean()df[ma_deviation](df[close]-ma
/ma20#
成交量比率avg_voldf[volume].rolling(
.mean()df[volume_ratio]df[volume]/avg_vol#
RSIdeltadf[close].diff()gaindelta.where(delta0,
.rolling(
.mean()loss(-delta.where(delta0,
).rolling(
.mean()df[rsi]
/(1gain/loss)#
价格位置相对近期高低点high_20df[high].rolling(
.max()low_20df[low].rolling(
.min()df[price_position](df[close]-low_
/(high_20-low_
returndf dfcalc_all_factors(df)print(df[[datetime,close,momentum_20,volatility,rsi]].tail(
)api.close()
因子标准化不同因子的量级不同需要标准化defstandardize_factors(df,factor_cols):因子标准化Z-scoreforcolinfactor_cols:meandf[col].rolling(
.mean()stddf[col].rolling(
.std()df[f{col}_zscore](df[col]-mean)/stdreturndf factor_cols[momentum_20,volatility,ma_deviation,volume_ratio,rsi]dfstandardize_factors(df,factor_cols)
因子组合
1 等权组合defequal_weight_score(df,factor_cols):等权因子组合zscore_cols[f{col}_zscoreforcolinfactor_cols]df[composite_score]df[zscore_cols].mean(axis
returndf
2 自定义权重defweighted_score(df,factor_weights):加权因子组合score0forfactor,weightinfactor_weights.items():scoredf[f{factor}_zscore]*weight df[composite_score]scorereturndf# 使用weights{momentum_20:
3,ma_deviation:
25,rsi:
2,volume_ratio:
15,volatility:
1,}dfweighted_score(df,weights)
多因子策略实现fromtqsdkimportTqApi,TqAuth,TqBacktest,TqSimfromdatetimeimportdateimportpandasaspd# 参数SYMBOLSHFE.rb2505ENTRY_THRESHOLD
0# 开仓阈值EXIT_THRESHOLD-
5# 平仓阈值VOLUME1# 因子权重FACTOR_WEIGHTS{momentum_20:
3,ma_deviation:
25,rsi_factor:
2,# RSI转换后的因子volume_ratio:
15,volatility:
1,}apiTqApi(TqSim(),backtestTqBacktest(start_dtdate(2024,1,
,end_dtdate(2025,6,
),authTqAuth(账户,密码))klinesapi.get_kline_serial(SYMBOL,60*60,
# 1小时K线positionapi.get_position(SYMBOL)print(多因子策略启动...)whileTrue:api.wait_update()ifapi.is_changing(klines):iflen(klines)60:continuedfklines.to_dataframe()# 计算因子df[momentum_20]df[close].pct_change(
ma20df[close].rolling(
.mean()df[ma_deviation](df[close]-ma
/ma20 df[volume_ratio]df[volume]/df[volume].rolling(
.mean()returnsdf[close].pct_change()df[volatility]returns.rolling(
.std()# RSI转换RSI70做空因子RSI30做多因子deltadf[close].diff()gaindelta.where(delta0,
.rolling(
.mean()loss(-delta.where(delta0,
).rolling(
.mean()rsi
/(1gain/loss)df[rsi_factor](50-rsi)/50# 标准化到-1到1# 标准化因子forfactorinFACTOR_WEIGHTS.keys():meandf[factor].rolling(
.mean()stddf[factor].rolling(
.std()df[f{factor}_zscore](df[factor]-mean)/std# 计算综合得分score0forfactor,weightinFACTOR_WEIGHTS.items():zscoredf[f{factor}_zscore].iloc[-1]ifpd.notna(zscore):scorezscore*weight# 交易逻辑ifposition.pos_long0andposition.pos_short0:ifscoreENTRY_THRESHOLD:api.insert_order(SYMBOL,BUY,OPEN,VOLUME)print(f做多 | 得分:{score:.2f})elifscore-ENTRY_THRESHOLD:api.insert_order(SYMBOL,SELL,OPEN,VOLUME)print(f做空 | 得分:{score:.2f})elifposition.pos_long0:ifscoreEXIT_THRESHOLD:api.insert_order(SYMBOL,SELL,CLOSE,position.pos_long)print(f平多 | 得分:{score:.2f})elifposition.pos_short0:ifscore-EXIT_THRESHOLD:api.insert_order(SYMBOL,BUY,CLOSE,position.pos_short)print(f平空 | 得分:{score:.2f})
因子分析
1 因子IC分析defcalc_factor_ic(df,factor_col,forward_returns_col,period
:计算因子IC信息系数# 计算未来收益df[forward_return]df[close].pct_change(period).shift(-period)# 计算IC相关系数icdf[factor_col].rolling(
.corr(df[forward_return])returnic.mean(),ic.std()# 使用ic_mean,ic_stdcalc_factor_ic(df,momentum_20,forward_return)print(f动量因子 IC均值:{ic_mean:.4f}, IC标准差:{ic_std:.4f})print(fIC_IR:{ic_mean/ic_std:.4f})
2 因子相关性importseabornassnsimportmatplotlib.pyplotasplt# 计算因子相关性矩阵factor_cols[momentum_20,ma_deviation,volatility,volume_ratio,rsi]corr_matrixdf[factor_cols].corr()# 绘制热力图plt.figure(figsize(10,
)sns.heatmap(corr_matrix,annotTrue,cmapcoolwarm,center
plt.title(因子相关性矩阵)plt.show()
九、
总结期货多因子策略开发的核心步骤因子挖掘发现有预测能力的因子因子计算正确计算各因子值因子标准化统一因子量级因子组合通过权重组合多个因子策略实现基于综合得分做交易决策因子分析分析因子有效性和相关性从使用体验来说我目前用TqSdk做因子策略开发主要因为数据获取方便回测和实盘代码一致。
希望这篇入门教程对你有所帮助声明本文基于个人学习经验整理仅供技术交流参考不构成任何投资建议。