第 6 章 · 04 COP 确认与参数搜索总结 本节摘要:本节是石油货币大项目的收尾。哥伦比亚比索(COP)对 Vasconia 原油,是四个候选货币里唯一被正面确认的石油货币——原油对 COP 的 R² 约 50%,pre-2017 子样本甚至高达 80%;参数网格搜索给出平均收益约 7%、超额收益 α 约 4%(与 NOK 的 α 巧合一致)。我们还会复述整个项目的参数网格搜索结论——双循环 holding × stop 的热力图反复证实:收益与持仓天数强相关,与止损止盈几乎无关。NOK 最优持仓 9 天,COP 最优 17 天。
本节摘要:本节是石油货币大项目的收尾。哥伦比亚比索(COP)对 Vasconia 原油,是四个候选货币里唯一被正面确认的石油货币——原油对 COP 的 R² 约 50%,pre-2017 子样本甚至高达 80%;参数网格搜索给出平均收益约 7%、超额收益 α 约 4%(与 NOK 的 α 巧合一致)。我们还会复述整个项目的参数网格搜索结论——双循环 holding × stop 的热力图反复证实:收益与持仓天数强相关,与止损止盈几乎无关。NOK 最优持仓 9 天,COP 最优 17 天。最后我们用一节"全项目总结"把四节串起来:相关≠因果、petrocurrency 神话的证伪(CAD)与确认(COP)、"模型失效即信号"的 quantamental 思维、dollar effect 识别、制裁/地缘政治对量化模型的破坏(RUB)、以及工具变量思想(非贸易伙伴货币作 base)。读完这一节,你就完成了全教程的第一个高潮大项目。
涉及源码:原项目
Oil Money COP.py(约 380 行);参数搜索复用Oil Money Trading backtest.py(第 02 节精读过)。
⚠️ 注意:本节既是 COP 的正面确认,也是整个第 6 章的总结陈词。前半段讲 COP 本身,后半段把四节缝合成一套完整的 quantamental 思维框架。如果时间紧,后半段的总结比前半段更值得读。
哥伦比亚在石油市场上的存在感很低——不是 OPEC 成员、产量不在全球前 20。但 README 给出一个让人意外的数字:矿物燃料占哥伦比亚出口的 52.5%(2018)。它的最大客户是美国、中国、巴拿马(占其原油出口约 76.4%)。所以从"出口结构"看,哥伦比亚其实是个隐藏的石油经济体,完全有资格做 petrocurrency 检验。
本地原油标的有 Cusiana、Caño Limón、Vasconia、Puerto Bahía、Castilla(API 从轻到重、硫含量从甜到酸)。能从 Bloomberg 拿到价格的只有 Vasconia,所以本项目就用 Vasconia 作为 COP 的原油基准。因为最大客户是美国,WTI 比 Brent 更适合做对照基准(类似 CAD 选 WTI 的逻辑)。
COP 通过了三道检验,这是它区别于 RUB/CAD 的关键:
README 给出 COP 的"平均收益 7%"和"α 约 4%"。这里的 α(超额收益)定义与第 02 节一致:
α = 策略平均收益 − 本国无风险利率
2019 年哥伦比亚本国利率约 4.498%(CEIC 数据)。所以 COP 的 α = 7% − 3% ≈ 4%(取整)。NOK 那边是策略 5% − 挪威央行利率 1% ≈ 4%。两个完全不同的市场、不同的货币、不同的策略频率,α 居然都是 4%——这是一个非常漂亮的巧合,也是 README Discussion 里作者特意点出的"两个 alpha 都大约 4%"。它暗示这套动量策略在不同石油货币上有相近的内在期望收益。
Oil Money COP.py:63-107 对所有回归元(原油/咖啡/煤球/黄金/美元/各种拉美货币)分别对 COP 做单变量 OLS,然后按 R² 从大到小排序画柱状图:
D = {} for i in df.columns: if i != 'cop': x = sm.add_constant(df[i]) y = df['cop'] m = sm.OLS(y, x).fit() D[i] = m.rsquared D = dict(sorted(D.items(), key=lambda x: x[1], reverse=True)) # 按 R² 降序
排序后画图,原油类(WTI/Brent/Vasconia)稳居前列,R² 约 50%。这与 CAD 那张图(烃类全 <5%)形成鲜明对比——同样是产油国货币,CAD 是假石油货币,COP 是真的。

