一、前言
选择合适的期货品种是量化交易成功的第一步。不同品种有不同的特性,适合不同的策略。本文将详细介绍如何选择适合的期货品种进行量化交易。
本文将介绍:
- 品种选择标准
- 品种特性分析
- 流动性评估
- 相关性分析
- 品种组合选择
二、为什么选择天勤量化(TqSdk)
TqSdk品种选择支持:
| 功能 | 说明 |
|---|---|
| 多品种数据 | 支持获取多个品种数据 |
| 实时行情 | 支持实时行情数据 |
| 数据分析 | 支持品种数据分析 |
| 灵活扩展 | 支持自定义分析 |
安装方法:
pipinstalltqsdk pandas numpy三、品种选择标准
3.1 选择标准
| 标准 | 说明 | 重要性 |
|---|---|---|
| 流动性 | 成交活跃程度 | ⭐⭐⭐⭐⭐ |
| 波动性 | 价格波动幅度 | ⭐⭐⭐⭐ |
| 趋势性 | 趋势明显程度 | ⭐⭐⭐⭐ |
| 手续费 | 交易成本 | ⭐⭐⭐ |
| 合约规模 | 合约价值 | ⭐⭐⭐ |
3.2 品种分类
| 分类 | 特点 | 适合策略 |
|---|---|---|
| 活跃品种 | 成交量大、流动性好 | 高频、短线 |
| 趋势品种 | 趋势明显 | 趋势跟踪 |
| 波动品种 | 波动率大 | 波动率策略 |
| 套利品种 | 相关性高 | 套利策略 |
四、流动性分析
4.1 成交量分析
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:品种选择分析 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuthimportpandasaspdimportnumpyasnpdefanalyze_liquidity(api,symbol,days=30):"""分析流动性"""klines=api.get_kline_serial(symbol,3600,days*24)api.wait_update()liquidity_metrics={}# 平均成交量liquidity_metrics['avg_volume']=klines['volume'].mean()# 成交量稳定性liquidity_metrics['volume_std']=klines['volume'].std()liquidity_metrics['volume_cv']=liquidity_metrics['volume_std']/liquidity_metrics['avg_volume']# 最大最小成交量liquidity_metrics['max_volume']=klines['volume'].max()liquidity_metrics['min_volume']=klines['volume'].min()# 零成交量天数liquidity_metrics['zero_volume_days']=(klines['volume']==0).sum()returnliquidity_metrics# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))symbols=["SHFE.rb2510","SHFE.hc2510","DCE.i2510"]liquidity_results={}forsymbolinsymbols:liquidity_results[symbol]=analyze_liquidity(api,symbol)print(f"{symbol}: 平均成交量{liquidity_results[symbol]['avg_volume']:.0f}")api.close()4.2 价差分析
defanalyze_spread(api,symbol):"""分析价差(买卖价差)"""quote=api.get_quote(symbol)api.wait_update()bid_price=quote.bid_price1 ask_price=quote.ask_price1ifbid_price>0andask_price>0:spread=ask_price-bid_price spread_ratio=spread/bid_pricereturn{'spread':spread,'spread_ratio':spread_ratio}returnNone# 使用示例spread_results={}forsymbolinsymbols:spread_data=analyze_spread(api,symbol)ifspread_data:spread_results[symbol]=spread_dataprint(f"{symbol}: 价差比例{spread_results[symbol]['spread_ratio']:.4%}")五、波动性分析
5.1 波动率计算
defanalyze_volatility(api,symbol,days=30):"""分析波动率"""klines=api.get_kline_serial(symbol,3600,days*24)api.wait_update()returns=klines['close'].pct_change().dropna()volatility_metrics={}# 日波动率volatility_metrics['daily_volatility']=returns.std()# 年化波动率volatility_metrics['annual_volatility']=returns.std()*np.sqrt(252)# 波动率稳定性rolling_vol=returns.rolling(20).std()volatility_metrics['volatility_std']=rolling_vol.std()# 最大单日波动volatility_metrics['max_daily_move']=abs(returns).max()returnvolatility_metrics# 使用示例volatility_results={}forsymbolinsymbols:volatility_results[symbol]=analyze_volatility(api,symbol)print(f"{symbol}: 年化波动率{volatility_results[symbol]['annual_volatility']:.2%}")5.2 波动率分类
defclassify_volatility(volatility_metrics):"""波动率分类"""annual_vol=volatility_metrics['annual_volatility']ifannual_vol>0.4:return"高波动"elifannual_vol>0.2:return"中波动"else:return"低波动"# 使用示例forsymbolinsymbols:vol_class=classify_volatility(volatility_results[symbol])print(f"{symbol}:{vol_class}")六、趋势性分析
6.1 趋势强度
fromtqsdk.tafuncimportmadefanalyze_trend_strength(api,symbol,days=30):"""分析趋势强度"""klines=api.get_kline_serial(symbol,3600,days*24)api.wait_update()returns=klines['close'].pct_change().dropna()# 趋势指标ma5=ma(klines['close'],5)ma20=ma(klines['close'],20)# 趋势一致性trend_consistency=(ma5>ma20).sum()/len(ma5)# 趋势强度(ADX简化版)up_move=(klines['high']-klines['high'].shift(1)).clip(lower=0)down_move=(klines['low'].shift(1)-klines['low']).clip(lower=0)tr=klines['high']-klines['low']atr=tr.rolling(14).mean()trend_strength=abs(up_move.rolling(14).mean()-down_move.rolling(14).mean())/atrreturn{'trend_consistency':trend_consistency,'avg_trend_strength':trend_strength.mean()}# 使用示例trend_results={}forsymbolinsymbols:trend_results[symbol]=analyze_trend_strength(api,symbol)print(f"{symbol}: 趋势一致性{trend_results[symbol]['trend_consistency']:.2%}")七、相关性分析
7.1 品种相关性
defanalyze_correlation(api,symbols,days=30):"""分析品种相关性"""price_data={}forsymbolinsymbols:klines=api.get_kline_serial(symbol,3600,days*24)api.wait_update()price_data[symbol]=klines['close']# 计算相关性矩阵price_df=pd.DataFrame(price_data)correlation_matrix=price_df.corr()returncorrelation_matrix# 使用示例correlation_matrix=analyze_correlation(api,symbols)print("相关性矩阵:")print(correlation_matrix)7.2 相关性应用
defselect_diversified_portfolio(correlation_matrix,min_correlation=0.7):"""选择分散化组合"""selected=[]remaining=list(correlation_matrix.columns)whileremaining:# 选择第一个品种ifnotselected:selected.append(remaining.pop(0))else:# 选择与已选品种相关性低的best_candidate=Nonemin_avg_corr=1.0forcandidateinremaining:avg_corr=correlation_matrix.loc[selected,candidate].mean()ifavg_corr<min_avg_corr:min_avg_corr=avg_corr best_candidate=candidateifbest_candidateandmin_avg_corr<min_correlation:selected.append(best_candidate)remaining.remove(best_candidate)else:breakreturnselected# 使用示例diversified=select_diversified_portfolio(correlation_matrix)print(f"分散化组合:{diversified}")八、综合评分系统
8.1 品种评分
defscore_commodity(api,symbol):"""综合评分"""# 获取各项指标liquidity=analyze_liquidity(api,symbol)volatility=analyze_volatility(api,symbol)trend=analyze_trend_strength(api,symbol)spread_data=analyze_spread(api,symbol)score=0# 流动性评分(0-30分)ifliquidity['avg_volume']>100000:score+=30elifliquidity['avg_volume']>50000:score+=20elifliquidity['avg_volume']>10000:score+=10# 波动率评分(0-25分)if0.2<volatility['annual_volatility']<0.4:score+=25elif0.15<volatility['annual_volatility']<0.5:score+=15else:score+=5# 趋势性评分(0-25分)iftrend['trend_consistency']>0.6:score+=25eliftrend['trend_consistency']>0.4:score+=15else:score+=5# 价差评分(0-20分)ifspread_dataandspread_data['spread_ratio']<0.001:score+=20elifspread_dataandspread_data['spread_ratio']<0.002:score+=15else:score+=5returnscore# 使用示例scores={}forsymbolinsymbols:scores[symbol]=score_commodity(api,symbol)print(f"{symbol}: 综合评分{scores[symbol]}/100")# 排序sorted_symbols=sorted(scores.items(),key=lambdax:x[1],reverse=True)print(f"\n推荐品种排序:")forsymbol,scoreinsorted_symbols:print(f"{symbol}:{score}分")九、品种组合选择
9.1 组合优化
defoptimize_portfolio(api,candidate_symbols,max_symbols=5):"""优化组合"""# 计算所有品种的评分scores={}forsymbolincandidate_symbols:scores[symbol]=score_commodity(api,symbol)# 按评分排序sorted_symbols=sorted(scores.items(),key=lambdax:x[1],reverse=True)# 选择前N个selected=[s[0]forsinsorted_symbols[:max_symbols]]# 检查相关性correlation_matrix=analyze_correlation(api,selected)# 如果相关性过高,调整foriinrange(len(selected)):forjinrange(i+1,len(selected)):ifcorrelation_matrix.loc[selected[i],selected[j]]>0.8:# 相关性过高,替换foraltinsorted_symbols:ifalt[0]notinselected:# 检查与已选品种的相关性alt_corr=analyze_correlation(api,selected+[alt[0]])max_corr=alt_corr.loc[selected,alt[0]].max()ifmax_corr<0.8:selected[j]=alt[0]breakreturnselected# 使用示例candidate_symbols=["SHFE.rb2510","SHFE.hc2510","DCE.i2510","SHFE.cu2510","DCE.c2510"]optimal_portfolio=optimize_portfolio(api,candidate_symbols,max_symbols=3)print(f"优化组合:{optimal_portfolio}")十、总结
10.1 品种选择要点
| 要点 | 说明 |
|---|---|
| 流动性优先 | 优先选择流动性好的品种 |
| 波动适中 | 选择波动率适中的品种 |
| 趋势明显 | 选择趋势性强的品种 |
| 分散化 | 选择相关性低的品种组合 |
10.2 注意事项
- 流动性- 确保有足够流动性
- 成本- 考虑交易成本
- 相关性- 注意品种相关性
- 持续评估- 定期重新评估品种
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest