文章 "使用PatchTST机器学习算法预测未来24小时的价格走势" - 页 2

 
我经常发现这个模型的预测结果与实际情况不太一致。我没有对这个模型的代码做任何修改。您能给我一些指导吗?谢谢。
 
Thomas Sawyer #:
我经常发现这个模型的预测结果与实际情况不太一致。我没有对这个模型的代码做任何修改。您能给我一些指导吗?谢谢。

感谢您分享使用该模型的经验。您提出的关于预测一致性的观点很有道理。当把 PatchTST 模型整合到考虑多种市场因素的综合交易方法中时,它的效果最佳。以下是我建议如何更有效地使用该模型预测的方法:

  1. 时间窗口优化:
  • 重点关注高峰时段(美国中部时间上午 6:00 至上午 10:00)的交易。
  • 主要在这些时段使用模型预测,因为这些时段的市场走势更容易预测
  • 特别注意前期日线和周线高点/低点附近的偏差。这些是主要的供需区。
  1. 模型整合策略:
  • 将预测作为更广泛分析的一部分,而不是独立的信号
  • 在预测的价格范围内寻找公平价值缺口 (FVG)。下面是我在 MQL5 中用于 FVG 的指标代码。
  • 将预测与旗形、楔形和水平整理等技术形态相结合。
  • 结合每日、每周和每月的价格位置考虑预测结果
  1. 风险管理:
  • 实施更广泛的止损(例如,黄金 10 点或 100 点止损、欧元兑美元 50 点、美元兑日元 65 点、英镑兑美元 60 点、澳元兑美元/新西兰元 30 点、美元兑加元 40 点、原油 0.80 点、US500 25 点、NQ 75 点、US30 200 点)
  • 对部分仓位使用适度的止盈(即第一部分仓位的风险回报为 1:1(初始仓位的 70%),留出一个空仓(初始仓位的 30)
  • 根据市场情况调整仓位规模--有大量汇合的好交易,2 - 3 倍的基本仓位规模。
  • 避免在影响较大的新闻事件期间进行交易
  1. 建立背景:
  • 分析多个时间段的市场结构:利用 5 分钟和 15 分钟--1 小时内可能有一个最佳的蜡烛/条形图/收盘价,模型会预测您的交易方向。
  • 考虑当前市场状态(趋势/徘徊/巩固/软弱/反转)--利用这些信息预先计划最佳交易时间。如果你的预期没有实现,就寻找模型给你提供的下一个机会。
  • 在预测的价格范围内寻找形态确认
  • 关注方向性倾向和主要支撑/阻力位
  1. 进场细化:
  • 等待结构性确认后再进场交易。最了解的结构:双顶/底、楔形、牛/熊旗、MTR 顶/底、高潮,尤其是在关键支撑和阻力区域/FVG 附近。
  • 如果预计会出现趋势通道,请勿入场。趋势通道是你最大的敌人。即使在较高的时间框架(如 4 小时或 1 天)上发现趋势通道,也不要逆向操作!
  • 在预测的范围内寻找盘整形态--利用每一次反转。这种模式在反转中大放异彩。
  • 考虑按比例进场,而不是全额进场。25% 的初始规模 - 当价格对你有利时扩大规模,直至满仓规模。不要在不利于你的头寸的情况下进场,也就是说,如果头寸不利于你。

其他一些个人看法:

  • 使用这种模式,你必须关注和预测某些事情:关键领域的反转是最有利可图的。
    • 因此,如果该模型预测某个柱状图或时间框架的颜色会发生变化。这就是开始关注的时候了。在进场前寻找 1 次额外的汇合。如果没有出现汇合点,那就等到出现汇合点,即使颜色发生了变化,交易仍有可能成功。我的观点是,从 "何时 "需要开始关心和关注的角度来看,这是一个很好的 "时机 "模型。
  • 这个模型确实会产生很多假阳性结果,但几场大胜会抵消所有糟糕的损失。
  • 从一对开始,每周增加一对。将你的模型扩大到总共 10 对。
  • 每周会有 2 - 3 笔大交易。
  • 预计每周收益约为 0.5% - 1.5%。在所有不同的货币对中,您每周的风险约为 1.0% - 2.5%。换句话说,您的交易规模较小,在多个不相关的工具上保持分散,并专注于特定的时间范围。你将持续正确地交易大约 3 - 6 种工具,这将使你赚到大部分钱。因此,不要纠结于任何一笔交易,也不要过度分析任何一个数据点。
  • 如果预测的变化是围绕新闻事件发生的,那就跳过它,专注于其他货币对或等待下一个变色信号。
  • 趋势通道是你最大的敌人--如果你甚至怀疑它们--当天就忘掉这对货币对吧。或者,做与模型告诉你的相反的事情,因为否则你就会陷入反趋势的损失中。
  • 交易这个模型是 "不舒服 "的--你真的不相信它,总觉得 "这个交易永远不会成功,它太违反直觉了",但这就是它的魅力所在。它让你做你不想做的事,而这才是正确的事(你不想做的事,但你应该做,因为在当时的情况下这才是正确的事)。
  • 反转的概念 发生率约为 20 - 30%:这是指模型给你一种颜色(红色或绿色),但市场似乎总是在做相反的事情。这是一种反转情况--模型没有问题,你的交易也没有问题。你只需要意识到反转已经发生,然后开始做相反的交易,或者完全跳过交易对,直到预期重新对齐。反转通常需要 6 - 10 个交易时段(约 2 - 4 天)才能修复。使用该模型识别反转的最简单方法是使用我给你的用于模型预测的 python 脚本--按顺序提取过去 6 个交易时段的数据(因此不要提取最新数据--进行回溯)。看看预测结果是否与实际相符。如果不匹配,则说明发生了反转。

模型预测应作为分析的一个组成部分,而不是唯一的决策者。在使用 PatchTST 模型时,通过纳入这些要素,您有可能提高交易结果的一致性。



我提到的公平价值缺口 (FVG) 脚本(根据我的经验,这些缺口的作用非常类似于供需区):

#property copyright "© ShashankRai1"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

input bool ShowMidpoint = false; // 显示中点线
input color UpFVGColor = clrGreen;  // 上升 FVG 颜色
input color DownFVGColor = clrRed;  // 羽绒被颜色

int OnInit()
{
    IndicatorSetString(INDICATOR_SHORTNAME, "Show FVG");
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0, "FVG_");
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    int start;
    if(prev_calculated == 0)
    {
        start = rates_total - 1;  // 处理所有可用数据
    }
    else
    {
        start = prev_calculated - 1;  // 只处理新的条形图
    }

    for (int i = start; i >= 2; i--)  // 确保至少有 3 个小节
    {
        drawFVG(i, rates_total, time, open, high, low, close);
    }

    return(rates_total);
}

