文章 "基于机器学习构建均值回归策略" - 页 8

[删除]  
sibirqk #:

当然是我的看法,但使用 Savitsky_Golay 与使用 muve 并无太大区别。SG 滤波器是特定滑动窗口中多项式回归的中点,具有特定的多项式度。对于度数 1,它与相应周期的 muve 完全匹配。

在我看来,要识别回归均值,使用振幅滤波(renko、renji、zigzags)更有意义。我认为范围是最好的--Hg 和 Lw 之间的差异是一个常数。或者说,ZZ 的大小是一个常数,这基本上是一回事。

事实证明,ZZ 更糟糕。
[删除]  

傅里叶分解和奇异值分解作为滤波器的效果非常好。我没有参与参数的选择,这只是第一种变体。


[删除]  

根据文章中的第一个标记函数,在过滤过程中添加指数 衰减的示例。最后的例子在标记中被赋予了更大的权重,以适应更近期的数据。

def get_labels_filter(dataset, rolling=200, quantiles=[.45, .55], polyorder=3, decay_factor=0.95) -> pd.DataFrame:
    """
    Generates labels for a financial dataset based on price deviation from a Savitzky-Golay filter,
    with exponential weighting applied to prioritize recent data.

    Args:
        dataset (pd.DataFrame): DataFrame containing financial data with a 'close' column.
        rolling (int, optional): Window size for the Savitzky-Golay filter. Defaults to 200.
        quantiles (list, optional): Quantiles to define the "reversion zone". Defaults to [.45, .55].
        polyorder (int, optional): Polynomial order for the Savitzky-Golay filter. Defaults to 3.
        decay_factor (float, optional): Exponential decay factor for weighting past data. 
                                        Lower values prioritize recent data more. Defaults to 0.95.

    Returns:
        pd.DataFrame: The original DataFrame with a new 'labels' column and filtered rows:
                       - 'labels' column: 
                            - 0: Buy
                            - 1: Sell
                       - Rows where 'labels' is 2 (no signal) are removed.
                       - Rows with missing values (NaN) are removed.
                       - The temporary 'lvl' column is removed. 
    """

    # 使用萨维茨基-戈莱滤波器计算平滑价格
    smoothed_prices = savgol_filter(dataset['close'].values, window_length=rolling, polyorder=polyorder)
    
    # 计算实际收盘价与平滑价格之间的差额
    diff = dataset['close'] - smoothed_prices
    
    # 对 "差异 "值进行指数加权
    weighted_diff = diff * np.exp(np.arange(len(diff)) * decay_factor / len(diff)) 
    dataset['lvl'] = weighted_diff # 添加加权差值为 "lvl

    # 删除数值为 NaN 的记录 
    dataset = dataset.dropna()
    
    # 计算 "lvl "列的量化值(价格偏差)
    q = dataset['lvl'].quantile(quantiles).to_list() 

    # 以 NumPy 数组形式提取收盘价和计算出的 "lvl "值
    close = dataset['close'].values
    lvl = dataset['lvl'].values
    
    # 使用 "calculating_labels_filter "函数计算买入/卖出标签 
    labels = calculate_labels_filter(close, lvl, q) 

    # 修剪数据集,使其与计算出的标签长度相匹配
    dataset = dataset.iloc[:len(labels)].copy()
    
    # 将计算出的标签作为新的 "标签 "列添加到 DataFrame 中
    dataset['labels'] = labels
    
    # 删除数值为 NaN 的记录
    dataset = dataset.dropna()
    
    # 删除 "标签 "列值为 2.0(卖出信号)的行
    dataset = dataset.drop(dataset[dataset.labels == 2.0].index)
    
    # 返回删除了 "lvl "列的修改后的 DataFrame
    return dataset.drop(columns=['lvl'])


  • 代码中添加了 decay_factor 参数(默认值为 0.95),用于控制过去数据的权重。
  • 对于每个数据点,我们使用 np.exp(np.exp(np.arange(len(diff)))* decay_factor / len(diff)) 计算出权重,然后乘以差异值。这样,最近的差异值权重较大,而较早的差异值权重较小。加权 "lvl "列:lvl 列现在存储指数加权差异,使标记过程对最近的价格变动更加敏感。
  • 较小的 decay_factor 值(接近 0)将使加权更加激进,更加突出近期的价格变化。这意味着算法会对近期偏离平滑价格趋势的情况做出更快的反应。
  • 衰减因子值越大(接近 1),加权就越平滑,对过去的数据给予更多权重。这对于减少短期噪音的影响和识别长期趋势非常有用。
