量化工具|使用 trade-learn 搭建沪深300的机器学习策略

文摘   2024-05-18 18:31   日本  

0 前言

今天,公众号凑备一年的开源项目正式发布了,一年里发生了太多的事情,有欢喜也有悲伤,庆幸地是这个 idea 始终没有夭折。这里也需要感谢公众号量化小分队的协作。

这篇文章属于抛砖引玉,更多的信息请到 trade-learn 的github仓库页面进行阅读:https://github.com/MuuYesen/trade-learn。

1 trade-learn 介绍

trade-learn 是一个基于 alphalens、backtrader、pyfolio 和 quantstats 的机器学习策略研发工具包。它通过资源整合为策略爱好者提供简单易用的策略研究基本流程,并创新性地兼具因果学习算法。

目前提供的功能有因子采集、因子处理、因子评估、因果分析、模型定义和策略回测,同时支持以 html 文件的形式对可视化结果进行保存,方便分享。

trade-learn 支持的可视化结果:

trade-learn 的主要特性:

  1. 内嵌美国量化交易平台 quantopian 开源的策略研发组件,如 empyrical、alphalens、pyfolio 工具包。
  2. 提供「雅虎财经」的股票行情,以及相应的因子计算公式,包括 alpha101 和 alpha191 因子集合。
  3. 提供「通达信交易软件」的股票行情,以及配套的 30 个经验证的技术指标 tdx30,可直接对标通达信平台使用。
  4. 提供「因果图构建」和「因果特征选择」算法,扩展 gplearn 的函数库,实现面向时序数据进行「特征衍生」。
  5. 提供「探索性分析」和「最优模型选择」工具,迅速预览数据集的规律,以及常见模型在数据集的性能表现。
  6. 裁剪 backtrader 回测框架,减少不必要的依赖安装,优化回测结果至 html 页面展示,拥有更友好的可视化互动。
  7. 交易策略使用信号驱动,提供多个不同类型的策略模板,快速搭建相应策略回测,目前支持投机策略和投资组合策略。
  8. 整个策略搭建过程,除了模型定义外,无需再引入其余第三方包,形成机器学习策略搭建的流程闭环。

2 简单的使用模板

trade-learn 采用信号驱动的设计思路,用户只需要提供必要的买卖信号序列,便可以直接套用工具包提供的策略模板进行回测分析,实现一步回测。目前支持单标的投机策略和投资组合的基金策略。

from tradelearn.trader.signal import Signal
from tradelearn.strategy.backtest.single import LongBacktest

# 数据获取
raw_data, base_line = "标的行情数据""基准行情数据"

# 定义回测起始日期和结束日期
bt_begin_date, bt_end_date = "回测的开始日期""回测的结束日期"

# 定义信号类 -- 用户自定义
class Example(Signal):

    def __init__(self, stockid, raw_data, bt_begin_date, bt_end_date, param_dict):
        signal_df = "计算出来的信号序列,含有 True、False 和 np.NAN 三种值,同时将日期设置成索引"
        
        self.set_signal(signal_df)

# 信号类参数字典
param_dict = {'fea_list'"用于发出信号的变量名称集合"}

# 运行回测
res = LongBacktest.run(Example, param_dict, raw_data, base_line, bt_begin_date, bt_end_date)

3 基于沪深300的机器学习策略

在这里,我们简单使用 trade-learn 来快速评估随机森林模型对沪深300基金策略搭建的影响。

同样的,我们需要先定义信号类,它要求继承 trade-learn 提供的 Signal 类,并在 “__init__” 方法中完成我们的信号计算和发出的代码。

from tradelearn.trader.signal import Signal
from sklearn.ensemble import RandomForestClassifier

class RandomForest(Signal): # 定义随机森林指标类,并使用滚动预测的方式得到交易信号

    model_dict = {} # 模型字典,用于存储每年的模型权重

    def __init__(self, stockid, raw_data, bt_begin_date, bt_end_date, param_dict):
        fea_list = param_dict['fea_list']

        if not RandomForest.model_dict:
            
            # 构建随机森林模型并保存到模型字典中
            for date in pd.date_range(start=bt_begin_date, end=bt_end_date, freq='12MS'):
                bt_train_data = raw_data.query(f"date >= '{date - relativedelta(months=12 * 3)}' and date < '{date}'")
                bt_x_train, bt_y_train = bt_train_data[fea_list], bt_train_data['label']

                model = RandomForestClassifier(random_state=42, n_jobs=-1)
                model.fit(bt_x_train, bt_y_train)
                RandomForest.model_dict[date.year] = model

        # 使用当年的模型进行预测,模拟实际生产场景
        indi_df = None
        for date in pd.date_range(start=bt_begin_date, end=bt_end_date, freq='12MS'):
            pos_data = raw_data.query(f"code == '{stockid}' and date >= '{date}' and date < '{date + relativedelta(months=12 * 1)}'")
            bt_x_test = pos_data.set_index(['date'])[fea_list]
            if bt_x_test.empty: # 如果当年股票数据为空,则信号序列为None
                pre_proba = None
            else:
                pre_proba = RandomForest.model_dict[date.year].predict_proba(bt_x_test)[:, 1]
            indi_df = pd.concat([indi_df, pd.DataFrame(pre_proba, index=pos_data['date'])])

        self.set_signal(indi_df)

在定义完信号类后,用户就无需再进行额外操作。

下面是主函数的代码,其中行情数据都可由工具包自带的 Query 类来获取,因为获取后对数据进行了预处理,实际是读取本地csv文件,这里就不展示了。

from tradelearn.strategy.backtest.fund import LongBacktest
from tradelearn.strategy.evaluate import Evaluate

import pandas as pd

# 定义数据起始日期和结束日期
tn_begin_date = '2017-01-01'
tn_end_date = '2022-06-22'

baseline = "获取沪深300行情数据,区间要求在[tn_begin_date, tn_end_date]"
rawdata = "获取沪深300成分股行情数据,区间要求在[tn_begin_date, tn_end_date]" 

# 特征列表,可以是去除标签、代码和日期之后的变量集合
param_dict = {'fea_list': fea_list}

# 定义回测起始日期和结束日期
bt_begin_date = '2020-01-01'
bt_end_date = '2022-06-22'   

res = LongBacktest.run(RandomForest, param_dict, rawdata, baseline, bt_begin_date, bt_end_date)
Evaluate.analysis_report(res, baseline, engine='quantstats')

可以看到,整个策略搭建的流程是非常的简单明了。

trade-learn 还有诸多功能尚未讲述,因为篇幅就不再进行补充了。欢迎到我们 trade-learn 的github仓库页面进行阅读更多案例,记得 star!

github仓库页面:https://github.com/MuuYesen/trade-learn


知守溪的收纳屋
存放觉得有用的文章。关键词:金融量化、因子选择、因果推断、可解释性、人工智能
 最新文章