功能与作用概述
本代码实现了一种基于集成学习的长短期记忆网络(LSTM)量化交易策略,通过融合多个不同参数配置的LSTM模型来提升交易预测的准确性。核心功能包括:数据预处理、多模型训练、集成预测和交易信号生成。该策略能够有效捕捉金融市场中的非线性时序特征,降低单一模型过拟合风险,提高预测稳定性。主要作用是为量化交易者提供更可靠的买卖信号,辅助决策制定。潜在风险在于模型复杂度增加可能导致计算资源消耗较大,且历史表现不代表未来收益,需结合风险管理措施使用。
集成学习框架设计
多元输入架构实现
集成学习的核心在于构建具有差异性的基学习器集合。采用多元输入策略,为每个LSTM子模型分配不同的特征组合和超参数配置。具体实现中,主数据管道会将标准化后的市场数据(开盘价、收盘价、最高价、最低价、成交量等)动态分发给各子模型,同时允许每个子模型独立选择其关注的特征子集。
python
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.model_selection import train_test_split
class MultiInputEnsemble:
def __init__(self, n_models=5, input_shape=(60, 5)):
self.n_models = n_models
self.input_shape = input_shape
self.models = []
self.scalers = [StandardScaler() for _ in range(n_models)]
def create_model(self, units=50, dropout_rate=0.2, learning_rate=0.001):
model = Sequential([
LSTM(units, return_sequences=True, input_shape=self.input_shape),
Dropout(dropout_rate),
LSTM(units//2),
Dropout(dropout_rate),
Dense(1, activation='sigmoid')
])
model.compile(optimizer=Adam(learning_rate=learning_rate),
loss='binary_crossentropy',
metrics=['accuracy'])
return model
差异化建模策略
为确保集成效果,各子模型需在以下维度形成差异:隐藏层单元数量(40-80)、dropout率(0.1-0.3)、学习率(0.0005-0.002)以及特征权重分布。这种多样性使得每个模型能从不同角度捕捉市场模式,减少共同误差。
数据准备与特征工程
时间序列处理流程
原始行情数据首先经过缺失值处理,然后进行对数收益率转换以稳定方差。窗口化处理将连续价格转换为包含技术指标的特征矩阵,典型窗口长度设为60个交易日。标准化环节针对不同模型的需求分别执行,确保各模型接收适合其架构的数据尺度。
python
def prepare_time_series_data(price_data, window_size=60):
# 计算对数收益率
price_data['log_return'] = np.log(price_data['close'] / price_data['close'].shift(1))
# 创建滞后特征
features = []
for i in range(window_size):
features.append(price_data['log_return'].shift(i).rename(f'lag_{i}'))
# 添加技术指标
features.append(price_data['close'].rolling(window=window_size).mean().rename('ma_60'))
features.append(price_data['volume'].rolling(window=20).std().rename('vol_20'))
# 合并特征并去除NaN
feature_df = pd.concat(features, axis=1).dropna()
# 创建目标变量(未来N日涨跌)
feature_df['target'] = (price_data['close'].shift(-5) > price_data['close']).astype(int)
feature_df = feature_df.dropna()
return feature_df.values[:, :-1], feature_df['target'].values
多元输入特征体系
特征矩阵包含五大类信息:基础价格变动(滞后项)、移动平均线、波动率指标、成交量变化和动量因子。各子模型可自主选择特征子集,例如模型A可能侧重价格趋势,而模型B更关注成交量异动。这种选择性注意力机制增强了模型对特定市场状态的敏感度。
模型训练与集成策略
分布式训练方案
每个LSTM子模型在独立的训练过程中使用专属的超参数组合。训练采用早停法防止过拟合,验证集比例设为15%。关键创新点在于引入"模型间正交性约束",即强制各模型的损失函数梯度方向保持一定夹角,避免冗余学习。
python
def train_ensemble_models(X_train, y_train, X_val, y_val, n_models=5):
ensemble = MultiInputEnsemble(n_models)
history_list = []
for i in range(n_models):
# 随机采样超参数组合
units = np.random.randint(40, 81)
dropout = np.random.uniform(0.1, 0.3)
lr = np.random.choice([0.0005, 0.001, 0.002])
# 创建并训练模型
model = ensemble.create_model(units=units, dropout_rate=dropout, learning_rate=lr)
# 数据标准化(按模型单独处理)
X_scaled = ensemble.scalers[i].fit_transform(X_train.reshape(-1, X_train.shape[-1])).reshape(X_train.shape)
# 训练过程
history = model.fit(
X_scaled, y_train,
validation_data=(X_val, y_val),
epochs=100,
batch_size=32,
callbacks=[EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)],
verbose=0
)
ensemble.models.append(model)
history_list.append(history)
return ensemble, history_list
概率加权集成方法
预测阶段采用动态权重调整机制,根据近期模型表现自动更新集成权重。基础权重由各模型在验证集上的AUC值决定,随后引入衰减因子使权重随时间推移逐步向长期平均回归。这种机制平衡了最新性能与历史稳定性。
python
class ProbabilityWeightedEnsemble:
def __init__(self, base_models, decay_factor=0.95):
self.models = base_models
self.decay_factor = decay_factor
self.performance_metrics = {i: {'auc': 0.5, 'weight': 1/len(base_models)} for i in range(len(base_models))}
def update_weights(self, new_auc_scores):
# 指数移动平均更新权重
for i, auc in enumerate(new_auc_scores):
self.performance_metrics[i]['auc'] = self.decay_factor * self.performance_metrics[i]['auc'] + (1 - self.decay_factor) * auc
# 归一化权重
total_weight = sum(m['auc'] for m in self.performance_metrics.values())
for m in self.performance_metrics.values():
m['weight'] = m['auc'] / total_weight
def predict(self, X):
# 收集所有模型的概率输出
predictions = []
for model in self.models:
pred = model.predict(X, verbose=0)
predictions.append(pred)
# 计算加权平均概率
weights = [self.performance_metrics[i]['weight'] for i in range(len(self.models))]
weighted_pred = np.average(predictions, axis=0, weights=weights)
return (weighted_pred > 0.5).astype(int)
交易策略实施
信号生成逻辑
集成模型的输出转化为交易信号遵循严格规则:当加权预测概率超过阈值(默认0.55)时产生买入信号,低于阈值时平仓。持仓期间设置动态止损位(最近低点下方2%),止盈位随价格上涨阶梯式上调。资金管理采用固定比率法,每次交易风险暴露不超过账户余额的2%。
python
def generate_trading_signals(predictions, initial_balance=100000, risk_per_trade=0.02, stop_loss=0.02, take_profit=[0.05, 0.1, 0.15]):
signals = pd.DataFrame(index=predictions.index)
signals['prediction'] = predictions
signals['position'] = 0 # 0表示空仓,1表示多头
# 初始化账户状态
cash = initial_balance
position = 0
entry_price = 0
max_drawdown = 0
for i in signals.index:
current_price = ... # 获取当前价格数据
# 检查是否需要止损/止盈
if position == 1:
profit_ratio = (current_price - entry_price) / entry_price
if profit_ratio >= max(take_profit) or (current_price <= entry_price * (1 - stop_loss)):
# 平仓
cash += position * current_price
position = 0
signals.loc[i, 'action'] = 'close'
# 生成新信号
if signals.loc[i, 'prediction'] > 0.55 and position == 0:
# 开仓
risk_amount = cash * risk_per_trade
position_size = risk_amount / (current_price * 0.01) # 假设止损空间为1%
position = position_size
entry_price = current_price
cash -= position * entry_price
signals.loc[i, 'action'] = 'buy'
signals.loc[i, 'entry_price'] = entry_price
# 记录仓位状态
signals.loc[i, 'cash'] = cash
signals.loc[i, 'position'] = position
signals.loc[i, 'portfolio_value'] = cash + position * current_price
return signals