void drawFVG(int index, int total, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[])
{
    if (index < 2 || index >= total) return; // 确保有足够的条形图

    if (close[index - 1] > open[index - 1] && high[index - 2] < low[index])
    {
        // 上升收烛条件和缺口存在
        string boxName = StringFormat("FVG_Box_Up_%d", index);
        if(ObjectCreate(0, boxName, OBJ_RECTANGLE, 0, time[index - 2], high[index - 2], time[index], low[index]))
        {
            ObjectSetInteger(0, boxName, OBJPROP_COLOR, UpFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BGCOLOR, UpFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BACK, true);
            ObjectSetInteger(0, boxName, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, boxName, OBJPROP_FILL, true);
            Print("Created Up FVG box at index ", index);
        }
        else
        {
            Print("Failed to create Up FVG box at index ", index, ". Error: ", GetLastError());
        }

        if (ShowMidpoint)
        {
            string lineName = StringFormat("FVG_Line_Up_%d", index);
            double midpoint = (high[index - 2] + low[index]) / 2;
            if(ObjectCreate(0, lineName, OBJ_TREND, 0, time[index - 2], midpoint, time[index], midpoint))
            {
                ObjectSetInteger(0, lineName, OBJPROP_COLOR, UpFVGColor);
                ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DASH);
                ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 1);
                Print("Created Up FVG midline at index ", index);
            }
            else
            {
                Print("Failed to create Up FVG midline at index ", index, ". Error: ", GetLastError());
            }
        }
    }
    else if (close[index - 1] < open[index - 1] && low[index - 2] > high[index])
    {
        // 下跌收烛条件和缺口存在
        string boxName = StringFormat("FVG_Box_Down_%d", index);
        if(ObjectCreate(0, boxName, OBJ_RECTANGLE, 0, time[index - 2], low[index - 2], time[index], high[index]))
        {
            ObjectSetInteger(0, boxName, OBJPROP_COLOR, DownFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BGCOLOR, DownFVGColor);
            ObjectSetInteger(0, boxName, OBJPROP_BACK, true);
            ObjectSetInteger(0, boxName, OBJPROP_WIDTH, 1);
            ObjectSetInteger(0, boxName, OBJPROP_FILL, true);
            Print("Created Down FVG box at index ", index);
        }
        else
        {
            Print("Failed to create Down FVG box at index ", index, ". Error: ", GetLastError());
        }

        if (ShowMidpoint)
        {
            string lineName = StringFormat("FVG_Line_Down_%d", index);
            double midpoint = (high[index] + low[index - 2]) / 2;
            if(ObjectCreate(0, lineName, OBJ_TREND, 0, time[index - 2], midpoint, time[index], midpoint))
            {
                ObjectSetInteger(0, lineName, OBJPROP_COLOR, DownFVGColor);
                ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DASH);
                ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 1);
                Print("Created Down FVG midline at index ", index);
            }
            else
            {
                Print("Failed to create Down FVG midline at index ", index, ". Error: ", GetLastError());
            }
        }
    }
}
 
