数据STUDIO

利用滚动随机森林策略进行比特币方向预测

Image

Image

预测比特币等波动性资产的每周走势是量化金融领域的一大挑战。虽然每日价格波动看似随机,但分析长期趋势或许能带来预测优势。本文中云朵君介绍了一种基于 Python 的策略,该策略使用随机森林分类器和滚动预测方法来预测比特币价格在未来七天会上涨还是下跌。

该策略,我们称之为“滚动随机森林 BTC-USD 方向预测”,利用一组预先选定的技术指标。我们将介绍其核心概念、代码讲解,并解读历史回测的结果。

1.核心概念

随机森林分类器

随机森林是一种强大的集成学习方法,可用于分类和回归。它的工作原理是构建由许多独立的决策树组成的“森林”。

推荐阅读:

集成算法 | 随机森林分类模型

集成算法 | 随机森林回归模型

工作原理

  • Bagging:它在训练数据的不同随机子集上训练每棵树。
  • 特征随机性:当树做出决策时,它只考虑可用特征的随机子集,这有助于消除树之间的相关性。
  • 多数投票:对于最终预测,模型会汇总所有单个树的输出。这使得整个模型更加稳健,并且不易过度拟合。

滚动预测评估

与简单的训练-测试拆分不同,滚动预测可以更真实地模拟模型在动态市场中的表现。这种方法会定期使用近期数据重新训练模型,并利用这些数据预测近期的未来走势。

具体步骤

  • 定义固定大小的训练窗口(例如,过去 30 天)。
  • 利用该窗口内的数据来训练模型。
  • 对未来某个时间点进行预测(例如,未来 7 天)。
  • 将窗口向前滑动一天。
  • 重复该过程,汇总所有预测以评估整体性能。

2. Python实现

该脚本分为四个主要部分:设置、数据准备、滚动循环和评估。

设置和配置

本节定义了我们策略的核心参数,包括资产、时间范围和模型超参数。

import pandas as pd
import numpy as np
import yfinance as yf
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix)
import warnings
# ... (Other imports) ...
# =======================================
# 配置
# =======================================
TICKER = 'BTC-USD'
START_DATE = '2021-01-01'
PREDICTION_HORIZON = 7 
TRAINING_WINDOW_DAYS = 30 
TOP_FEATURES = [ 
'ROC_10', 'STOCHRSI_d', 'ADX_14', 'STOCHRSI_k', 'RSI_14', 
'STOCH_k', 'ATR_14', 'EMA_20', 'STOCH_d', 'MACD', 
'ULTOSC', 'BB_upper', 'SAR', 'Open_Close', 'MACD_hist'
] 
# ...(随机森林超参数)...

数据加载和准备

使用yfinance下载的数据和其他库来计算技术指标,我们准备了数据集。关键步骤是创建目标变量:如果价格在预测时限天后更高,则返回1,否则返回0。

滚动预测循环

这是该策略的核心。脚本会遍历数据集,滚动地训练和测试模型。至关重要的是,StandardScaler和会RandomForestClassifier在每次循环迭代中重新初始化并拟合,以防止前瞻偏差,并确保模型仅从当前训练窗口中的数据进行学习。

# --- 滚动预测循环 --- 
all_predictions = [] 
all_actuals = [] 
all_probabilities = [] 
# ... (循环设置) ...
for i in range(start_index, end_index): 
# 1. 提取当前训练和预测窗口的数据
    X_train_window = X_all_features.iloc[train_start_idx:train_end_idx] 
    Y_train_window = Y_all.iloc[train_start_idx:train_end_idx] 
    X_predict_point = X_all_features.iloc[[predict_feature_idx]]    # 2. 缩放特征
    scaler = StandardScaler() 
    X_train_scaled = scaler.fit_transform(X_train_window) 
    X_predict_scaled = scaler.transform(X_predict_point)    # 3. 训练和预测
    rf_model = RandomForestClassifier( 
# ... (超参数) ... 
    ) 
    rf_model.fit(X_train_scaled, Y_train_window) 

# 4. 存储结果
    all_predictions.append(rf_model.predict(X_predict_scaled)[0]) 
    all_actuals.append(Y_all.iloc[actual_target_idx]) 
    all_probabilities.append(rf_model.predict_proba(X_predict_scaled)[0, 1]) 
# ... (循环完成) ...

综合评价

循环结束后,汇总结果将用于计算性能指标。这提供了模型在整个测试期间表现的全面概述。

3. 结果与解释

该策略的上次历史运行产生了以下指标:

  • 准确率:~68%(基线为~51%)
  • 准确率:约 69%
  • 召回率:约 68%
  • AUC-ROC:~0.75
  • 混淆矩阵:[[122 57] / [ 61 128]]

这些结果表明,与随机概率相比,该模型在统计上取得了显著的改进。该模型在预测7天走势方面大约有三分之二的正确率。均衡的精确度和召回率得分表明,该模型在识别“上涨”走势方面表现良好,且错误预测数量较少。0.75的AUC表明其能够很好地区分“上涨”和“下跌”走势。

虽然最后结果还不错,但历史表现并不能保证未来的结果。模型的成功取决于所选的特征、超参数以及测试的具体时间段。

Image
Image

4. 局限性和后续步骤

  • 非交易策略:此脚本仅评估预测能力。它不包含真实交易策略的关键组成部分,例如进场/出场信号、追踪止损或风险管理。
  • 未来表现:市场是非平稳的,基于过去数据有效的模型在未来可能不再有效。
  • 进一步开发:对于任何实际应用,都需要进行广泛的测试、参数调整和特征分析。

总而言之,该脚本提供了一个强大的框架,可以使用真实的滚动预测来评估预测信号。历史结果表明,该脚本具有潜在的优势,值得进一步研究,但任何实际应用都需要大量的额外开发,因此本文仅提供一个思路,欢迎大家一起研讨。

Image
🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递ImageImage