第 17 篇
指标效果的统计分析
「RSI 低于 20 就买」——为什么是 20,不是 18 或 22?本篇给一套系统做法:把历史上每个指标值出现后的涨跌记成赢/平/输,画叠加条形图,再设定「区间宽度 w + 最小数据比 θ」扫出赢输比最高、样本又够的区间当信号。示例(002200,5 日收益率指标)得最佳区间 [1.12,1.16](赢输比 1.43),全宽度扫描得宽度 19 的 [1.12,1.31](赢输比 1.72)。本篇是量化课堂第 17 篇(postId=2086,作者肖睿,编辑宏观经济算命师,难度进阶上,level-1)。素材见 raw/collections/jq-quant-classroom/17-17-指标效果的统计分析md.md。
这是什么
一篇讲「怎么用历史数据检验一个指标到底有没有用」的方法论文。它不判断某个具体指标,而是给一套通用流程:定义指标 → 定义结果(赢/平/输)→ 统计每个指标值对应的频次 → 画图 → 用「宽度 + 最小数据比」找可信的最佳触发区间 → 讨论怎么把结果嵌进策略(分股统计、每日更新、可接凯利)。本系列 part 10(均值回归进阶)已经用过这套方法——10 篇正文注明它引自 post 2086,即本篇。
核心要点
动机:指标用得糙
- 现代金融理论立场:价格大多时间服从随机游走,但在特定时刻(基本面或供需变化)会偏离并选方向;这些时刻常有「信号」先兆,抓到就能赚钱。
- 指标(MACD、RSI 等)就是把历史数据算成数值、判断有没有信号。但用法常是粗糙的:「RSI<20 买入」为什么是 20?18 或 22 会不会更好?——要回答就得历史统计。
统计的对象:指标 + 结果
- 指标:一个函数 Ind(T),输入时间 T(含 T 之前所有数据),输出该时点的指标数值。例:过去 5 天收益率 = 今日收盘 / 5 天前收盘 − 1。
- 结果:指标预测的事件发生没有,分赢 / 平 / 输。
- 本篇例子:假设过去 5 天涨得越多、未来越可能跌。观测「未来第五天」:第五天收盘 < 今日收盘记赢、> 记输、= 记平。
- 赢平输的判定标准「有拍脑袋成分」:缺点是不全面,优点是直观、方便应用;不满意可以改判定标准重来。
数据统计流程
- 取历史所有交易日数据,去掉停牌日。
- 示例数据:
get_price('002200.XSHE', start_date="2006-02-02", end_date="2016-02-02", frequency='daily', fields=['close'], skip_paused=True)。 - 对每个不停牌日:算指标(四舍五入到合适小数位)、算未来结果、记成 (指标值, 赢/平/输) 事件;最后统计每个指标值出现的赢平输次数(pandas DataFrame:value/win/even/lose 列)。
制图
- matplotlib 叠加条形图:x 轴 = 指标值,y 轴 = 出现次数;红 = 输、黄 = 平(bottom=输)、绿 = 赢(bottom=输+平)。代码要点:
plt.bar(values, loses, width=0.008, color='r')等,用 bottom 参数叠起来。 - 更直观:画「赢 − 输」的蓝色条形图,正负一眼看出哪段赢面大。
统计结果不能乱用(两个坑)
- 紫色标注处:某单点胜率很高,但 (a) 恰好等于这个值(如 5 日收益率 = 1.17)的概率极小,可能若干年不出现;(b) 紧挨着的 1.18 胜率并不高——指标算出来是 1.175 时根本没法判断。单点不可靠。
- 棕色框处:某区域只有赢没有输,但样本量太小,完全无法保证统计准确。样本太少不可信。
选「赢输比最高」的区间
- 办法:设区间宽度 w(band_width)与最低数据比 θ(least_percentage)。滑动扫描每个宽度为 w 的区间:若区间内数据量 ≥ 总数据量 × θ 才保留,算区间赢输比,最后取赢输比最高的区间。
- 函数:
find_best_region(statistics, tick_width, least_percentage, band_width),返回 Series(low/high/ratio)。代码要点:赢输比 = 区间赢数 /(区间输数 + 1),输数加一避免除以零;low/high 由 tick_width 的整数倍滑动。 - 示例:tick_width=0.01、least_percentage=0.03、band_width=4 → 区间 [1.12, 1.16],赢输比 1.43。(图中另有 w=4 在 1.08~1.11 的 66:58 例子。)
- 更彻底:把所有宽度都试一遍。
find_absolute_best_region(statistics, tick_width, least_percentage, least_width, most_width)对每个宽度先求该宽度最佳、再取全体最佳。 - 示例:least_percentage=0.05、least_width=2、most_width=30 → 得宽度 19 的区间 [1.12, 1.31],赢输比 1.72——这是保证 5% 数据量下能找到的最大赢输比。
嵌入策略的三条纪律
- 不同股票要分开统计:每支股票「个性」不同、指标关联程度不同;一支股票的最佳区间换到另一支可能效果截然不同。
- 每日更新统计与最佳区间:最好把算法嵌进策略、每日重算。否则区间会过时;而且「用现在的最佳区间去回测历史」对历史交易日来说是未来数据,会给出虚高的回测效果。
- 可接凯利公式:统计给出的是成功率,可用凯利公式优化仓位(用法留作作业,链接 post 1311)。
机制 / 论证
- 为什么用频次而不是感觉:指标的阈值(RSI=20)本来没有理论依据。把「指标值 → 未来涨跌」变成一张频次表,等于让历史数据投票,选「投票胜率最高」的区间。
- 为什么必须设宽度 w:单点的胜率可能是运气(1.17 孤立点)。用一段区间聚合样本,胜率才稳定、信号才可能真的出现。
- 为什么必须设最小数据比 θ:没有 θ,可能挑中「赢 3 输 0」但总共就 3 个样本的区间——纯属运气。θ 保证选中的区间样本量够,统计结论才可信。
- 为什么分股统计 + 每日更新:最佳区间是因股票、因时段而异的。固定一套区间跨股票用会失效;用「现算出的最佳区间」回测历史等于偷看未来(未来函数),收益虚高。这两条是把这套方法从「事后分析」变成「可用策略」的开关。
- 反直觉点:图上最高的胜率点(1.17)恰恰不可用——胜率高但「信号不会出现 + 相邻值不稳定」;赢输比 1.72 也不保证单次准确,它只是长期频次占优。统计给的是赔率优势,不是确定性。
可操作
- 流程与参数(保留原文):
- 数据:get_price(..., skip_paused=True) 去停牌;指标值四舍五入。
- 统计:pandas DataFrame(value/win/even/lose),未来第 N 天定赢平输。
- 制图:plt.bar 叠加(红输/黄平/绿赢,bottom 参数)或赢−输蓝条。
- 找区间:find_best_region(statistics, tick_width, least_percentage, band_width);赢输比 = win/(lose+1)。
- 全宽度:find_absolute_best_region(statistics, tick_width, least_percentage, least_width, most_width)。
- 示例参数与结果:tick_width=0.01, θ=0.03, w=4 → [1.12,1.16] 比 1.43;θ=0.05, least=2, most=30 → 宽度 19 的 [1.12,1.31] 比 1.72。
- 嵌入纪律:分股统计、每日重算、可用凯利优化仓位。
- 平台 API:取数用 get_price(见 聚宽行情与财务数据获取 API);统计与制图用 pandas / matplotlib(研究环境);本篇给了可运行代码,但代码里的
df.sort(['value'])等写法是当时版本风格。 - 应用实例:本系列 part 10 已把同一套方法用在「偏离倍数 ρ」上(赢输判定用 T 天 + uσ/dσ 止盈止损线),详见 均值回归进阶策略。
术语
- 指标函数 Ind(T):输入时间(及之前数据)、输出指标数值的函数。
- 赢 / 平 / 输:按「指标预测的事件」把结果三分;判定标准可自定。
- tick_width:指标值的最小跳动间隔(示例 0.01)。
- band_width:区间宽度(几个 tick 宽)。
- least_percentage:最低数据比 θ,区间样本必须占总样本的这个比例以上才保留。
- 赢输比:区间赢数 /(输数+1)。
- 未来数据 / 未来函数:用「当时还拿不到的信息」(如现在才确定的最佳区间)做回测,造成虚高收益。
- skip_paused:跳过停牌日取数。
不确定 / 待验证
- 图 2 的 x 轴标注写作「收盘价除以 22」,与上下文(指标是 5 日收益率、区间约 1.08~1.31)不符,疑为笔误 [需要验证];图 3 的标注「5 日收益率」才是正解。
- 赢平输的判定「拍脑袋」成分是作者自认的:换判定标准会换统计结论,正文没有给「怎么选判定才稳」的准则。
- 示例只用单只股票 002200(2006-02-02~2016-02-02);不同股票要分开统计,因此这个 [1.12,1.16] / [1.12,1.31] 不能直接搬到别的股票。
- θ(0.03/0.05)与宽度范围(2~30)是示例参数,无理论最优;θ 越小越容易过拟合,文中未展开这个权衡。
- 赢输比 1.72 对应的策略年化/回撤没有给出——本篇只验信号、不发策略。
- 「统计 = 频次描述」而非严格推断(无 p 值/置信区间);与更严谨的回测偏差方法论(QuantStart 系列,W9)的关系待对照。
相关
- 指标效果的历史频率统计(赢平输频次与最佳区间) — 指标效果统计的系统概念页(本篇核心对象)
- 均值回归进阶策略 — 本方法在「偏离倍数 ρ」上的实际应用(10)
- 均值回归(买超跌赌反转) — 用赢输统计定入场区间的策略家族
- 有效市场是半个真理 — 「价格多数时间随机游走、信号来自偏离」的立场背景
- 聚宽量化课堂(低频量化策略 43 篇) — 量化课堂 43 篇总览
更新 2026-09-06