寻找市场形态的计量经济学方法:自相关,热点图和散点图(基础篇)
📘

寻找市场形态的计量经济学方法:自相关,热点图和散点图(基础篇)

第 1/3 篇

「用自相关和热点图抓形态苗头」

在 MT5 里看价格序列,别只盯 K 线形态。把收益率做自相关分析,能直接看出当前行情有没有记忆性——比如滞后 1 阶自相关系数显著为正,说明涨后易再涨的惯性概率偏高。 外汇与贵金属杠杆高,自相关窗口选错会给出假信号,建议先用日线跑 200 根以上样本再下结论。 热点图(heatmap)把不同周期的自相关值铺成色块,散点图则看两变量偏离。三者结合,比肉眼找头肩顶更不容易漏掉弱形态。

◍ 把市场记忆和季节性拧成一股

前一篇里我们定义了“市场记忆”:价格增量序列存在长期依赖,不是独立游走。同时也单独拆过“季节性形态”——某些时段里价格行为会重复出现规律。这两件事此前是各说各的,本文要做的就是把它们接起来。 核心假设很直接:价格增量的相关性,既受季节性形态驱动,也受邻近增量集簇影响。换句话说,若某窗口内增量高度抱团且跨周期仍相关,那背后大概率有季节结构在撑。 我们要验证的是——在紧凑时间段里任取顺序增量,其相关性应达到最大;拉到远期窗口,相关性塌到最小。这种“近强远弱”的剖面,就是市场记忆带季节性的直接证据。外汇与贵金属波动受宏观节奏支配,此类结构存在但随时被事件打断,属高风险信号,不可当稳态用。

自相关视角下的随机性与季节性破绽

计量经济学里判断价格增量有无形态,传统做法是看自相关是否缺失。若滞后各阶相关性都贴近零,增量就被当作随机游走,继续找规律被认为没意义。 拿 EURUSD 的 H1 收盘价跑一遍全时段自相关(滞后 50),图里相邻增量相关性在零轴附近乱跳,表面看就是纯随机,按教科书到此该收工说市场无效了。 但换个切法:只留每天的第一根 H1 柱,其余时段全剔掉,重建一个子序列再画自相关。图立刻变样——当前增量和前一期依赖明显变强,且随着时间间隔拉大依赖衰减。这说明每天首小时增量和昨天的首小时增量绑得紧,序列有了“记忆”,季节性形态嫌疑就出来了。 外汇和贵金属这种高杠杆品种,随机表象下藏的时段规律可能只是概率偏向,实盘验证前别当确定性结论。

