基于购买力平价(PPP)和 IMF 数据确定公允汇率·综合运用
(3/3)·从理论到 Python 工程,把购买力平价变成可执行的汇率错配诊断流程
◍ 偏离度分级与信号强度计算
做跨品种套利或均值回归前,先得把「市价相对公允值的偏离」量化出来。下面这段逻辑直接用百分比偏差给货币对贴标签,并顺手算出一个带置信权重的信号强度,开 MT5 接上自己的 fair_value 字典就能跑。 偏离超过 +15% 判为显著高估、低于 -15% 为显著低估,置信量级标 high;±5% 到 ±15% 之间算 moderate 高估或低估;其余归为 fair、量级 low。这个 5% 和 15% 的阈值是经验切分,贵金属与外汇杠杆高、波动剧烈,实盘可能需按品种特性重调。 信号强度不是单纯看偏离多大,而是 abs(deviation) 乘上 fair_value 里的 confidence(缺省 0.5)。同样偏离 10%,置信 0.9 的强度是 9.0,置信 0.3 只有 3.0——小布盯盘里可拿这个字段做排序,优先撸高强度组合。 日志那行把市价、公允值、偏离百分比和状态打印出来,方便你回看哪一对在什么时候拉开了口子。复制下面代码,把 pair、market_rate、fair_value 换成你的实时数据就能验证。
if market_rate and fair_value.get(&class="macro">#x27;fair_rate&class="macro">#x27;): deviation = ((market_rate - fair_value[&class="macro">#x27;fair_rate&class="macro">#x27;]) / fair_value[&class="macro">#x27;fair_rate&class="macro">#x27;]) * class="num">100 # Classify the deviation if deviation > class="num">15: status = &class="macro">#x27;significantly_overvalued&class="macro">#x27; magnitude = &class="macro">#x27;high&class="macro">#x27; elif deviation > class="num">5: status = &class="macro">#x27;overvalued&class="macro">#x27; magnitude = &class="macro">#x27;moderate&class="macro">#x27; elif deviation < -class="num">15: status = &class="macro">#x27;significantly_undervalued&class="macro">#x27; magnitude = &class="macro">#x27;high&class="macro">#x27; elif deviation < -class="num">5: status = &class="macro">#x27;undervalued&class="macro">#x27; magnitude = &class="macro">#x27;moderate&class="macro">#x27; else: status = &class="macro">#x27;fair&class="macro">#x27; magnitude = &class="macro">#x27;low&class="macro">#x27; results[&class="macro">#x27;deviations&class="macro">#x27;][pair] = { &class="macro">#x27;market_rate&class="macro">#x27;: market_rate, &class="macro">#x27;fair_value&class="macro">#x27;: fair_value[&class="macro">#x27;fair_rate&class="macro">#x27;], &class="macro">#x27;deviation_pct&class="macro">#x27;: deviation, &class="macro">#x27;status&class="macro">#x27;: status, &class="macro">#x27;magnitude&class="macro">#x27;: magnitude, &class="macro">#x27;confidence&class="macro">#x27;: fair_value.get(&class="macro">#x27;confidence&class="macro">#x27;, class="num">0.5), &class="macro">#x27;signal_strength&class="macro">#x27;: abs(deviation) * fair_value.get(&class="macro">#x27;confidence&class="macro">#x27;, class="num">0.5) } logger.info(f"{pair}: Market {market_rate:.4f}, Fair {fair_value[&class="macro">#x27;fair_rate&class="macro">#x27;]:.4f}, " f"Deviation {deviation:+.1f}% ({status})")
「用 PPP 合成数据算货币对公允汇率」
基于一篮子商品购买力平价(PPP)合成的 composite_ppp 数据,可以为任意货币对反推理论公允汇率。逻辑分两类:含美元的对直接取对方国家的 composite_ppp_rate,交叉盘则用 base/quote 两国 PPP 相除。 置信度处理上有个细节:交叉盘的 confidence 取两国中较低值,因为弱数据一方会拖累整体可信度。返回结构里除了 fair_rate 和 confidence,还带上了 base/quote 各自的原始 PPP 数据,方便下游做偏差诊断。 偏差分类用硬阈值切分:偏离 >15% 判显著高估给 STRONG_SELL,5%~15% 为高估给 SELL;对称地 <-15% 显著低估 STRONG_BUY,<-5% 低估 BUY;其余归 fair 持 HOLD。外汇与贵金属受宏观扰动大,PPP 偏离只代表均值回归概率,不代表价格必然回摆,实盘需自担高风险。 下面这段 Python 原型可直接照搬到 MT5 的 Python 桥接层做预计算,也可以在 EA 里用结构体重写: # Classify the deviation if deviation > 15: status = 'significantly_overvalued' signal = 'STRONG_SELL' elif deviation > 5: status = 'overvalued' signal = 'SELL' elif deviation < -15: status = 'significantly_undervalued' signal = 'STRONG_BUY' elif deviation < -5: status = 'undervalued' signal = 'BUY' else: status = 'fair' signal = 'HOLD'
# Classify the deviation if deviation > class="num">15: status = &class="macro">#x27;significantly_overvalued&class="macro">#x27; signal = &class="macro">#x27;STRONG_SELL&class="macro">#x27; elif deviation > class="num">5: status = &class="macro">#x27;overvalued&class="macro">#x27; signal = &class="macro">#x27;SELL&class="macro">#x27; elif deviation < -class="num">15: status = &class="macro">#x27;significantly_undervalued&class="macro">#x27; signal = &class="macro">#x27;STRONG_BUY&class="macro">#x27; elif deviation < -class="num">5: status = &class="macro">#x27;undervalued&class="macro">#x27; signal = &class="macro">#x27;BUY&class="macro">#x27; else: status = &class="macro">#x27;fair&class="macro">#x27; signal = &class="macro">#x27;HOLD&class="macro">#x27;
多模型汇率合成的权重自适应
这段逻辑在干一件事:当某个国家在某些购买力平价算法里缺数据,就不硬塞,而是把还在场的算法重新配权重再合成汇率。 signal_strength 用偏离度绝对值乘置信度(默认 0.5)给信号打分,偏离越大、置信越高,分值越重。methods_results 里并列了四种独立算法:基础价位法、GDP 隐含法、通胀调整法、巨无霸代理法,彼此不互相依赖。 主循环遍历所有国家,先收集「有数据」的方法名和对应 rate,再调 _get_adjusted_weights 按可用方法重算权重,最后用 zip 求和得到 composite_rate。实测中若某国只命中 2/4 方法,合成汇率会明显偏离全量加权值,外汇与贵金属价差套利需警惕此类数据缺口导致的高风险误判。
&class="macro">#x27;signal_strength&class="macro">#x27;: abs(deviation) * fair_value.get(&class="macro">#x27;confidence&class="macro">#x27;, class="num">0.5) # Each method works independently methods_results = { &class="macro">#x27;method_1&class="macro">#x27;: self._calculate_price_level_ppp(), &class="macro">#x27;method_2&class="macro">#x27;: self._calculate_gdp_implied_ppp(economic_data), &class="macro">#x27;method_3&class="macro">#x27;: self._calculate_inflation_adjusted_ppp(economic_data), &class="macro">#x27;method_4&class="macro">#x27;: self._calculate_big_mac_proxy_ppp() } # The composite method adapts to available data for country in all_countries: available_methods = [] available_rates = [] for method_name, method_results in methods_results.items(): if country in method_results: available_methods.append(method_name) available_rates.append(method_results[country][&class="macro">#x27;rate&class="macro">#x27;]) if available_rates: # Recalculate weights for available methods weights = self._get_adjusted_weights(available_methods) composite_rate = sum(rate * weight for rate, weight in zip(available_rates, weights))
◍ 把平价偏离当成信号过滤器
跑完 2024 年全量数据,系统吐出一组可直接验证的偏离读数:欧元兑美元公允 0.8753、市场 1.0850,英镑兑美元公允 0.8288、市场 1.2650,美元兑日元公允 136.20、市场 148.50,美元兑瑞郎公允 1.150、市场 0.8850。前三种 G10 货币按购买力平价算都被高估,只有日元在 148 上方被四种算法一致判为低估,置信指数 0.85,是样本里最高的之一。 我没单独拿平价线去开仓,而是把它塞进已有技术系统的过滤层。逻辑很直白:技术面给买入信号,但标的按平价已被显著高估,就砍仓或跳过;信号方向和平价失衡一致时,反而加权重。 外汇和贵金属本身杠杆高、跳空频繁,这种过滤器只调胜率倾向,不消除回撤风险。开 MT5 把上面四个公允值录进全局变量,对照你现有 EA 的 OrderSend 前加一层判断,就能复现这套减仓逻辑。
「从PPP项目里扒出的几条硬经验」
做了几个月购买力平价(PPP)与外汇的对接,对货币市场的认知密度超过了过去多年纯技术分析的积累。PPP 确实有效,但修正节奏远慢于短线直觉——偏离回归往往要拖数月甚至数年,而不是几天几周就能走完。 数据质量是这个系统的命门。实际花在搜数据、交叉验证上的时间,比写算法本身还多;OECD、生活成本、巨无霸实际价这些源里,脏数据会直接带歪权重。 五种简单方法的实盘指向性,比任何神经网络都更稳。PPP 交易核心就一个字:等。多数交易者缺的正是这个,算法时代里基本面反而是跟经济现实不断校准的锚。 代码说到底只是把上述问题落到 MT5 里的扳手,能跑通数据管道比堆模型层数有用得多。
一点提醒
把购买力平价跑通成可用系统,前后耗了数月、数百小时啃经济理论加数十次算法迭代,代码最终以开源 ZIP(PPP_Currency.py,44.66 KB)放出。它不神,只是把 500 年前就有效的经典方法在 MT5/Python 侧做对了工程实现。 社区能补的口子很多:换数据源、改平价算法、接券商 API、做历史回测。外汇和贵金属杠杆高、滑点狠,拿这套系统当信号源前,先在小布盯盘里跑一遍样本外数据再谈信任。 作者原话点明——没必要重造轮子,也不必堆复杂度。你若真想验证,下载那 44 KB 脚本,接上 IMF 数据,看 EUR/USD 的平价偏离是不是还在均值附近晃。