文章 "基于机器学习构建均值回归策略" - 页 8 12345678910 新评论 [删除] 2025.03.13 09:11 #71 sibirqk #:当然是我的看法,但使用 Savitsky_Golay 与使用 muve 并无太大区别。SG 滤波器是特定滑动窗口中多项式回归的中点,具有特定的多项式度。对于度数 1,它与相应周期的 muve 完全匹配。 在我看来,要识别回归均值,使用振幅滤波(renko、renji、zigzags)更有意义。我认为范围是最好的--Hg 和 Lw 之间的差异是一个常数。或者说,ZZ 的大小是一个常数,这基本上是一回事。 事实证明,ZZ 更糟糕。 [删除] 2025.03.13 22:39 #72 傅里叶分解和奇异值分解作为滤波器的效果非常好。我没有参与参数的选择,这只是第一种变体。 [删除] 2025.03.14 09:40 #73 根据文章中的第一个标记函数,在过滤过程中添加指数 衰减的示例。最后的例子在标记中被赋予了更大的权重,以适应更近期的数据。 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),加权就越平滑,对过去的数据给予更多权重。这对于减少短期噪音的影响和识别长期趋势非常有用。 [删除] 2025.03.16 15:30 #74 对于较短时间间隔(如 2018 年至 2024 年)的训练,如果超参数中的 n_clusters = 10,可能只能获得很少的交易。减少簇数,例如减少到 5-3 簇,有助于获得更多交易。 这样,就可以在较短的时间段内进行训练,并通过改变不同的参数在这些时间段内寻找好的模式。 还可以缩短交易采样器的过滤周期(萨维茨基-戈莱滤波器或样条曲线)。 Vinicius Barenho Pereira 2025.03.26 14:31 #75 你好,马克思!我写这封信是想说,我很期待 "马克西姆-德米特里耶夫斯基 "的文章。研究您发表的每一篇文章,过去两年来我一直密切关注您的工作。我来自巴西,我学习并汲取新的有价值的东西。 我发自内心地希望您,马克西姆,继续分享知识研究,并希望 MetaQuotes 团队将您视为受人尊敬的作者,并 "分享利润",以鼓励您继续这项了不起的工作。我希望你是最棒的,马克西姆! 请 @MetaQuotes 和@MetaQuotes @alexx 团队 ,给这个家伙加薪!他应得的 <3 来自巴西的问候 Maxim Dmitrievsky 2025.03.07www.mql5.com Профиль трейдера [删除] 2025.03.26 16:28 #76 Vinicius Barenho Pereira #:你好,马克思!我写这封信是想说,我很期待 "马克西姆-德米特里耶夫斯基 "的文章。研究您发表的每一篇文章,过去两年来我一直密切关注您的工作。我来自巴西,我学习并汲取新的有价值的东西。 我发自内心地希望您,马克西姆,继续分享知识研究,并希望 MetaQuotes 团队将您视为受人尊敬的作者,并 "分享利润",以鼓励您继续这项了不起的工作。我希望你是最棒的,马克西姆! 请 @MetaQuotes 和@MetaQuotes @alexx 团队 ,给这个家伙加薪!他应得的 <3 来自巴西的问候 谢谢,我会努力做一些有趣的事情,也许将来会有用:) Roman Shiredchenko 2025.05.27 13:36 #77 这篇文章 太棒了:在文章的最后,可以用 Python 来训练不同的机器学习模型,并将它们转换成 MetaTrader 5 交易终端的交易系统。 我会更详细地研究它--感谢您的文章! [删除] 2025.05.27 14:56 #78 Roman Shiredchenko 机器学习模型,并将它们转换成 MetaTrader 5 交易终端的交易系统。我会更详细地研究它--感谢您的文章! 不客气,它们有时甚至能赚钱 ) KleversonGerhardt 2025.06.05 23:45 #79 你好,马克西姆、 我发现 Python 和 MetaTrader 5 中 get_features 函数的值生成有问题。 问题在于 Python 中的 "skew "统计量和 MQL5 中的 "skewness "统计量。根据我进行的测试,两种语言生成的值略有不同。例如 在 MQL5 中为 -0.087111 ,而在 Python 中为 -0.092592 。 这看似微不足道,但在元标签分类后,这会导致延迟预测,使 EA 通常晚进入一根蜡烛,从而使策略失效。我建议不要在 MQL5 中使用该统计量,或尝试手动计算以匹配相同的值。 来自巴西的问候 从新手到专家:使用 MQL5 制作动画新闻标题(五) 事件提醒系统 市场模拟(第 10 部分):套接字(四) Python中的虚假回归(伪回归) [删除] 2025.06.06 05:18 #80 KleversonGerhardt #:你好,马克西姆、我发现 Python 和 MetaTrader 5 中 get_features 函数的值生成有问题。问题在于 Python 中的 "skew "统计量和 MQL5 中的 "skewness "统计量。根据我进行的测试,两种语言生成的值略有不同。例如在 MQL5 中为 -0.087111 ,而在 Python 中为 -0.092592 这看似微不足道,但在元标签分类后,这会导致延迟预测,使 EA 通常晚进入一根蜡烛,从而使策略失效。我建议不要在 MQL5 中使用该统计量,或尝试手动计算以匹配相同的值。来自巴西的问候 您好,谢谢!我会检查的。 12345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
当然是我的看法,但使用 Savitsky_Golay 与使用 muve 并无太大区别。SG 滤波器是特定滑动窗口中多项式回归的中点,具有特定的多项式度。对于度数 1,它与相应周期的 muve 完全匹配。
在我看来,要识别回归均值,使用振幅滤波(renko、renji、zigzags)更有意义。我认为范围是最好的--Hg 和 Lw 之间的差异是一个常数。或者说,ZZ 的大小是一个常数,这基本上是一回事。
傅里叶分解和奇异值分解作为滤波器的效果非常好。我没有参与参数的选择,这只是第一种变体。
根据文章中的第一个标记函数,在过滤过程中添加指数 衰减的示例。最后的例子在标记中被赋予了更大的权重,以适应更近期的数据。
对于较短时间间隔(如 2018 年至 2024 年)的训练,如果超参数中的 n_clusters = 10,可能只能获得很少的交易。减少簇数,例如减少到 5-3 簇,有助于获得更多交易。
这样,就可以在较短的时间段内进行训练,并通过改变不同的参数在这些时间段内寻找好的模式。
还可以缩短交易采样器的过滤周期(萨维茨基-戈莱滤波器或样条曲线)。
谢谢,我会努力做一些有趣的事情,也许将来会有用:)
这篇文章 太棒了:在文章的最后,可以用 Python 来训练不同的机器学习模型,并将它们转换成 MetaTrader 5 交易终端的交易系统。
我会更详细地研究它--感谢您的文章!
我会更详细地研究它--感谢您的文章!
你好,马克西姆、
我发现 Python 和 MetaTrader 5 中 get_features 函数的值生成有问题。
问题在于 Python 中的 "skew "统计量和 MQL5 中的 "skewness "统计量。根据我进行的测试,两种语言生成的值略有不同。例如
在 MQL5 中为 -0.087111
,而在 Python 中为
-0.092592
。
这看似微不足道,但在元标签分类后,这会导致延迟预测,使 EA 通常晚进入一根蜡烛,从而使策略失效。我建议不要在 MQL5 中使用该统计量,或尝试手动计算以匹配相同的值。
来自巴西的问候
你好,马克西姆、
我发现 Python 和 MetaTrader 5 中 get_features 函数的值生成有问题。
问题在于 Python 中的 "skew "统计量和 MQL5 中的 "skewness "统计量。根据我进行的测试,两种语言生成的值略有不同。例如
在 MQL5 中为 -0.087111
,而在 Python 中为
-0.092592
这看似微不足道,但在元标签分类后,这会导致延迟预测,使 EA 通常晚进入一根蜡烛,从而使策略失效。我建议不要在 MQL5 中使用该统计量,或尝试手动计算以匹配相同的值。
来自巴西的问候