Shashank Rai #:

感谢您的关注!是的,对参数的这些更改原则上是可行的,但在切换到 M1 数据时有几个重要的注意事项:

1.数据量:使用 10080 分钟(1 周)的 M1 数据进行训练意味着要处理比 H1 多得多的数据点。这将

  • 大大增加训练时间
  • 需要更多内存
  • 可能需要 GPU 加速来提高训练效率

2.模型架构调整:在模型训练的第 8 步和预测代码的第 4 步,您可能需要调整其他参数,以适应更大的输入序列:

3.预测质量:虽然您可以获得更精细的预测,但要注意 M1 数据通常包含更多噪声。您可能需要尝试不同的序列长度和预测窗口,以找到最佳平衡点。

感谢您的见解。我的电脑性能不错,有 256GB 和 64 个物理内核。不过还需要更好的 GPU。

一旦我更新了 GPU,我就会尝试更新配置设置。

 
Shashank Rai #:

感谢您分享使用该模型的经验。您提出的关于预测一致性的观点很有道理。如果将 PatchTST 模型与考虑多种市场因素的综合交易方法结合起来,它就能发挥最大作用。以下是我建议如何更有效地使用该模型预测的方法:

  1. 时间窗口优化:
  • 重点关注高峰时段(美国中部时间上午 6:00 至上午 10:00)的交易。
  • 主要在这些时段使用模型预测,因为这些时段的市场走势更容易预测
  • 特别注意之前的日高点和周高点/低点附近的偏差。这些是主要的供需区。
  1. 模型整合策略:
  • 将预测作为更广泛分析的一部分,而不是独立的信号
  • 在预测的价格范围内寻找公平价值缺口 (FVG)。下面是我在 MQL5 中用于 FVG 的指标代码。
  • 将预测与旗形、楔形和水平整理等技术形态相结合。
  • 结合每日、每周和每月的价格位置考虑预测结果
  1. 风险管理:
  • 实施更广泛的止损(例如,黄金 10 点或 100 点止损、欧元兑美元 50 点、美元兑日元 65 点、英镑兑美元 60 点、澳元兑美元/新西兰元 30 点、美元兑加元 40 点、原油 0.80 点、US500 25 点、NQ 75 点、US30 200 点)
  • 对部分仓位使用适度的止盈(即第一部分仓位的风险回报为 1:1(初始仓位的 70%),留下一个跑腿仓位(初始仓位的 30)
  • 根据市场情况调整仓位规模--有大量汇合的好交易,2 - 3 倍的基本仓位规模。
  • 避免在影响较大的新闻事件期间进行交易
  1. 建立背景:
  • 分析多个时间段的市场结构:利用 5 分钟和 15 分钟--1 小时内可能有一个最佳的蜡烛/条形图/收盘价,模型会预测您的交易方向。
  • 考虑当前市场状态(趋势/徘徊/巩固/软弱/反转)--利用这些信息预先计划最佳交易时间。如果你的预期没有实现,就寻找模型给你提供的下一个机会。
  • 在预测的价格范围内寻找形态确认
  • 关注方向性倾向和主要支撑/阻力位
  1. 进场细化:
  • 等待结构确认后再进场交易。最了解的结构:双顶/底、楔形、牛/熊旗、MTR 顶/底、高潮,尤其是在关键支撑和阻力区域/FVG 附近。
  • 如果预计会出现趋势通道,请勿入场。趋势通道是你最大的敌人。即使在较高的时间框架(如 4 小时或 1 天)上发现趋势通道,也不要逆向操作!
  • 在预测的范围内寻找盘整形态--利用每一次反转。这种模式在反转中大放异彩。
  • 考虑按比例进场,而不是全额进场。25% 的初始规模 - 当价格对你有利时扩大规模,直至满仓规模。不要在不利于你的头寸的情况下进场,也就是说,如果头寸不利于你。

其他一些个人看法:

  • 使用这种模式,你必须关注和预测某些事情:关键领域的反转是最有利可图的。
    • 因此,如果该模型预测某个柱状图或时间框架的颜色会发生变化。这就是开始关注的时候了。在进场前寻找 1 次额外的汇合。如果没有出现汇合点,那就等到出现汇合点,即使颜色发生了变化,交易仍有可能成功。我的观点是,从 "何时 "需要开始关心和关注的角度来看,这是一个很好的 "时机 "模型。
  • 这个模型确实会产生很多假阳性结果,但几场大胜会抵消所有的惨败。
  • 从一对开始,每周增加一对。将你的模型扩大到总共 10 对。
  • 每周会有 2 - 3 笔大交易。
  • 预计每周收益约为 0.5% - 1.5%。在所有不同的货币对中,您每周的风险约为 1.0% - 2.5%。换句话说,您的交易规模较小,在多个不相关的工具上保持分散,并专注于特定的时间范围。你将持续正确地交易大约 3 - 6 种工具,这将使你赚到大部分钱。因此,不要纠结于任何一笔交易,也不要过度分析任何一个数据点。
  • 如果预测的变化是围绕新闻事件发生的,那就跳过它,专注于其他货币对或等待下一个变色信号。
  • 趋势通道是你最大的敌人--如果你甚至怀疑它们--当天就忘掉这对货币对吧。或者,做与模型告诉你的相反的事情,因为否则你就会陷入反趋势的损失中。
  • 交易这个模型是 "不舒服 "的--你真的不相信它,总觉得 "这个交易永远不会成功,它太违反直觉了",但这就是它的魅力所在。它让你做你不想做的事,而这才是正确的事(你不想做的事,但你应该做,因为在当时的情况下这才是正确的事)。
  • 反转的概念 发生率约为 20 - 30%:这是指模型给你一种颜色(红色或绿色),但市场似乎总是在做相反的事情。这是一种反转情况--模型没有问题,你的交易也没有问题。你只需要意识到反转已经发生,然后开始做相反的交易,或者完全跳过交易对,直到预期重新对齐。反转通常需要 6 - 10 个交易时段(约 2 - 4 天)才能修复。使用该模型识别反转的最简单方法是使用我给你的用于模型预测的 python 脚本--按顺序提取过去 6 个交易时段的数据(因此不要提取最新数据--进行回溯)。看看预测结果是否与实际相符。如果不匹配,就说明发生了反转。

应将模型预测作为分析的一个组成部分,而不是唯一的决策者。在使用 PatchTST 模型时,通过纳入这些要素,您有可能提高交易结果的一致性。



我提到的公平价值缺口 (FVG) 脚本(根据我的经验,这些缺口的作用非常类似于供需区):

非常感谢您的耐心解答和无私分享。我以前从未见过如此详细和专业的回答。我会反复阅读您的文章。这些知识对我特别有价值。祝您一切顺利
 
Thomas Sawyer #:
非常感谢你的耐心解答和无私分享。我从未见过如此详细和专业的回答。我会反复阅读您的文章。这些知识对我来说特别宝贵。祝您一切顺利。

谢谢您。您的好意我心领了如果您需要更多帮助,请联系我们!