news 2026/5/1 8:23:01

【期货量化实战】期货量化交易实战:从数据到策略(完整流程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【期货量化实战】期货量化交易实战:从数据到策略(完整流程)

一、前言

量化交易的核心是从数据中挖掘规律,构建策略。本文将详细介绍从数据获取、处理、分析到策略构建的完整实战流程。

本文将介绍:

二、为什么选择天勤量化(TqSdk)

TqSdk数据到策略支持:

功能说明
数据获取支持获取高质量历史数据
数据处理pandas/numpy支持数据处理
技术指标内置多种技术指标
回测框架支持策略回测验证

安装方法

pipinstalltqsdk pandas numpy matplotlib

三、数据获取

3.1 获取历史数据

#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:从数据到策略完整流程 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuthimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltdefget_historical_data(api,symbol,duration_seconds=3600,count=1000):"""获取历史数据"""klines=api.get_kline_serial(symbol,duration_seconds,count)api.wait_update()returnklines# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=get_historical_data(api,"SHFE.rb2510",3600,1000)print(f"数据量:{len(klines)}")print(klines.head())api.close()

3.2 数据质量检查

defcheck_data_quality(klines):"""检查数据质量"""issues=[]# 检查缺失值ifklines.isnull().any().any():issues.append("存在缺失值")# 检查异常值returns=klines['close'].pct_change()if(abs(returns)>0.1).any():issues.append("存在异常收益率")# 检查数据连续性iflen(klines)<100:issues.append("数据量不足")returnissues# 使用示例issues=check_data_quality(klines)ifissues:print("数据质量问题:",issues)else:print("数据质量良好")

四、数据探索

4.1 基础统计分析

defexplore_data(klines):"""数据探索"""# 基础统计print("=== 基础统计 ===")print(klines[['open','high','low','close','volume']].describe())# 收益率分析returns=klines['close'].pct_change().dropna()print("\n=== 收益率统计 ===")print(f"平均收益率:{returns.mean():.4%}")print(f"收益率标准差:{returns.std():.4%}")print(f"最大涨幅:{returns.max():.4%}")print(f"最大跌幅:{returns.min():.4%}")# 波动率分析volatility=returns.rolling(20).std()print(f"\n平均波动率:{volatility.mean():.4%}")returnreturns,volatility# 使用示例returns,volatility=explore_data(klines)

4.2 可视化分析

defvisualize_data(klines):"""数据可视化"""fig,axes=plt.subplots(3,1,figsize=(12,10))# 价格走势axes[0].plot(klines.index,klines['close'])axes[0].set_title('价格走势')axes[0].set_ylabel('价格')# 成交量axes[1].bar(klines.index,klines['volume'])axes[1].set_title('成交量')axes[1].set_ylabel('成交量')# 收益率分布returns=klines['close'].pct_change().dropna()axes[2].hist(returns,bins=50)axes[2].set_title('收益率分布')axes[2].set_xlabel('收益率')axes[2].set_ylabel('频数')plt.tight_layout()plt.savefig('data_analysis.png')plt.close()# 使用示例visualize_data(klines)

五、特征工程

5.1 技术指标特征

fromtqsdk.tafuncimportma,macd,rsi,bolldefcreate_features(klines):"""创建特征"""features=pd.DataFrame(index=klines.index)# 价格特征features['close']=klines['close']features['high']=klines['high']features['low']=klines['low']features['open']=klines['open']# 收益率特征features['return_1']=klines['close'].pct_change(1)features['return_5']=klines['close'].pct_change(5)features['return_20']=klines['close'].pct_change(20)# 均线特征features['ma5']=ma(klines['close'],5)features['ma20']=ma(klines['close'],20)features['ma_ratio']=features['ma5']/features['ma20']-1# MACD特征macd_data=macd(klines['close'],12,26,9)features['macd']=macd_data['macd']features['macd_signal']=macd_data['signal']features['macd_hist']=macd_data['hist']# RSI特征features['rsi']=rsi(klines['close'],14)# 布林带特征boll_data=boll(klines['close'],20,2)features['boll_upper']=boll_data['upper']features['boll_lower']=boll_data['lower']features['boll_position']=(klines['close']-boll_data['lower'])/(boll_data['upper']-boll_data['lower'])# 成交量特征features['volume']=klines['volume']features['volume_ma']=klines['volume'].rolling(20).mean()features['volume_ratio']=klines['volume']/features['volume_ma']returnfeatures# 使用示例features=create_features(klines)print(f"特征数量:{len(features.columns)}")print(features.head())

5.2 特征选择

defselect_features(features,target,top_n=10):"""特征选择"""fromsklearn.feature_selectionimportSelectKBest,f_regression# 删除缺失值valid_idx=~(features.isnull().any(axis=1)|target.isnull())X=features[valid_idx]y=target[valid_idx]# 特征选择selector=SelectKBest(f_regression,k=top_n)X_selected=selector.fit_transform(X,y)selected_features=features.columns[selector.get_support()]returnselected_features,X_selected# 使用示例target=klines['close'].pct_change(1).shift(-1)# 未来收益率selected_features,X_selected=select_features(features,target)print(f"选择的特征:{selected_features.tolist()}")

六、策略开发

6.1 基于规则的策略

defrule_based_strategy(features):"""基于规则的策略"""signals=pd.Series(0,index=features.index)# 规则1: 均线金叉ma5=features['ma5']ma20=features['ma20']golden_cross=(ma5>ma20)&(ma5.shift(1)<=ma20.shift(1))signals[golden_cross]=1# 规则2: RSI超卖rsi=features['rsi']oversold=rsi<30signals[oversold]=1# 规则3: 布林带下轨boll_position=features['boll_position']at_lower=boll_position<0.2signals[at_lower]=1# 卖出信号death_cross=(ma5<ma20)&(ma5.shift(1)>=ma20.shift(1))signals[death_cross]=-1overbought=rsi>70signals[overbought]=-1at_upper=boll_position>0.8signals[at_upper]=-1returnsignals# 使用示例signals=rule_based_strategy(features)print(f"买入信号数:{(signals==1).sum()}")print(f"卖出信号数:{(signals==-1).sum()}")

6.2 基于机器学习的策略

fromsklearn.ensembleimportRandomForestClassifierfromsklearn.model_selectionimporttrain_test_splitdefml_based_strategy(features,target):"""基于机器学习的策略"""# 创建标签(买入1,卖出-1,持有0)y=pd.Series(0,index=target.index)y[target>0.01]=1# 买入y[target<-0.01]=-1# 卖出# 准备数据valid_idx=~(features.isnull().any(axis=1)|y.isnull())X=features[valid_idx]y_clean=y[valid_idx]# 划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y_clean,test_size=0.2,shuffle=False)# 训练模型model=RandomForestClassifier(n_estimators=100,random_state=42)model.fit(X_train,y_train)# 预测y_pred=model.predict(X_test)# 评估fromsklearn.metricsimportaccuracy_score accuracy=accuracy_score(y_test,y_pred)print(f"模型准确率:{accuracy:.4f}")returnmodel# 使用示例target=klines['close'].pct_change(1).shift(-1)model=ml_based_strategy(features,target)

七、策略验证

7.1 回测框架

defbacktest_strategy(klines,signals,initial_capital=100000):"""策略回测"""capital=initial_capital position=0trades=[]foriinrange(1,len(klines)):signal=signals.iloc[i]price=klines['close'].iloc[i]prev_price=klines['close'].iloc[i-1]# 执行交易ifsignal==1andposition==0:# 买入position=1entry_price=priceelifsignal==-1andposition>0:# 卖出pnl=(price-entry_price)/entry_price capital*=(1+pnl)trades.append({'entry':entry_price,'exit':price,'pnl':pnl})position=0# 计算浮动盈亏ifposition>0:unrealized_pnl=(price-entry_price)/entry_priceelse:unrealized_pnl=0# 计算收益total_return=(capital-initial_capital)/initial_capital win_rate=len([tfortintradesift['pnl']>0])/len(trades)iftradeselse0return{'total_return':total_return,'win_rate':win_rate,'trades':trades}# 使用示例signals=rule_based_strategy(features)results=backtest_strategy(klines,signals)print(f"总收益率:{results['total_return']:.2%}")print(f"胜率:{results['win_rate']:.2%}")

八、总结

8.1 数据到策略流程

步骤说明
数据获取获取高质量数据
数据探索了解数据特征
特征工程创建有效特征
策略开发开发交易策略
策略验证回测验证策略

8.2 注意事项

  1. 数据质量- 确保数据质量
  2. 特征选择- 选择有效特征
  3. 过拟合- 避免过拟合
  4. 样本外验证- 使用样本外数据验证

免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。

更多资源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:49:21

一键部署!万象熔炉Anything XL本地图像生成工具保姆级教程

一键部署&#xff01;万象熔炉Anything XL本地图像生成工具保姆级教程 你是否也经历过&#xff1a;想本地跑一个高质量二次元图像生成工具&#xff0c;却卡在环境配置、模型下载、显存报错、路径错误的连环坑里&#xff1f;反复重装Python、降级CUDA、手动编译xformers&#x…

作者头像 李华
网站建设 2026/5/1 4:45:58

5分钟搞定!OFA VQA模型镜像快速入门教程

5分钟搞定&#xff01;OFA VQA模型镜像快速入门教程 你有没有试过部署一个视觉问答模型&#xff0c;结果卡在环境配置上一整天&#xff1f;装完CUDA又报错PyTorch版本不匹配&#xff0c;下载模型时网络中断&#xff0c;改了三次requirements.txt还是提示transformers和tokeniz…

作者头像 李华
网站建设 2026/5/1 3:44:33

Banana Vision Studio本地部署指南:离线运行高清拆解生成

Banana Vision Studio本地部署指南&#xff1a;离线运行高清拆解生成 想不想把身边复杂的物品&#xff0c;一键变成那种极具设计感的平铺拆解图&#xff1f;就是那种所有零件整整齐齐摆开&#xff0c;充满工业美学的效果。以前这需要专业的设计师花大量时间&#xff0c;现在&a…

作者头像 李华
网站建设 2026/4/30 16:43:49

零基础玩转Qwen3-Reranker-8B:手把手教你用Gradio调用API

零基础玩转Qwen3-Reranker-8B&#xff1a;手把手教你用Gradio调用API 1. 导语&#xff1a;为什么你需要关注这个重排序模型&#xff1f; 如果你正在搭建一个智能客服系统、企业知识库&#xff0c;或者任何需要从海量文档里精准找到答案的应用&#xff0c;那你一定遇到过这样的…

作者头像 李华
网站建设 2026/5/1 4:45:34

Qwen3-ASR-1.7B语音识别5分钟快速部署教程:小白也能轻松上手

Qwen3-ASR-1.7B语音识别5分钟快速部署教程&#xff1a;小白也能轻松上手 1. 为什么你需要这个语音识别模型&#xff1f; 你有没有遇到过这些场景&#xff1f; 开会录音整理成会议纪要要花两小时&#xff1b; 采访音频转文字靠手动敲&#xff0c;错一个字都要反复核对&#xf…

作者头像 李华