第四章:机器学习基础与交易策略
说实话,很多人一听到「机器学习」就觉得头大。我刚开始接触时也一样,觉得这玩意儿离量化交易太远了。但后来我发现,其实机器学习在币圈的应用,比你想象的要接地气得多。
这一章,我们就来聊聊监督学习、无监督学习,以及怎么搭一个靠谱的回测框架。嗯,都是我自己踩过坑之后总结出来的经验。
4.1 监督学习:分类与回归
监督学习,说白了就是「给答案,学规律」。你给模型一堆历史数据,告诉它哪些是涨、哪些是跌,它自己就能学会判断。
4.1.1 分类任务:涨还是跌?
我最常用的分类场景就是预测未来1小时的涨跌方向。比如,把价格涨超过0.5%标记为1,跌超过0.5%标记为0,横盘就扔掉。
代码示例(逻辑回归):
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 假设 X 是特征矩阵,y 是标签(0或1)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测概率
y_prob = model.predict_proba(X_test)[:, 1]
4.1.2 回归任务:涨多少?
分类告诉你方向,回归告诉你幅度。我个人习惯用回归模型预测未来N根K线的收益率。
举个例子,用随机森林做回归:
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=100, max_depth=5)
rf.fit(X_train, y_train)
# 预测收益率
pred_return = rf.predict(X_test)
4.2 无监督学习:聚类
无监督学习不需要标签。它自己找规律,说白了就是「让数据自己说话」。
4.2.1 K-Means 聚类:发现市场状态
我常用K-Means来识别市场状态。比如,把波动率、成交量、价格变化率这些特征丢进去,聚类出「震荡市」、「趋势市」、「极端行情」等状态。
from sklearn.cluster import KMeans
# 特征:波动率、成交量变化、价格变化率
features = ['volatility', 'volume_change', 'price_change']
X_cluster = data[features]
kmeans = KMeans(n_clusters=3, random_state=42)
data['market_state'] = kmeans.fit_predict(X_cluster)
你想想看,不同市场状态下,策略参数应该不一样。震荡市用均值回归,趋势市用动量策略。这个思路,我用了好几年,效果一直不错。
4.3 模型评估:别被回测骗了
模型评估这块,我吃过太多亏了。曾经有个模型回测夏普比率3.5,我兴奋得直接上实盘,结果一个月亏了20%。
为什么会这样?因为回测和实盘之间存在巨大的鸿沟。
4.3.1 常用评估指标
| 指标 | 说明 | 我的建议 |
|---|---|---|
| 准确率 | 预测正确的比例 | 别只看这个,币圈涨跌不平衡 |
| 精确率/召回率 | 看多信号的可靠性 | 我一般要求精确率 > 55% |
| F1分数 | 精确率和召回率的调和平均 | 比准确率靠谱得多 |
| 夏普比率 | 风险调整后收益 | 回测夏普 > 2 才考虑实盘 |
| 最大回撤 | 最惨的时候亏多少 | 我个人不能接受超过15% |
4.3.2 过拟合检测
我有个简单粗暴的方法:把数据按时间分成三段——训练集、验证集、测试集。如果训练集和测试集表现差距很大,那就是过拟合了。
# 时间序列分割,不能用随机打乱
train = data[:'2023-06']
val = data['2023-06':'2023-12']
test = data['2024-01':]
4.4 回测框架搭建
回测框架,说白了就是模拟交易环境,看看你的策略到底行不行。我建议自己搭一个轻量级的框架,别用太重的第三方库。
4.4.1 框架核心组件
一个完整的回测框架,至少需要这几个模块:
- 数据模块:获取K线数据、处理缺失值、计算特征
- 策略模块:根据信号生成买卖指令
- 风控模块:仓位管理、止损止盈
- 绩效模块:计算收益率、回撤、夏普比率
4.4.2 简易回测代码
class BacktestEngine:
def __init__(self, data, initial_capital=10000):
self.data = data
self.capital = initial_capital
self.position = 0
self.trades = []
def run(self, signal_col='signal'):
for i in range(len(self.data)):
signal = self.data.iloc[i][signal_col]
price = self.data.iloc[i]['close']
if signal == 1 and self.position == 0:
# 开多
self.position = self.capital / price
self.capital = 0
self.trades.append(('buy', price, i))
elif signal == -1 and self.position > 0:
# 平多
self.capital = self.position * price
self.position = 0
self.trades.append(('sell', price, i))
# 计算最终收益
final_value = self.capital + self.position * self.data.iloc[-1]['close']
return final_value
4.5 知识体系总览
下面这张图,是我自己整理的机器学习交易策略知识体系。你看一眼,就能明白这一章讲了什么。
嗯,这一章的内容就到这里。机器学习在币圈的应用,说白了就是「用历史规律预测未来」。但记住,历史不会简单重复,模型需要持续迭代。
我个人建议,先从最简单的逻辑回归和K-Means开始,跑通一个完整的回测流程。等你有感觉了,再上更复杂的模型。别一上来就搞深度学习,容易把自己搞懵。