【Python量化实战宝典 #23】多信号综合择时打分手册:加权合成(Python 可跑)
手册定位:模块三第 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):
"""signals: dict{名称: 取值∈{-1,0,1}}。返回加权总分与仓位档位。"""
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()) # 范围约 [-1, 1]
# 仓位:>0.2 满仓, <-0.2 空仓, 中间半仓
pos = 1.0 if score > 0.2 else (0.0 if score < –0.2 else 0.5)
return score, pos
def run_check():
# 演示:6个信号里 4 看多 2 看空
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. 坑与注意事项
7. 小结与下一篇预告
多信号综合择时分就位,模块三收口在即。下一篇讲择时策略回测与绩效——年化、夏普、回撤怎么算,验证择时到底值不值。
下一篇预告:《【Python量化实战宝典 #24】择时策略回测与绩效手册:年化、夏普、回撤(Python 可跑)》
8. 免责声明
本文为择时合成方法示例,演示数据为虚构,不构成投资建议。