Oil Money COP.py:196-209 对 2017 年前后分别做 Vasconia 对 COP 的单变量 OLS,画 R² 对比:
m = sm.OLS(df['cop'][:'2016'], sm.add_constant(df['vasconia'][:'2016'])).fit() before = m.rsquared # pre-2017 ≈ 80% m = sm.OLS(df['cop']['2017':], sm.add_constant(df['vasconia']['2017':])).fit() after = m.rsquared # post-2017 < 30%
这个 80% vs 30% 的对比,是 COP 被正面确认的核心证据。注意"2017 断点"不是用 K-Means 找的(像 CAD 那样),而是直接用 OPEC 减产协议这个已知的外生事件做切分——这是 quantamental 思维的体现:用基本面事件辅助确定统计断点。
Oil Money COP.py:214-285 用 train_test_split 做 50/50 切分(test_size=0.5, shuffle=False),前一半训练、后一半测试,画出拟合线 + ±1σ/±2σ 置信带。pre-2017 子样本的样本外 R² 约 50%,post-2017 约 40%。两段都没有出现 NOK 那种"价格大幅击穿 2σ"的剧烈失效,但都能找到一两次动量入场机会。
Oil Money COP.py:300-307 直接 import 第 02 节精读过的回测引擎,用 COP 默认参数跑一次:
import oil_money_trading_backtest as om # COP 的 stop 默认值很小(0.001),因为 COPAUD 的价格量级与 NOKJPY 不同 signals = om.signal_generation(dataset, 'vasconia', 'cop', om.oil_money, stop=0.001) p = om.portfolio(signals, 'cop') om.plot(signals, 'cop') om.profit(p, 'cop')
注意 stop=0.001 这个调整——COPAUD 的价格波动幅度比 NOKJPY 小一个数量级,沿用 NOK 的 0.5 止损会一次都触发不了。参数必须随标的的价格量级缩放,这是策略跨市场迁移时最容易踩的坑。
Oil Money COP.py:314-324 复用 NOK 那一套双循环,但 holding 仍是 5~19 天,stop 网格改为 np.arange(0.001, 0.005, 0.0005)(适配 COPAUD 的小波动量级):
dic = {} for holdingt in range(5, 20): for stopp in np.arange(0.001, 0.005, 0.0005): signals = om.signal_generation(dataset, 'vasconia', 'cop', om.oil_money, holding_threshold=holdingt, stop=round(stopp, 4)) p = om.portfolio(signals, 'cop') dic[holdingt, round(stopp, 4)] = p['asset'].iloc[-1] / p['asset'].iloc[0] - 1
Oil Money COP.py:364-373 把收益矩阵画成 sns.heatmap(viridis colormap)。热力图结论与 NOK 完全一致——收益横向(止损)几乎不变,纵向(持仓)变化剧烈。COP 最优持仓是 17 天,止损可在 0.002~0.0045 任选。

收益分布直方图(oil-cop profit distribution.png)是正偏的——"positive fat tail",每个投资者都爱的形状。平均收益约 7%。
同样是动量策略,最优持仓天数差了将近一倍。直觉解释:
| 货币 | 最优持仓 | 直觉 |
|---|---|---|
| NOK | 9 天 | NOK 流动性高,动量衰减快 |
| COP | 17 天 | COP 是新兴市场货币,流动性低,动量持续更久 |
新兴市场货币的趋势通常比发达市场更持久(部分原因是信息传递慢、参与者少),所以 COP 能多吃几天趋势。这不是参数调优的巧合,而是市场微观结构差异在策略上的投影。

