基于机器学习的多因子选股预测模型全流程研究(包含数据获取与处理)”
基于机器学习的多因子选股预测模型研究全流程包含数据 1、数据获取 2、数据预处理 3、特征选择 4、划分训练集和测试集 5、机器学习模型构建随机森林、线性回归、支撑向量机 6、预测未来走势 7、选股构造策略 8、收益曲线可视化绘制 9、模型评估累积收益率、夏普比率、年化收益率等最近在搞量化交易的朋友应该都听说过机器学习选股。这玩意儿听着高大上实际操作起来倒也没那么玄乎。今天咱们就用Python手把手走一遍全流程从数据到策略落地中间踩过的坑和发现的宝藏都会掏出来分享。数据获取就像买菜别急着上模型没数据都是白搭。咱们用Tushare搞点沪深300成分股的历史数据需要先注册获取tokenimport tushare as ts pro ts.pro_api(你的token) df pro.daily(ts_code000300.SH, start_date20180101) print(df[[trade_date,close]].head())这里有个坑金融数据经常有复权问题。记得用复权因子处理收盘价不然哪天股票拆分能让你策略翻车。别问我怎么知道的都是泪。数据预处理才是真·体力活拿到的原始数据可能长这样df.fillna(methodffill, inplaceTrue) # 离群值处理 from scipy import stats df df[(np.abs(stats.zscore(df[turnover_rate])) 3)]碰到停牌数据直接向前填充成交量突变的直接当异常值干掉。这里有个骚操作用3σ原则处理异常值比简单截尾靠谱能保留更多真实波动信息。特征选择别当无头苍蝇因子不是越多越好。试过用随机森林看特征重要性结果发现from sklearn.ensemble import RandomForestRegressor rf RandomForestRegressor() rf.fit(X_train, y_train) importance pd.Series(rf.feature_importances_, indexX.columns) print(importance.nlargest(5))结果发现市盈率、换手率、20日波动率这几个因子吊打其他花里胡哨的指标。重点来了特征选择一定要结合业务逻辑MACD这种技术指标在机器学习模型里可能还不如简单动量因子好用。模型实战翻车现场基于机器学习的多因子选股预测模型研究全流程包含数据 1、数据获取 2、数据预处理 3、特征选择 4、划分训练集和测试集 5、机器学习模型构建随机森林、线性回归、支撑向量机 6、预测未来走势 7、选股构造策略 8、收益曲线可视化绘制 9、模型评估累积收益率、夏普比率、年化收益率等试了三个模型对比效果from sklearn.svm import SVR from sklearn.linear_model import LinearRegression # 线性回归 lr LinearRegression().fit(X_train, y_train) # 随机森林 rf RandomForestRegressor(n_estimators100, max_depth5) # SVM记得先标准化数据 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) svr SVR(kernelrbf).fit(X_train_scaled, y_train)实测发现随机森林在非线性的股票数据上表现最好但SVM调参调到怀疑人生。重点提示线性模型在因子共线性严重时容易翻车记得先用VIF检验。策略落地才是真章模型预测完不是结束怎么转换成交易信号才是关键# 生成预测收益率 test_df[pred_return] model.predict(X_test) # 每周调仓选前10%股票 selected_stocks test_df.groupby(trade_date).apply( lambda x: x.nlargest(int(len(x)*0.1), pred_return))这里有个反直觉的点预测收益率绝对值不重要排序才是核心。实盘时记得控制换手率高频调仓的手续费能吃掉大部分收益。收益可视化暴击心灵最后用pyecharts画收益曲线比matplotlib酷炫多了from pyecharts.charts import Line line Line() line.add_xaxis(dates) line.add_yaxis(策略收益, strategy_returns) line.add_yaxis(沪深300, benchmark_returns) line.render(收益对比.html)当看到自己策略的曲线稳稳跑赢指数那种成就感...然后下一秒就发现过拟合了手动狗头。所以务必做滚动回测别掉进单一时间段的陷阱。模型评估别只看收益率夏普比率计算要注意无风险利率的选择risk_free_rate 0.03 # 假设3%无风险收益 excess_returns returns - risk_free_rate/252 sharpe_ratio np.sqrt(252) * excess_returns.mean() / excess_returns.std()年化收益计算有个坑别直接用总收益率折算要用几何平均。最大回撤计算记得用expanding().max()不然会低估风险。走完整个流程最大的感悟机器学习在量化中的应用七分靠数据两分靠特征一分靠模型。下次可以试试把新闻情绪数据加进因子说不定有惊喜——当然也可能是惊吓。