一、前言
机器学习在量化交易中的应用越来越广泛。通过机器学习模型,可以从历史数据中学习交易规律,提高策略的预测能力。本文将介绍如何将机器学习应用于期货量化交易。
本文将介绍:
- 机器学习在量化交易中的应用
- 特征工程方法
- 模型训练与验证
- 模型集成方法
- 实盘应用注意事项
二、为什么选择天勤量化(TqSdk)
TqSdk机器学习应用支持:
| 功能 | 说明 |
|---|---|
| 数据获取 | 支持获取高质量历史数据 |
| 数据处理 | pandas/numpy支持特征工程 |
| 模型训练 | 支持与sklearn等库集成 |
| 实时预测 | 支持实时数据预测 |
安装方法:
pipinstalltqsdk pandas numpy scikit-learn三、机器学习基础
3.1 机器学习类型
| 类型 | 说明 | 应用场景 |
|---|---|---|
| 监督学习 | 有标签数据 | 价格预测、信号分类 |
| 无监督学习 | 无标签数据 | 市场状态识别、聚类 |
| 强化学习 | 与环境交互 | 交易决策优化 |
3.2 常用算法
| 算法 | 特点 | 适用场景 |
|---|---|---|
| 线性回归 | 简单、可解释 | 价格预测 |
| 随机森林 | 稳健、抗过拟合 | 特征重要性分析 |
| XGBoost | 性能好、精度高 | 复杂模式识别 |
| SVM | 小样本效果好 | 分类问题 |
四、特征工程
4.1 技术指标特征
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:机器学习特征工程 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuthfromtqsdk.tafuncimportma,macd,rsi,bollimportpandasaspdimportnumpyasnpdefcreate_technical_features(klines):"""创建技术指标特征"""features=pd.DataFrame(index=klines.index)# 均线特征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'])returnfeatures# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2510",3600,500)api.wait_update()features=create_technical_features(klines)print(f"特征数量:{len(features.columns)}")api.close()4.2 价格特征
defcreate_price_features(klines):"""创建价格特征"""features=pd.DataFrame(index=klines.index)# 收益率features['return_1d']=klines['close'].pct_change(1)features['return_5d']=klines['close'].pct_change(5)features['return_20d']=klines['close'].pct_change(20)# 波动率returns=klines['close'].pct_change()features['volatility_5d']=returns.rolling(5).std()features['volatility_20d']=returns.rolling(20).std()# 价格位置high_max=klines['high'].rolling(20).max()low_min=klines['low'].rolling(20).min()features['price_position']=(klines['close']-low_min)/(high_max-low_min)returnfeatures4.3 成交量特征
defcreate_volume_features(klines):"""创建成交量特征"""features=pd.DataFrame(index=klines.index)# 成交量变化features['volume_change']=klines['volume'].pct_change()features['volume_ma_ratio']=klines['volume']/klines['volume'].rolling(20).mean()# 价量关系price_change=klines['close'].pct_change()features['price_volume_corr']=price_change.rolling(20).corr(klines['volume'].pct_change())returnfeatures五、模型训练
5.1 价格预测模型
fromsklearn.ensembleimportRandomForestRegressorfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportmean_squared_error,r2_scoredeftrain_price_prediction_model(klines):"""训练价格预测模型"""# 创建特征technical_features=create_technical_features(klines)price_features=create_price_features(klines)volume_features=create_volume_features(klines)# 合并特征X=pd.concat([technical_features,price_features,volume_features],axis=1)X=X.dropna()# 创建标签(未来收益率)y=klines['close'].pct_change(1).shift(-1)y=y.loc[X.index]# 删除缺失值valid_idx=~(X.isnull().any(axis=1)|y.isnull())X=X[valid_idx]y=y[valid_idx]# 划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,shuffle=False)# 训练模型model=RandomForestRegressor(n_estimators=100,random_state=42)model.fit(X_train,y_train)# 预测y_pred=model.predict(X_test)# 评估mse=mean_squared_error(y_test,y_pred)r2=r2_score(y_test,y_pred)print(f"MSE:{mse:.6f}")print(f"R²:{r2:.4f}")returnmodel# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2510",3600,1000)api.wait_update()model=train_price_prediction_model(klines)api.close()5.2 信号分类模型
fromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportclassification_report,accuracy_scoredeftrain_signal_classification_model(klines):"""训练信号分类模型"""# 创建特征technical_features=create_technical_features(klines)price_features=create_price_features(klines)volume_features=create_volume_features(klines)X=pd.concat([technical_features,price_features,volume_features],axis=1)X=X.dropna()# 创建标签(买入1,卖出-1,持有0)future_return=klines['close'].pct_change(1).shift(-1)y=pd.Series(0,index=future_return.index)y[future_return>0.01]=1# 买入y[future_return<-0.01]=-1# 卖出y=y.loc[X.index]# 删除缺失值valid_idx=~(X.isnull().any(axis=1)|y.isnull())X=X[valid_idx]y=y[valid_idx]# 划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y,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)# 评估accuracy=accuracy_score(y_test,y_pred)print(f"准确率:{accuracy:.4f}")print(classification_report(y_test,y_pred))returnmodel六、模型集成
6.1 模型集成方法
fromsklearn.ensembleimportVotingRegressorfromsklearn.linear_modelimportLinearRegressionfromsklearn.ensembleimportGradientBoostingRegressordefensemble_models(klines):"""模型集成"""# 创建特征和标签technical_features=create_technical_features(klines)price_features=create_price_features(klines)volume_features=create_volume_features(klines)X=pd.concat([technical_features,price_features,volume_features],axis=1)X=X.dropna()y=klines['close'].pct_change(1).shift(-1)y=y.loc[X.index]valid_idx=~(X.isnull().any(axis=1)|y.isnull())X=X[valid_idx]y=y[valid_idx]X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,shuffle=False)# 创建多个模型models=[('rf',RandomForestRegressor(n_estimators=100)),('gb',GradientBoostingRegressor(n_estimators=100)),('lr',LinearRegression())]# 集成模型ensemble=VotingRegressor(models)ensemble.fit(X_train,y_train)# 预测y_pred=ensemble.predict(X_test)# 评估mse=mean_squared_error(y_test,y_pred)print(f"集成模型MSE:{mse:.6f}")returnensemble七、实盘应用
7.1 实时预测
classMLStrategy:"""机器学习策略"""def__init__(self,api,symbol,model):self.api=api self.symbol=symbol self.model=model self.klines=Nonedefget_features(self):"""获取当前特征"""ifself.klinesisNone:self.klines=self.api.get_kline_serial(self.symbol,3600,500)else:self.api.wait_update()# 创建特征technical_features=create_technical_features(self.klines)price_features=create_price_features(self.klines)volume_features=create_volume_features(self.klines)X=pd.concat([technical_features,price_features,volume_features],axis=1)X=X.iloc[[-1]]# 最新特征returnXdefpredict(self):"""预测"""X=self.get_features()# 预测prediction=self.model.predict(X)[0]returnpredictiondefgenerate_signal(self):"""生成交易信号"""prediction=self.predict()ifprediction>0.01:return1# 买入elifprediction<-0.01:return-1# 卖出else:return0# 持有# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))model=train_price_prediction_model(klines)# 预先训练好的模型strategy=MLStrategy(api,"SHFE.rb2510",model)whileTrue:signal=strategy.generate_signal()ifsignal!=0:# 执行交易passapi.wait_update()time.sleep(60)八、注意事项
8.1 过拟合问题
| 问题 | 解决方法 |
|---|---|
| 过拟合 | 使用交叉验证、正则化 |
| 数据泄露 | 避免使用未来数据 |
| 样本外验证 | 使用样本外数据验证 |
8.2 模型更新
defupdate_model(model,new_data,retrain_freq=30):"""定期更新模型"""# 每30天重新训练一次# ...pass九、总结
9.1 机器学习应用要点
| 要点 | 说明 |
|---|---|
| 特征工程 | 创建有效特征 |
| 模型选择 | 选择合适的模型 |
| 过拟合控制 | 避免过拟合 |
| 持续更新 | 定期更新模型 |
9.2 注意事项
- 避免过拟合- 使用交叉验证
- 数据质量- 确保数据质量
- 特征选择- 选择有效特征
- 模型更新- 定期更新模型
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest