← 返回博客列表

【Python量化实战全攻略 #23】多信号综合择时打分手册:加权合成(附代码)

2026年10月20日 09:28 · 智兔数服 · Python量化实战全攻略

摘要:【Python量化实战全攻略 #23】多信号综合择时打分手册:加权合成(附代码) 手册定位:模块三第 7 篇。前面 6 篇各出一种择时信号(均线/MACD/KDJ-BOLL/动量反转/北向/情绪)。本篇把它们 加权合成一个总择时分 ,避免单

手册定位:模块三第 7 篇。前面 6 篇各出一种择时信号(均线/MACD/KDJ-BOLL/动量反转/北向/情绪)。本篇把它们加权合成一个总择时分,避免单一信号失灵。
数据来源复用 #17–#22 各信号(分别用各自端点取数后归一)。

1. 你将得到什么

  • 把多个择时信号统一成 0/1 或 -1/0/1 后加权合成的方法;
  • 用信号一致性做仓位调节;
  • 合成择时分的输出与回测衔接;
  • 综合合成的 4 个坑(信号同质化、权重拍脑袋、过拟合、滞后叠加)。

2. 取数约定(复用)

子信号 来源篇 见
均线/MACD/KDJ-BOLL/动量反转 #17–#20 各自篇
北向/情绪 #21–#22 各自篇

3. 数据来源(复用,不重复罗列)

本篇是合成层,各信号字段详见 #17–#22,不新增接口。

4. 核心模板函数(自包含可跑)

import pandas as pd
import numpy as np

_MOCK = True


def composite_timing(signals, weights=None):
    keys = list(signals.keys())
    vals = pd.Series({k: signals[k] for k in keys})
    if weights is None:
        weights = pd.Series(1.0 / len(keys), index=keys)
    score = float((vals * weights).sum())
    pos = 1.0 if score > 0.2 else (0.0 if score < -0.2 else 0.5)
    return score, pos


def run_check():
    sig = {"均线": 1, "MACD": 1, "KDJ_BOLL": 0, "动量": 1, "北向": -1, "情绪": 1}
    score, pos = composite_timing(sig)
    assert -1.01 <= score <= 1.01 and pos in (0.0, 0.5, 1.0)
    print("校验通过 | 合成择时分=%.2f 建议仓位=%.0f%%" % (score, pos * 100))
    return score, pos


if __name__ == "__main__":
    run_check()

5. 跑通示例

score, pos = run_check()
print("看多信号数:", sum(1 for v in {"均线":1,"MACD":1,"动量":1,"情绪":1}.values() if v == 1))

6. 坑与注意事项

  1. 信号同质化:均线/MACD/KDJ 都来自价格,要加北向/情绪等异质信号。
  2. 权重拍脑袋:等权最稳;调权要有回测依据。
  3. 过拟合:在历史上一一调权重会让合成「完美」,实盘失效。
  4. 滞后叠加:多个滞后信号叠加,适合中低频择时而非日内。

7. 小结与下一篇预告

多信号综合择时分就位。下一篇讲择时策略回测与绩效——年化、夏普、回撤怎么算。

下一篇预告:《【Python量化实战全攻略 #24】择时策略回测与绩效手册:年化、夏普、回撤(附代码)》

8. 免责声明

本文为择时合成方法示例,演示数据为虚构,不构成投资建议。


关于数据来源:本文综合择时所需的各子信号来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #17–#22),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲择时回测绩效。

想亲自试一下?免费获取证书