基于机器学习的多因子选股预测模型研究(全流程,包含数据) 1、数据获取 2、数据预处理 3、特征选择 4、划分训练集和测试集 5、机器学习模型构建(随机森林、线性回归、支撑向量机) 6、预测未来走势 7、选股+构造策略 8、收益曲线可视化绘制 9、模型评估累积收益率、夏普比率、年化收益率等
最近在搞量化交易的朋友应该都听说过机器学习选股。这玩意儿听着高大上,实际操作起来倒也没那么玄乎。今天咱们就用Python手把手走一遍全流程,从数据到策略落地,中间踩过的坑和发现的宝藏都会掏出来分享。
数据获取就像买菜
别急着上模型,没数据都是白搭。咱们用Tushare搞点沪深300成分股的历史数据(需要先注册获取token):
import tushare as ts pro = ts.pro_api('你的token') df = pro.daily(ts_code='000300.SH', start_date='20180101') print(df[['trade_date','close']].head())这里有个坑:金融数据经常有复权问题。记得用复权因子处理收盘价,不然哪天股票拆分能让你策略翻车。别问我怎么知道的,都是泪。
数据预处理才是真·体力活
拿到的原始数据可能长这样:
df.fillna(method='ffill', inplace=True) # 离群值处理 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_, index=X.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_estimators=100, max_depth=5) # SVM记得先标准化数据 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) svr = SVR(kernel='rbf').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(),不然会低估风险。
走完整个流程最大的感悟:机器学习在量化中的应用,七分靠数据,两分靠特征,一分靠模型。下次可以试试把新闻情绪数据加进因子,说不定有惊喜——当然,也可能是惊吓。