量化软件——赫兹MT5使用标签数据的可解释性分解

概述
在本系列的前一篇文章中,我们提到了NHITS模型,其中我们只验证了单个变量输入的收盘价格预测。在这篇文章中,我们将讨论模型的可解释性,以及关于使用多个协变量来预测收盘价格。我们将使用不同的模型NBEATS进行演示,以提供更多的可能性。然而,需要注意的是,本文的重点应该放在模型的可解释性上,并将给出为什么也引入协变量主题的答案。这样你就可以随时使用不同的模型来验证你的想法。当然,这两个模型本质上是高质量的可解释模型,您也可以扩展到其他模型,用我文章中提到的库来验证您的想法。值得一提的是,本系列文章旨在为问题提供解决方案,在直接应用于您的真实交易之前,请仔细考虑,真实交易的实施可能需要更多的参数调整和优化方法,以提供可靠稳定的结果。

关于 NBEATS
该模型已在各种期刊和网站上被广泛引用和解释。然而,为了避免您在不同的网站之间不断穿梭,我决定简单介绍一下这种模型。NBEATS可以处理任何长度的输入和输出序列,并且不依赖于时间序列的特定特征工程或输入缩放。它还可以使用多项式和傅立叶级数作为可解释配置的基函数来模拟趋势和季节分解。此外,该模型采用了对偶残差叠加拓扑,使得每个构建块都有两个残差分支,一个沿着反向预测,另一个沿着正向预测,大大提高了模型的可训练性和可解释性。哇,它看起来非常令人印象深刻!


导入库
没什么好说的,做就行了!

import lightning.pytorch as pl
import os
from lightning.pytorch.callbacks import EarlyStopping,ModelCheckpoint
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pytorch_forecasting import TimeSeriesDataSet,NBeats
from pytorch_forecasting.data import NaNLabelEncoder
from pytorch_forecasting.metrics import MQF2DistributionLoss
from pytorch_forecasting.data.samplers import TimeSynchronizedBatchSampler
from lightning.pytorch.tuner import Tuner
import MetaTrader5 as mt
import warnings
import json


重写 TimeSeriesDataSet 类
没什么好说的,做就行了! 至于为什么要这样做,请参阅本系列前面的文章。

class New_TmSrDt(TimeSeriesDataSet):
    '''
    rewrite dataset class
    '''
    def to_dataloader(self, train: bool = True, 
                      batch_size: int = 64, 
                      batch_sampler: Sampler | str = None, 
                      shuffle:bool=False,
                      drop_last:bool=False,
                      **kwargs) -> DataLoader:

        default_kwargs = dict(
            shuffle=shuffle,
            # drop_last=train and len(self) > batch_size,
            drop_last=drop_last, #
            collate_fn=self._collate_fn,
            batch_size=batch_size,
            batch_sampler=batch_sampler,
        )
        default_kwargs.update(kwargs)
        kwargs = default_kwargs
        # print(kwargs['drop_last'])
        if kwargs["batch_sampler"] is not None:
            sampler = kwargs["batch_sampler"]
            if isinstance(sampler, str):
                if sampler == "synchronized":
                    kwargs["batch_sampler"] = TimeSynchronizedBatchSampler(
                        SequentialSampler(self),
                        batch_size=kwargs["batch_size"],
                        shuffle=kwargs["shuffle"],
                        drop_last=kwargs["drop_last"],
                    )
                else:
                    raise ValueError(f"batch_sampler {sampler} unknown - see docstring for valid batch_sampler")
            del kwargs["batch_size"]
            del kwargs["shuffle"]
            del kwargs["drop_last"]

        return DataLoader(self,**kwargs)


数据处理
我们在这里不再重复加载数据和数据预处理,具体解释请参考我之前三篇文章的相关内容,本文只解释了地方的相应变化。

1.数据采集

def get_data(mt_data_len:int):
    if not mt.initialize():
        print('initialize() failed!') 
    else:
        print(mt.version())
        sb=mt.symbols_total()
        rts=None
        if sb > 0:
            rts=mt.copy_rates_from_pos("GOLD_micro",mt.TIMEFRAME_M15,0,mt_data_len) 
        mt.shutdown()
        # print(len(rts))
    rts_fm=pd.DataFrame(rts)
    rts_fm['time']=pd.to_datetime(rts_fm['time'], unit='s') 

    rts_fm['time_idx']= rts_fm.index%(max_encoder_length+2*max_prediction_length) 
    rts_fm['series']=rts_fm.index//(max_encoder_length+2*max_prediction_length)
    return rts_fm


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值