[删除]  

对于较短时间间隔(如 2018 年至 2024 年)的训练,如果超参数中的 n_clusters = 10,可能只能获得很少的交易。减少簇数,例如减少到 5-3 簇,有助于获得更多交易。

这样,就可以在较短的时间段内进行训练,并通过改变不同的参数在这些时间段内寻找好的模式。

还可以缩短交易采样器的过滤周期(萨维茨基-戈莱滤波器或样条曲线)。


 
你好,马克思!我写这封信是想说,我很期待 "马克西姆-德米特里耶夫斯基 "的文章。研究您发表的每一篇文章,过去两年来我一直密切关注您的工作。我来自巴西,我学习并汲取新的有价值的东西。

我发自内心地希望您,马克西姆,继续分享知识研究,并希望 MetaQuotes 团队将您视为受人尊敬的作者,并 "分享利润",以鼓励您继续这项了不起的工作。我希望你是最棒的,马克西姆!

请 @MetaQuotes 和@MetaQuotes @alexx 团队 ,给这个家伙加薪!他应得的 <3

来自巴西的问候
Maxim Dmitrievsky
Maxim Dmitrievsky
  • 2025.03.07
  • www.mql5.com
Профиль трейдера
[删除]  
Vinicius Barenho Pereira #:
你好,马克思!我写这封信是想说,我很期待 "马克西姆-德米特里耶夫斯基 "的文章。研究您发表的每一篇文章,过去两年来我一直密切关注您的工作。我来自巴西,我学习并汲取新的有价值的东西。

我发自内心地希望您,马克西姆,继续分享知识研究,并希望 MetaQuotes 团队将您视为受人尊敬的作者,并 "分享利润",以鼓励您继续这项了不起的工作。我希望你是最棒的,马克西姆!

请 @MetaQuotes 和@MetaQuotes @alexx 团队 ,给这个家伙加薪!他应得的 <3

来自巴西的问候

谢谢,我会努力做一些有趣的事情,也许将来会有用:)

 

篇文章 太棒了:在文章的最后,可以用 Python 来训练不同的机器学习模型,并将它们转换成 MetaTrader 5 交易终端的交易系统。

我会更详细地研究它--感谢您的文章!

[删除]  
Roman Shiredchenko 机器学习模型,并将它们转换成 MetaTrader 5 交易终端的交易系统。

我会更详细地研究它--感谢您的文章!

不客气,它们有时甚至能赚钱 )
 

你好,马克西姆、

我发现 Python 和 MetaTrader 5 中 get_features 函数的值生成有问题。

问题在于 Python 中的 "skew "统计量和 MQL5 中的 "skewness "统计量。根据我进行的测试,两种语言生成的值略有不同。例如

在 MQL5 中为 -0.087111
,而在 Python 中为
-0.092592

这看似微不足道,但在元标签分类后,这会导致延迟预测,使 EA 通常晚进入一根蜡烛,从而使策略失效。我建议不要在 MQL5 中使用该统计量,或尝试手动计算以匹配相同的值。

来自巴西的问候

[删除]  
KleversonGerhardt #:

你好,马克西姆、

我发现 Python 和 MetaTrader 5 中 get_features 函数的值生成有问题。

问题在于 Python 中的 "skew "统计量和 MQL5 中的 "skewness "统计量。根据我进行的测试,两种语言生成的值略有不同。例如

在 MQL5 中为 -0.087111
,而在 Python 中为
-0.092592

这看似微不足道,但在元标签分类后,这会导致延迟预测,使 EA 通常晚进入一根蜡烛,从而使策略失效。我建议不要在 MQL5 中使用该统计量,或尝试手动计算以匹配相同的值。

来自巴西的问候

您好,谢谢!我会检查的。