跳转至

⚠️ 免责声明:本章仅为教育与研究方法展示,不构成任何投资建议。 所有回测结果来自历史数据,不代表未来表现。投资有风险,决策需独立判断。

第五课:信号交易——别人的建议能跟吗

本章代码: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-1

5.3 这套信号值得跟吗

先做正确的比较——不是和"全历史买入持有"比,而是和信号覆盖的同一段区间(2012—2019)比:

信号交易:累计 +78.9%(年化 6.7%)
同期买入持有沪深300:累计 +34.7%(年化约 4.3%)
→ 信号跑赢了,但只赢一点点

再看一个残酷的事实:138 笔交易只有 7.1 年的样本。7 年对交易系统来说太短了——一个 52.9% 胜率的随机信号,在 138 次抛硬币里跑赢买入持有的概率并不低。所以诚实的结论是:这套信号"看起来"跑赢了,但样本太小,无法排除运气。

但这个框架的真正价值不在这里——在于:你可以拿任何信号源来测。 GOR 方向信号、六大师共识、朋友推荐、微信群喊单——全部可以用同一个框架跑一遍,看结果。

5.4 这一课教了你什么

  1. 信号交易是一个"评估框架"——不产生信号,只检验信号。
  2. 计算每笔交易的对数收益、胜率、年化、最大回撤、VaR。
  3. 我们测试的信号源年化 6.7%,同期跑赢买入持有(约 4.3%)——但 7 年样本太短,无法排除运气。框架本身是普适的。
  4. 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 课)

  1. 入门:换指数。把演示指数从 000300.SH 换成 000016.SH(上证50)、 399001.SZ(深证成指),138 笔交易的结果一样吗? 这套信号是不是只对沪深300 有效?
  2. 进阶:随机信号对照组。用 np.random.default_rng(42).random 生成 138 个 随机买卖点(买价取当日收盘价),跑同一个框架。 随机信号的年化是多少?如果随机信号也能"跑赢",你还会信这个框架的结论吗?
  3. 挑战:检验你自己的信号源。把你信任的任何信号(GOR 方向、分析师评级、 朋友推荐、你自己的直觉)转成买卖日期,用这个框架回测。 结果可能让你重新审视"我觉得它挺准的"。

下节预告: 你知道了自己的收益是多少。但你的收益长什么样?是钟形曲线吗?如果不是——VaR 还靠得住吗?第六课回答这个问题。