因果推理中的倾向性评分·综合运用
📘

因果推理中的倾向性评分·综合运用

第 3/3 篇

「堆叠模型里跑两遍 25 轮搜寻最优」

这段脚本在元学习框架里做两轮独立搜索,每轮都循环 25 次调用 learn_final_models,把返回的评估指标暂存进 options 列表,实时跟踪 best_res。第一轮把分箱阈值区间锁在 0.3~0.7,第二轮把下界压到 0.1,其他超参(models_number=5、iterations=25、depth=2、bad_samples_fraction=0.5、bins_number=25、coefficient=1.5、Use_IPW=False)完全一致,等于在更宽的下尾里重新探一遍模型表现。 从工程角度看,这种重复 25 轮、打印 'Learn i model' 的写法适合在 MT5 的 Python 环境或外接算力上跑;外汇与贵金属价格序列噪声大,这类集成搜索对过拟合敏感,调 lower_bound 从 0.3 降到 0.1 可能让少数极端样本获得更大权重,实盘前务必用历史数据回测验证。 代码逐行拆解:B_S_B = B_S_B.append(diff_negatives[diff_negatives == True].index) 是把差分结果为负的下标追加进列表;options=[] 与 best_res=0.0 初始化容器和最优值;for i in range(25) 控制 25 次迭代;options.append(...) 每次塞入一个模型元组;if options[-1][0] > best_res 拿本次指标更新最优;print('BEST: '+str(best_res)) 输出当前最佳。第二轮仅 lower_bound=0.1 不同,其余照搬。

MQL5 / C++
B_S_B = B_S_B.append(diff_negatives[diff_negatives == True].index)
options = []
best_res = class="num">0.0
for i in range(class="num">25):
    print(&class="macro">#x27;Learn &class="macro">#x27; + str(i) + &class="macro">#x27; model&class="macro">#x27;)
    options.append(learn_final_models(meta_learners(models_number=class="num">5,
                                                    iterations=class="num">25,
                                                    depth=class="num">2,
                                                    bad_samples_fraction=class="num">0.5,
                                                    bins_number=class="num">25,
                                                    lower_bound=class="num">0.3,
                                                    upper_bound=class="num">0.7,
                                                    coefficient=class="num">1.5,
                                                    Use_IPW=False)))
    if options[-class="num">1][class="num">0] > best_res:
        best_res = options[-class="num">1][class="num">0]
    print("BEST: " + str(best_res))
options = []
best_res = class="num">0.0
for i in range(class="num">25):
    print(&class="macro">#x27;Learn &class="macro">#x27; + str(i) + &class="macro">#x27; model&class="macro">#x27;)
    options.append(learn_final_models(meta_learners(models_number=class="num">5,
                                                    iterations=class="num">25,
                                                    depth=class="num">2,
                                                    bad_samples_fraction=class="num">0.5,
                                                    bins_number=class="num">25,
                                                    lower_bound=class="num">0.1,

参数边界与筛选开关的写法

这段片段里,upper_bound 被设为 10.0,coefficient 取 1.5,Use_IPW 置为 True,说明在最优参数搜寻时把上界卡在 10 倍区间、放大系数 1.5 倍,并启用了逆概率加权来纠偏样本。 末尾用 options[-1][0] > best_res 做滚动比较,只有新算出的结果优于历史最优才更新 best_res,最后打印 BEST 对应的数值。 在 MT5 里验证时,可先把 upper_bound 从 10.0 降到 5.0 观察 best_res 收敛速度,外汇与贵金属波动剧烈,参数过宽可能过拟合,属于高风险调试。

MQL5 / C++
upper_bound=class="num">10.0,
coefficient=class="num">1.5,
Use_IPW=True)))
if options[-class="num">1][class="num">0] > best_res:
    best_res = options[-class="num">1][class="num">0]
print("BEST: " + str(best_res))

◍ 倾向评分模型的边界与落地

倾向性评分把因果推断的框架搬进金融时间序列分类,理论根基扎实,但不是银弹。它最大的实际价值,是让训练出来的模型在新数据上仍能保留样本特征,不至于一过拟合就废。 缺点也得摊开说:匹配质量高度依赖特征工程,naive 匹配在 AUDCAD H1 这类低波动品种上容易吃掉信号;且外汇、贵金属本身高杠杆高风险,任何模型输出都只是概率倾向,不能直接当方向指令。 文末附的三个 py 文件里,propensity_matching_naive.py 训完会在目录吐出 catboost_info,若想接 MT5 实盘,得自己补 export_model_to_ONNX() 把模型转 ONNX——前一篇的存档函数可直接抄。跑通这条链路,你才算把因果推断真正压进了盯盘流程。

常见问题

先固定一组基模型跑25轮调参找局部最优,再换堆叠层配置跑第二轮25轮比对,取验证集误差更低的组合落地。
协变量标准化后截断在[-3,3],匹配容差建议0.05~0.2,并用筛选开关剔除缺失率超30%的变量。
小布可接入你的历史行情与交易标签,自动执行两遍25轮搜寻并标出最优参数边界,你只需确认筛选开关状态。
会,关闭高方差变量虽降噪但可能丢信号,建议先开开关看PS分布再决定,别直接全关。
贵金属跳空多致PS估计偏倚,需加价格断层过滤;该品类杠杆高,模型结论仅作概率参考,实盘务必控仓。