欢迎光临
我们一直在努力

【Python量化实战宝典 #23】多信号综合择时打分手册:加权合成(Python 可跑)

【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. 坑与注意事项

  • 信号同质化:均线/MACD/KDJ 都来自价格,本质同向,重复加权等于只信价格,要加北向/情绪等异质信号。
  • 权重拍脑袋:等权最稳;若调权要有回测依据(如各信号 IC),别凭感觉。
  • 过拟合:在历史上一一调权重会让合成「完美」,实盘失效,权重尽量少调、跨期验证。
  • 滞后叠加:多个滞后信号叠加,合成信号更滞后,适合中低频择时而非日内。
  • 7. 小结与下一篇预告

    多信号综合择时分就位,模块三收口在即。下一篇讲择时策略回测与绩效——年化、夏普、回撤怎么算,验证择时到底值不值。

    下一篇预告:《【Python量化实战宝典 #24】择时策略回测与绩效手册:年化、夏普、回撤(Python 可跑)》

    8. 免责声明

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

    赞(0)
    未经允许不得转载:171主机测评 » 【Python量化实战宝典 #23】多信号综合择时打分手册:加权合成(Python 可跑)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址