MQL5 / C++
def standard_autocorrelation(symbol, lag):
    rates = pd.DataFrame(MT5CopyRatesRange(symbol, MT5_TIMEFRAME_H1, class="type">class="kw">datetime(class="num">2015, class="num">1, class="num">1), class="type">class="kw">datetime(class="num">2020, class="num">1, class="num">1)), 
                          columns=[&class="macro">#x27;time&class="macro">#x27;, &class="macro">#x27;open&class="macro">#x27;, &class="macro">#x27;low&class="macro">#x27;, &class="macro">#x27;high&class="macro">#x27;, &class="macro">#x27;close&class="macro">#x27;, &class="macro">#x27;tick_volume&class="macro">#x27;, &class="macro">#x27;spread&class="macro">#x27;, &class="macro">#x27;real_volume&class="macro">#x27;])
    rates = rates.drop([&class="macro">#x27;open&class="macro">#x27;, &class="macro">#x27;low&class="macro">#x27;, &class="macro">#x27;high&class="macro">#x27;, &class="macro">#x27;tick_volume&class="macro">#x27;, &class="macro">#x27;spread&class="macro">#x27;, &class="macro">#x27;real_volume&class="macro">#x27;], axis=class="num">1).set_index(&class="macro">#x27;time&class="macro">#x27;) 
    rates = rates.diff(lag).dropna()
    from pandas.plotting class="kw">import autocorrelation_plot
    plt.figure(figsize=(class="num">10, class="num">5))
    autocorrelation_plot(rates)
standard_autocorrelation(&class="macro">#x27;EURUSD&class="macro">#x27;, class="num">50)

「用季节性自相关挖出时段间的隐性牵引」

前面已经看到,当日第一小时增量和前一日第一小时增量有相关性,但隔得越久相关性越弱。接下来要问的是:相邻时段之间,是否也存在类似的相互拉扯? 我们把代码改一下,只保留每天的第 1 和第 2 个小时,其余时段全部删掉,再对新序列做差分并画出自相关函数。图例里能直观看到,紧挨着的时段序列相关性很高,说明它们不是孤立的,而是彼此影响。 不过手动挑两个小时太局限,能不能把每个时段的相对分数都算出来?下面这段就是按这个思路写的季节性自相关函数,直接丢进 MT5 的 Python 环境就能跑。 回测区间取 2015-01-01 到 2020-01-01 的 EURUSD 小时数据,lag 设 50、hour1=1、hour2=2 时,最近 lags 的自相关系数明显贴在置信带外,印证了短间隔时段的强联动。外汇和贵金属杠杆高,这种结构只是概率上的偏好,别当成确定性信号。

MQL5 / C++
def seasonal_autocorrelation(symbol, lag, hour1, hour2):
    rates = pd.DataFrame(MT5CopyRatesRange(symbol, MT5_TIMEFRAME_H1, class="type">class="kw">datetime(class="num">2015, class="num">1, class="num">1), class="type">class="kw">datetime(class="num">2020, class="num">1, class="num">1)), 
                                columns=[&class="macro">#x27;time&class="macro">#x27;, &class="macro">#x27;open&class="macro">#x27;, &class="macro">#x27;low&class="macro">#x27;, &class="macro">#x27;high&class="macro">#x27;, &class="macro">#x27;close&class="macro">#x27;, &class="macro">#x27;tick_volume&class="macro">#x27;, &class="macro">#x27;spread&class="macro">#x27;, &class="macro">#x27;real_volume&class="macro">#x27;])
    rates = rates.drop([&class="macro">#x27;open&class="macro">#x27;, &class="macro">#x27;low&class="macro">#x27;, &class="macro">#x27;high&class="macro">#x27;, &class="macro">#x27;tick_volume&class="macro">#x27;, &class="macro">#x27;spread&class="macro">#x27;, &class="macro">#x27;real_volume&class="macro">#x27;], axis=class="num">1).set_index(&class="macro">#x27;time&class="macro">#x27;) 
    rates = rates.drop(rates.index[~rates.index.hour.isin([hour1, hour2])]).diff(lag).dropna()
    from pandas.plotting class="kw">import autocorrelation_plot
    plt.figure(figsize=(class="num">10, class="num">5))
    autocorrelation_plot(rates)
seasonal_autocorrelation(&class="macro">#x27;EURUSD&class="macro">#x27;, class="num">50, class="num">1, class="num">2)

常见问题

看滞后1到滞后20的柱线是否明显超出置信带;若多数滞后都显著高于0,说明价格存在短期记忆,可优先做均值回归类策略验证。
对角线外成片偏红或偏蓝的格子代表跨时段联动异常;出现这种结构时,说明某时段涨跌在悄悄牵引另一时段,值得回测对应窗口。
可以,小布会在对应品种页持续计算并展示自相关与热点图快照,异常结构出现时直接标出,你只需打开页面看结论不用自己跑脚本。
很可能是时段流动性差异造成的隐性牵引;把分时段自相关单独拉出来对比,若某时段滞后相关稳定偏高,就说明该时段存在可捕捉的季节性结构。
说明相邻周期收益高度同向,市场处于趋势惯性段;可据此把策略从震荡切换为顺势,但需先验证该状态持续度,外汇贵金属杠杆高,错判易放大亏损。