金融机器学习工具包:我的常用库与使用技巧分享
一、数据处理核心工具
Pandas进阶技巧
# 金融时间序列滑窗处理(含未来数据防护)
import pandas as pd
import numpy as np
# 生成含停牌日的股票数据(2025-03-01为停牌日)
dates = pd.date_range('2025-02-25', periods=5, freq='D')
data = {'close': [100, 102, np.nan, 105, 108]}
df = pd.DataFrame(data, index=dates)
# 停牌日处理:前复权填充+成交量置零
df['close'] = df['close'].ffill()
df['volume'] = [1e6, 1.2e6, 0, 9e5, 1.1e6]
# 避免未来数据泄露的20日均线计算
df['ma20'] = df['close'].shift(1).rolling(20, min_periods=5).mean()
技巧:
- 使用
shift(1)确保计算时不会包含当前K线数据 - 通过
min_periods参数处理新股上市初期的数据不足问题
二、技术指标计算利器
TA-Lib实战应用
import talib
from sklearn.preprocessing import RobustScaler
# 计算MACD指标(处理极端值)
df['macd'], df['signal'], _ = talib.MACD(df['close'],
fastperiod=12,
slowperiod=26,
signalperiod=9)
# 使用鲁棒标准化(避免离群值影响)
scaler = RobustScaler()
df[['macd_scaled', 'signal_scaled']] = scaler.fit_transform(df[['macd', 'signal']])
避坑指南:
- 科创板股票需调整
fastperiod参数至更短周期(建议8-10) - 指标计算前务必进行流动性过滤(剔除日成交额<5000万的标的)
三、机器学习建模框架
特征工程与模型训练
from sklearn.pipeline import Pipeline
from sklearn.ensemble import StackingClassifier
from xgboost import XGBClassifier
# 构建特征工程流水线
feature_pipe = Pipeline([
('fillna', SimpleImputer(strategy='median')),
('zscore', StandardScaler())
])
# 堆叠模型架构(XGBoost+逻辑回归)
estimators = [
('xgb', XGBClassifier(max_depth=3,
learning_rate=0.1,
subsample=0.8)),
('lr', LogisticRegression(penalty='l1',
solver='saga'))
]
model = StackingClassifier(estimators=estimators,
final_estimator=RandomForestClassifier())
创新应用:
- 在特征工程阶段加入turbulence risk factor(市场波动率因子)
- 使用SHAP值进行特征重要性动态监控
四、回测框架选型
Backtrader高级用法
import backtrader as bt
class MLStrategy(bt.Strategy):
params = (
('lookback', 20), # 特征计算窗口
('probability_threshold', 0.65) # 模型预测阈值
)
def __init__(self):
self.model = load_pretrained_model() # 加载预训练模型
self.dataclose = self.datas[0].close
def next(self):
# 生成特征向量(滞后数据)
features = np.array([
self.dataclose.get(size=self.p.lookback),
bt.indicators.RSI(self.data, period=14).get(size=self.p.lookback)
]).T
# 模型实时预测
prob = self.model.predict_proba(features[-1].reshape(1, -1))[0][1]
if prob > self.p.probability_threshold and not self.position:
self.order = self.buy(size=1000)
elif prob < 0.35 and self.position:
self.order = self.sell(size=1000)
性能优化:
- 使用
numexpr加速Pandas运算(性能提升3-5倍) - 高频场景下启用
preload=True和runonce=True参数
五、前沿工具探索
QuantLib衍生品定价
import QuantLib as ql
# 构建波动率曲面(2025年3月数据)
calendar = ql.China()
calculation_date = ql.Date(19, 3, 2025)
ql.Settings.instance().evaluationDate = calculation_date
vol_surface = ql.BlackVarianceSurface(
calculation_date,
calendar,
[ql.Date(19,6,2025), ql.Date(19,12,2025)],
[0.8, 1.0, 1.2],
[[0.25, 0.23], [0.21, 0.19], [0.18, 0.16]],
ql.Actual365Fixed()
)
# 计算欧式看涨期权价格
option = ql.EuropeanOption(
ql.PlainVanillaPayoff(ql.Option.Call, 100),
ql.EuropeanExercise(ql.Date(19,6,2025))
)
process = ql.BlackScholesProcess(
ql.QuoteHandle(ql.SimpleQuote(105)),
ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, 0.03, ql.Actual365Fixed())),
ql.BlackVolTermStructureHandle(vol_surface)
)
engine = ql.AnalyticEuropeanEngine(process)
option.setPricingEngine(engine)
print(f"期权理论价格: {option.NPV():.2f}")
创新点:
- 整合机器学习预测的隐含波动率
- 构建基于LSTM波动率预测的混合定价模型
六、工具链协同架构
graph TD
A[数据获取] -->|AKShare| B[清洗加工]
B -->|Pandas| C[特征工程]
C -->|TA-Lib/Numpy| D[模型训练]
D -->|XGBoost/Scikit-learn| E[回测验证]
E -->|Backtrader| F[实盘部署]
F -->|QuantLib| G[风险管理]
部署经验:
- 开发环境与生产环境使用统一Docker镜像
- 建立特征版本控制系统(Feature Store)
- 使用Prometheus+Grafana监控模型漂移
参考书籍:《机器学习与量化投资实战(2025修订版)》