构建预测Max Sharpe Ratio股票组合配置的Neural Network:训练数据难题
构建股票权重预测神经网络:训练数据创建指南
核心前提:明确权重的定义
首先得敲定你要输出的「单只股票weights」具体指什么——是组合中的持仓占比、对应未来收益的优先级系数,还是其他业务逻辑下的权重?这直接决定训练标签的生成规则。
训练数据构建具体步骤
1. 生成训练标签(Label)
- 如果目标是未来最优持仓权重:可以用后续N天的累计收益率反向推导,比如把未来5天的收益率归一化后作为权重标签;或是通过组合优化(如夏普率最大化)计算出对应时间段的最优持仓权重,以此作为标签。
- 如果是技术指标驱动的信号权重:可定义为未来涨跌的强弱程度,比如用未来3天涨跌幅与全市场平均涨跌幅的比值作为标签。
2. 输入特征与标签的时间对齐
- 用滑动窗口法构建样本:取第t天及之前的所有特征(收盘价、MACD、RSI等)作为输入X,对应第t+1到t+N天的目标权重作为标签y。
- 严格规避数据泄露:所有特征必须是t天及之前可获取的,不能用未来数据计算当前技术指标。
3. 数据预处理
- 特征归一化:对价格、技术指标等输入特征用
StandardScaler或MinMaxScaler做标准化处理,消除量纲差异对模型的影响。 - 标签归一化:如果权重是百分比,可缩放到[0,1]区间;若是组合权重,需确保标签总和符合业务逻辑(比如单只股票权重无需总和为1,组合权重则需要)。
4. 数据集划分
- 按时间顺序划分:不要随机打乱数据,用前80%作为训练集、中间10%作为验证集、最后10%作为测试集,模拟真实的时间序列预测场景。
- 处理样本不平衡:若某类权重区间的样本过少,可采用过采样或加权损失函数调整模型训练的侧重。
代码示例(伪代码)
import pandas as pd from sklearn.preprocessing import MinMaxScaler # 假设已生成包含特征的数据集,列包括'close', 'macd', 'rsi'等 df = pd.read_csv('stock_data_with_indicators.csv') # 1. 生成标签:以未来5天累计收益率归一化作为权重标签 df['future_5d_return'] = df['close'].shift(-5) / df['close'] - 1 df['weight_label'] = df['future_5d_return'] / df['future_5d_return'].abs().max() # 2. 滑动窗口构建样本(用过去20天特征预测当前权重标签) window_size = 20 X, y = [], [] for i in range(window_size, len(df)-5): X.append(df.iloc[i-window_size:i][['close', 'macd', 'rsi']].values) y.append(df.iloc[i]['weight_label']) # 3. 特征归一化 scaler = MinMaxScaler() X = scaler.fit_transform(X.reshape(-1, window_size*3)).reshape(-1, window_size, 3) # 4. 划分数据集 train_size = int(0.8 * len(X)) X_train, y_train = X[:train_size], y[:train_size] X_val, y_val = X[train_size:int(0.9*len(X))], y[train_size:int(0.9*len(X))] X_test, y_test = X[int(0.9*len(X)):], y[int(0.9*len(X)):]
后续迭代方向
- 训练模型后,验证测试集上权重预测结果与实际收益的相关性,调整标签定义或滑动窗口大小。
- 若为组合权重场景,可回测模型生成的权重组合,对比基准收益(如大盘指数)评估效果。
内容的提问来源于stack exchange,提问作者Evank
相关产品推荐
相关产品推荐

