news 2026/4/18 3:35:47

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

作者头像

张小明

前端开发工程师

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/3/24 10:11:27

Qwen3-ForcedAligner-0.6B语音对齐模型5分钟快速上手教程

Qwen3-ForcedAligner-0.6B语音对齐模型5分钟快速上手教程 你是不是遇到过这样的场景&#xff1a;手里有一段音频&#xff0c;还有对应的文字稿&#xff0c;但想把每个字、每个词在音频里的具体位置找出来&#xff0c;却不知道从何下手&#xff1f;比如给视频配字幕、给歌词打时…

作者头像 李华
网站建设 2026/3/16 8:36:24

GTE模型内存优化秘籍:小内存设备也能流畅运行

GTE模型内存优化秘籍&#xff1a;小内存设备也能流畅运行 1. 为什么小内存设备跑不动GTE&#xff1f;真相在这里 你是不是也遇到过这样的情况&#xff1a;下载了GTE中文文本嵌入模型&#xff0c;兴冲冲地在4GB内存的笔记本上启动&#xff0c;结果卡在模型加载阶段&#xff0c…

作者头像 李华
网站建设 2026/4/17 21:12:41

零基础玩转DeerFlow:手把手教你生成专业研究报告

零基础玩转DeerFlow&#xff1a;手把手教你生成专业研究报告 1. 这不是另一个聊天机器人&#xff0c;而是一位能写报告的研究助手 你有没有过这样的经历&#xff1a;需要快速了解一个新领域&#xff0c;比如“2024年国产AI芯片在大模型训练中的实际表现”&#xff0c;却卡在第…

作者头像 李华
网站建设 2026/4/14 9:16:36

一键启动的AI助手:DeepChat使用体验分享

一键启动的AI助手&#xff1a;DeepChat使用体验分享 1. 前言&#xff1a;为什么你需要一个本地AI对话伙伴&#xff1f; 想象一下&#xff0c;你正在处理一份包含敏感信息的商业计划书&#xff0c;或者想和AI探讨一些非常私人的想法。这时候&#xff0c;你可能会犹豫&#xff…

作者头像 李华
网站建设 2026/4/17 16:17:50

PowerPaint-V1新手必看:如何用AI修复老照片

PowerPaint-V1新手必看&#xff1a;如何用AI修复老照片 你是不是也有这样的烦恼&#xff1f;翻看家里的老相册&#xff0c;发现很多珍贵的照片都泛黄了、有折痕&#xff0c;甚至有些地方已经破损。想修复吧&#xff0c;自己不会PS&#xff0c;找专业修图师又太贵。现在好了&am…

作者头像 李华