至此第 6 章四节全部讲完。把四节缝起来,Oil Money 项目留给读者五条可复用的遗产:
这是全项目的总纲。四个货币的命运差异,本质都在这一句话里:
CAD 的证伪和 COP 的确认形成鲜明对照,证明了"产油国货币=石油货币"这个市场共识不是普遍真理:
| 货币 | 出口石油占比(2018) | 是否石油货币 | 失败/成功原因 |
|---|---|---|---|
| NOK 挪威 | ~62% | 是(确认) | 多元回归 + Elastic Net 都显著 |
| RUB 俄罗斯 | ~53% | 曾是,现否 | 制裁摧毁了 2017 后的解释力 |
| CAD 加拿大 | ~22% | 否(证伪) | 所有烃类 R²<5%,是 dollar effect |
| COP 哥伦比亚 | ~52.5% | 是(确认) | 原油 R²≈50%,pre-2017 达 80% |
注意:出口占比不是充分条件。CAD 的 22% 不算低,但依然被证伪——因为 96% 出口给美国,且市场把 dollar effect 误读成了石油驱动。
这是全项目最值钱的一招。统计套利版策略把"价格突破 2σ"当成止损出逃点;动量版策略把它重新定义为入场点——同一个事件,两种解读,盈亏天壤之别。
更深的逻辑是:模型破裂意味着基本面发生了投资者预期的根本变化(如北海炼能扩张),这种变化会持续相当长一段时间,这正是 CTA(趋势跟随)赚钱的方式。quantamental 的精髓就在这里——量化模型给出信号,但信号的解读要靠基本面直觉。Nick Patterson(冷战密码学家、文艺复兴雇员)的那句话在这里再次回响:"Renaissance 用的就是简单一元回归,简单但有效,前提是知道如何避开那些坑。"
商品多以美元计价,所以"商品 vs 美元计价货币"的相关性里,有很大一块是共同的"美元分母"贡献的。识别招式:把所有变量换算到非美元基准(AUD/JPY)下,如果相关消失,就是 dollar effect。这个验招成本极低,但能避开大量统计假象。它是第 01 节工具变量思想的具体应用。
RUB 是反面教材的极致。一个本来 R²>80% 的强模型,在制裁面前系数都能反转。教训是:面对受地缘政治高度影响的标的,量化模型的有效期可能只有几个月。作者结论粗暴——DON'T TRADE IT。这不是模型无能,而是某些资产的"政治 beta"远超"石油 beta",再聪明的模型也救不回来。
回归元按 R² 排序画柱状图。COP 和 CAD 都用了这招,但对比效果天差地别(COP 原油类登顶、CAD 烃类垫底)。这是判断"某商品是否驱动某货币"的第一步快速验招。
用已知基本面事件做断点。COP 用 OPEC 减产(2017)切分,RUB 用制裁升级切分,都比无监督找断点更有解释力。K-Means(CAD 那种)是断点不明时的 fallback,不是首选。
跨标的迁移策略时,按价格量级缩放 stop。COP 的 stop=0.001 vs NOK 的 stop=0.5,差了 500 倍,纯粹因为 COPAUD 价格量级比 NOKJPY 小。照搬参数是跨市场迁移最常踩的坑。
看热力图纵向 vs 横向的对比。holding(纵)敏感、stop(横)不敏感——这种"单参数主导"的形状是动量策略的指纹。如果是反转策略,通常会反过来(stop 更重要)。热力图形状本身能告诉你策略类型。
正偏分布是策略健康度的信号。COP 的收益分布是 positive fat tail(右偏),意味着亏是小亏、赚是大赚。这种形状的策略即使胜率不高,长期也能盈利。反过来左偏(亏是大亏)就要警惕。
本国利率作无风险利率算 α。COP 的无风险利率用哥伦比亚本国利率(4.498%),不是美元利率。因为策略本币是 COP,机会成本是 COP 存款利率。算 α 时利率的币种要和策略匹配。
第 6 章结束。你已经完成了全教程的第一个高潮大项目——石油货币 quantamental。下一章(第 7 章)会把同样的 quantamental 思维用到农业商品上(Smart Farmers 项目),并且把 Oil Money 里的回归工具升级为凸优化(convex optimization)。从"找相关"到"求最优解",旅程继续。