⚠️ 免责声明:本章仅为教育与研究方法展示,不构成任何投资建议。 所有回测结果来自历史数据,不代表未来表现。投资有风险,决策需独立判断。
第五课:信号交易——别人的建议能跟吗¶
本章代码:
code/lesson5_signals.py运行方式:python lesson5_signals.py
5.0 策略概述¶
这是什么策略¶
前四课都是"我自己决定什么时候买卖"。这一课换一个角色:"别人给了我买卖信号,我怎么判断这些信号靠不靠谱?"
这是一个评估框架,不是一个交易策略。它不产生信号——它检验信号。
它回答什么问题¶
| 问题 | 白话 |
|---|---|
| 这个信号源的胜率是多少? | 赚钱的交易占百分之几 |
| 每笔交易平均赚多少? | 对数收益率的均值 |
| 累计能赚多少? | 所有交易收益加起来 |
| 最坏一笔亏多少? | VaR 99%——单笔交易的最坏 1% |
| 这个信号源值得跟吗? | 年化收益 > 买入持有 → 值得 |
5.1 真实案例:一套不知来源的交易信号¶
2012 年到 2019 年,有人用一套信号系统在 16 个 A 股指数上做了交易。我们不知道这套信号是怎么产生的——可能是技术分析、可能是基本面、可能是扔硬币。
我们只知道结果:138 笔交易,买入和卖出日期。
import pandas as pd
import numpy as np
# 读取价格和信号(数据已打包在仓库里)
stock = pd.read_csv("data/交易策略1/stock.csv", encoding="utf-8-sig")
signal = pd.read_csv("data/交易策略1/signal.csv", encoding="utf-8-sig")
# 合并:把价格和信号对齐
df = pd.merge(stock, signal, on="日期", how="left")
# 筛选有信号的交易日
trades = df[(df["sell"] == 0) | (df["sell"] == 1)].copy()
信号的格式很简单:偶数行 = 买入,奇数行 = 卖出。每次买入和下一次卖出配成一对交易。
# 沪深 300 的买入价格(偶数行)和卖出价格(奇数行)
CODE = "000300.SH"
buy_prices = trades.iloc[0::2][CODE].values # 第 0, 2, 4, ... 行
sell_prices = trades.iloc[1::2][CODE].values # 第 1, 3, 5, ... 行
# 每笔交易的对数收益
log_returns = np.log(sell_prices / buy_prices)
# 对数收益的好处:可以直接相加 = 累计收益
5.2 用真实数据跑一遍¶
CSI300,138 笔交易,7.1 年:
交易笔数:138
胜率:52.9%
平均每笔:+0.42%(对数收益)
累计收益:+78.9%
年化收益:6.7%
最大回撤:-16.4%
VaR 99%:-7.9%(最坏的 1% 交易亏 7.9%)
图 5-1:138 笔交易收益分布。 绿柱 = 盈利交易,红柱 = 亏损交易。横虚线 = 平均收益。注意:大部分盈利是"小赚",少数亏损是"大亏"——这是交易策略的典型特征。胜率 52.9% 看起来不高,但赢的时候赚的比输的时候亏的多一点点——这一点点差距在 138 次复利后变成了 +78.9%。

5.3 这套信号值得跟吗¶
先做正确的比较——不是和"全历史买入持有"比,而是和信号覆盖的同一段区间(2012—2019)比:
信号交易:累计 +78.9%(年化 6.7%)
同期买入持有沪深300:累计 +34.7%(年化约 4.3%)
→ 信号跑赢了,但只赢一点点
再看一个残酷的事实:138 笔交易只有 7.1 年的样本。7 年对交易系统来说太短了——一个 52.9% 胜率的随机信号,在 138 次抛硬币里跑赢买入持有的概率并不低。所以诚实的结论是:这套信号"看起来"跑赢了,但样本太小,无法排除运气。
但这个框架的真正价值不在这里——在于:你可以拿任何信号源来测。 GOR 方向信号、六大师共识、朋友推荐、微信群喊单——全部可以用同一个框架跑一遍,看结果。
5.4 这一课教了你什么¶
- 信号交易是一个"评估框架"——不产生信号,只检验信号。
- 计算每笔交易的对数收益、胜率、年化、最大回撤、VaR。
- 我们测试的信号源年化 6.7%,同期跑赢买入持有(约 4.3%)——但 7 年样本太短,无法排除运气。框架本身是普适的。
- 52.9% 的胜率就够了——只要赢的时候比输的时候多赚一点点。
5.5 课堂问答¶
问:胜率只有 52.9%,这也能赚钱?
能。交易不是靠胜率赚钱——是靠"盈亏比"。赢的时候平均赚 4%,输的时候平均亏 3%——52.9% × 4% > 47.1% × 3%。138 次复利后变成了 +78.9%。这就是为什么"胜率"是最容易误导人的指标——你应该看的不是"对了几次",是"对的时候赚的够不够多"。
问:这个框架能用来测 GOR 方向信号吗?
能,而且是设计它的目的之一。你把 GOR 每天的方向判定(配什么、配多少)转化成买卖信号,然后用这个框架回测过去 3 年的表现。胜率、年化、最大回撤全出来——你就知道 GOR 信号在历史上到底靠不靠谱。这比"我觉得 GOR 挺准的"强一万倍。 5. 这个框架是你未来评估任何外部建议的工具——包括六大师、GOR 方向、甚至你自己的直觉。
动手练习(第 5 课)¶
- 入门:换指数。把演示指数从
000300.SH换成000016.SH(上证50)、399001.SZ(深证成指),138 笔交易的结果一样吗? 这套信号是不是只对沪深300 有效? - 进阶:随机信号对照组。用
np.random.default_rng(42).random生成 138 个 随机买卖点(买价取当日收盘价),跑同一个框架。 随机信号的年化是多少?如果随机信号也能"跑赢",你还会信这个框架的结论吗? - 挑战:检验你自己的信号源。把你信任的任何信号(GOR 方向、分析师评级、 朋友推荐、你自己的直觉)转成买卖日期,用这个框架回测。 结果可能让你重新审视"我觉得它挺准的"。
下节预告: 你知道了自己的收益是多少。但你的收益长什么样?是钟形曲线吗?如果不是——VaR 还靠得住吗?第六课回答这个问题。