数据科学与机器学习(第四十部分):斐波那契回调位在机器学习中的应用(基础篇)
用斐波那契回调位给行情打标签
斐波那契回调位在 MT5 里不只是画几条线看支撑,它能被直接转成机器学习训练用的目标变量。常见的 23.6%、38.2%、50%、61.8% 回调位,对应一段趋势回撤的不同深度,交易者习惯拿它们判断价格是否「回得差不多了该继续」。 从数据视角看,一段已发生的上涨波段,若价格回撤到 61.8% 附近后重新向上,这个样本就可以标为「多头延续」类;回撤击穿 61.8% 并延续下行,则标为「反转」类。这样每个 K 线片段都有了可量化的归属。 把这类标签作为目标变量(y),再配合波动率、成交量、均线斜率等特征(X),就能在 MT5 里用 EA 跑分类或回归模型。外汇与贵金属杠杆高、跳空频繁,用斐波那契标签训练出的模型仅代表历史概率倾向,实盘前务必在策略测试器用不同年份数据交叉验证。
「从兔子繁衍到黄金比例φ」
中世纪的比萨列奥纳多在1202年《算盘全书》里写下了一个以0、1起头的数列:每一项都是前两项之和。这套数后来被叫作斐波那契数列,但它最早是用来算兔子种群扩张的,不是拿来画K线用的。 在自然界里,部分动物外壳的对数螺旋、蜜蜂家族谱系、甚至哺乳动物DNA片段的排布,都能看到近似该数列的结构,不过都只是近似,不是严丝合缝。 真正跟交易挂钩的是黄金比例。较小值比上较大值,等于较大值比两者之和,这个比值收敛到约1.6180339887,记作φ。用斐波那契数列里的大数除小数,越往后越贴φ,但永远差一点——因为φ是无理数,没法用分数写尽。 把数列相邻项相除,第10项以后比值与φ的偏差已小于千分之一,这也是为什么回测斐波工具时,远端扩展位比近端的收敛更稳定。外汇与贵金属波动受多重因子驱动,φ只是概率参考,实盘仍需风控。
◍ MT5里斐波那契回调到底在标什么
斐波那契回调位本质是一组水平线,用来标出价格可能反转的潜在支撑与阻力区,其比例来自斐波那契数列的派生值。在 MT5 里这是被高频使用的手工画线工具,常见用法包括挂止损止盈、圈定反转敏感带。 路径很直白:插入 → 图形对象 → 斐波那契。以 EURUSD 的 1 小时图为例,从一段明显 swing 高低点拉出工具,就能看到 23.6%、38.2%、50%、61.8% 等层级铺在图上。 值得单独拎出来的是 61.8%(黄金比例 0.618)这一线。后续我们会用机器学习视角去验证它在外汇与贵金属上的实际命中率——这类品种杠杆高、波动突兀,任何价位都只是概率参考,不是兜底。 我们打算用多种数学构造法生成斐波那契特征,再喂给模型当目标变量,看 AI 能不能比人眼更早发现价格方向的倾向。
把斐波那契位喂给机器学习做标签
做监督学习最麻烦的一步是造目标变量。斐波那契水平本身就是具体价位,直接拿它当回归任务的预测值,或拿价格相对于该线的突破方向当分类标签,都能绕开主观打分。 分类思路很直接:以上涨段为例,若后续 K 线在前瞻窗口内向上越过算出的斐波那契位,记 1(看涨);向下跌破则记 0(看跌);两方向都没碰线记 -1。回测样张里 13 根 EURUSD 小时线中,第 12 根信号为 -1.0,说明价格在未来 10 根内未触及 0.618 回撤位。 回归不必偏移取值。人工交易本就是按回溯窗口算出的斐波那契位,去赌未来破不破它;模型也只需用回溯窗口特征,预测下一根对应的斐波那契水平值。样张中第 9 根收盘 1.3362,对应斐波那契水平 1.343840,差值约 78 点,外汇与贵金属杠杆高,这种点位偏差足以引发止损。 下面这段 Python 能把分类标签直接算出来,MT5 导出的收盘价序列丢进去就能跑。注意 lookahead_window 用了未来偏移,仅限离线训练,实盘不能偷看。
class="kw">import pandas as pd class="kw">import numpy as np def create_fib_clftargetvar(price: pd.Series, lookback_window: class="type">int=class="num">10, lookahead_window: class="type">int=class="num">10, fib_level: class="type">float=class="num">0.618): """ Creates a target variable based on Fibonacci breakthroughs in price data. Parameters: - price: pd.Series of price data(close, open, high, or low) - lookback_window: class="type">int - number of past periods to calculate high/low - lookahead_window: class="type">int - number of future periods to assess breakout - fib_level: class="type">float - Fibonacci retracement level(e.g. class="num">0.618) Returns: - pd.Series: with values class="num">1 => Bullish fib level reached class="num">0 => Bearish fib level reached -class="num">1 => False breakthrough or no fib hit """ high = price.rolling(lookback_window).max() low = price.rolling(lookback_window).min() fib_level_value = high - (high - low) * fib_level # calculate the Fibonacci level in market price price_ahead = price.shift(-lookahead_window) # future price values target_var = [] for i in range(len(price)): if np.isnan(price_ahead.iloc[i]) or np.isnan(fib_level_value.iloc[i]) or np.isnan(price.iloc[i]): target_var.append(np.nan) class="kw">continue # let&class="macro">#x27;s detect bull and bearish movement afterwards if price_ahead.iloc[i] > price.iloc[i]: # The market went bullish if price_ahead.iloc[i] >= fib_level_value.iloc[i]: target_var.append(class="num">1) # bullish Fibonacci target reached else: target_var.append(-class="num">1) # false breakthrough else: # The market went bearish if price_ahead.iloc[i] <= fib_level_value.iloc[i]: target_var.append(class="num">0) # bearish Fibonacci target reached else: target_var.append(-class="num">1) # false breakthrough class="kw">return target_var fib_level_value = high - (high - low) * fib_level