【Python量化实战全攻略 #23】多信号综合择时打分手册:加权合成(附代码)
摘要:【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. 坑与注意事项
- 信号同质化:均线/MACD/KDJ 都来自价格,要加北向/情绪等异质信号。
- 权重拍脑袋:等权最稳;调权要有回测依据。
- 过拟合:在历史上一一调权重会让合成「完美」,实盘失效。
- 滞后叠加:多个滞后信号叠加,适合中低频择时而非日内。
7. 小结与下一篇预告
多信号综合择时分就位。下一篇讲择时策略回测与绩效——年化、夏普、回撤怎么算。
下一篇预告:《【Python量化实战全攻略 #24】择时策略回测与绩效手册:年化、夏普、回撤(附代码)》
8. 免责声明
本文为择时合成方法示例,演示数据为虚构,不构成投资建议。
关于数据来源:本文综合择时所需的各子信号来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #17–#22),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲择时回测绩效。
想亲自试一下?免费获取证书