作者:老余捞鱼
原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。
本文约 3800 字 | 预计阅读 8 分钟
· · ·
三年,21笔交易,赚了7笔,胜率只有33.3%。
你大概率觉得这策略不行吧。但它三年总收益是73.72%。
这不是什么深度学习模型,也没用到情绪分析或新闻数据。它只靠一个1990年代就有的老指标:PPO,百分比振荡器(Percentage Price Oscillator)。它是MACD的表兄弟,核心逻辑几乎没变,只改了一个细节。
把减法变成了除法。
这一除,价格6万的BTC和6块钱的小票,就可以用同一套参数看同一个指标了。
下面把原理、回测数据、Python代码全部拆开。看完你应该能在自己电脑上跑一遍。
一、MACD的一个老问题
先说MACD是什么。如果你用了很多年,直接跳到第二节。
MACD不复杂,分三步:
- 算两条EMA(指数移动平均线):一条快线(通常12周期)、一条慢线(通常26周期);
- 快线减慢线,得到MACD线(DIF线);
- 对MACD线再做9周期EMA平滑,得到信号线(DEA线)。
MACD柱就是这两条线的差值。
但问题出在第2步,快线减慢线,得到的是一个绝对差值。
BTC当下在6万美元左右波动,12周期EMA和26周期EMA的差值,大概3000上下。换成一只10块钱的小票,快慢线差值可能只有0.3。
同一个数字3000,在BTC身上代表一段不小的动量,在一只10块钱的股票身上根本不成立。因为那股票一整年的波动可能都不超过2块钱。
我早些年用MACD做多品种筛选,每换一个标的就得手动校准参数、重新看回测、反复调阈值。费时间不说,最要命的是换到新标的上根本没有参考系,MACD的数值本身不含”当前价格”这个信息。
二、PPO只改了一步
PPO的公式写出来就一行:
PPO = (EMA快 − EMA慢) ÷ EMA慢 × 100
就是把MACD的差值,除以慢线(分母),再乘100变成百分比。
PPO=5 是什么意思?快线当前比慢线高了5%。标的是6万美元还是6块钱,5%就是5%,含义一致。
这就是PPO相对MACD唯一的核心改动。一步。也是它最重要的价值。

图1:PPO百分比归一化 vs MACD绝对值不可比
举一个可以用口算的例子。假设某天:
- 快线(12周期EMA)= 68,500
- 慢线(26周期EMA)= 65,200
算一下:
PPO = (68,500 − 65,200) ÷ 65,200 × 100= 3,300 ÷ 65,200 × 100≈ 5.06
PPO=5.06,表示短期动量比长期趋势高了约5%,偏多。
如果过几天价格跌了,快线掉到64,000,慢线还在65,200附近:
PPO = (64,000 − 65,200) ÷ 65,200 × 100= −1.84
PPO翻负了,动量从多转空。
这个正负切换的点,恰好就是PPO最经典的策略入口:零线交叉。
三、最简单的策略:只看一条线
零线交叉的逻辑可以用一句话说清楚:
- PPO从负数上穿0:快线重新超过慢线,动量翻多,开多
- PPO从正数下穿0:快线跌破慢线,动量翻空,离场

图2:零线交叉信号逻辑:上穿0动量翻多,下穿0动量翻空
Python里用TA-Lib实现,一行代码就算完:
import talib
ppo = talib.PPO(close_prices, fastperiod=12, slowperiod=26, matype=0)
entries = ppo > 0 # PPO > 0,动量偏多
exits = ppo < 0 # PPO < 0,动量偏空这里有个细节要说清楚。matype=0 代表用SMA(简单移动平均)做平滑,而教科书版PPO默认用EMA(matype=1)。SMA对近期价格变化的反应比EMA更迟钝,所以零线穿越的时间点会不一样。
下面回测跑的是matype=0版本。如果你换成matype=1跑同一段数据,交叉信号会出现在不同的时间点,胜率和收益数字也跟着变。文末给了Colab链接,你可以自己改参数对比。
四、用BTC做三年回测
回测条件:
| 项目 | 设置 |
|---|---|
| 标的 | BTC-USD 日线 |
| 时间窗口 | 约3年 |
| 参数 | fast=12, slow=26, matype=0 |
| 费用 | 扣除手续费和滑点 |
核心数据:
| 指标 | 数值 |
|---|---|
| 总交易次数 | 21笔 |
| 盈利次数 | 7笔(胜率33.3%) |
| 平均盈利 | $3,931.94 |
| 平均亏损 | $1,562.72 |
| 盈亏比 | 约2.5:1 |
| 总收益 | 73.72% |


图3:BTC三年回测核心数据
完整交易日志:
| 入场日期 | 出场日期 | 入场均价 | 出场均价 | 净盈亏($) |
|---|---|---|---|---|
| 2023-09-18 | 2024-01-20 | 26,781 | 41,624 | +5,429 |
| 2024-02-05 | 2024-03-25 | 42,701 | 69,889 | +9,674 |
| 2024-04-03 | 2024-04-15 | 66,047 | 63,363 | −1,221 |
| 2024-05-18 | 2024-06-16 | 67,008 | 66,572 | −348 |
| 2024-07-19 | 2024-08-06 | 66,777 | 55,978 | −4,026 |
| 2024-08-25 | 2024-09-05 | 64,398 | 56,104 | −2,709 |
| 2024-09-19 | 2024-10-09 | 63,003 | 60,522 | −815 |
| 2024-10-17 | 2024-12-27 | 67,467 | 94,071 | +6,351 |
| 2025-01-12 | 2025-02-06 | 94,583 | 96,497 | +279 |
| 2025-03-28 | 2025-04-06 | 84,438 | 78,136 | −1,918 |
| 2025-04-20 | 2025-06-06 | 85,259 | 104,286 | +4,600 |
| 2025-06-17 | 2025-06-21 | 104,706 | 102,155 | −844 |
| 2025-07-03 | 2025-08-03 | 109,758 | 114,103 | +799 |
| 2025-08-14 | 2025-08-25 | 118,478 | 110,014 | −2,083 |
| 2025-09-13 | 2025-09-28 | 116,066 | 112,011 | −1,042 |
| 2025-10-05 | 2025-10-18 | 123,637 | 107,091 | −3,306 |
| 2025-12-09 | 2025-12-18 | 92,784 | 85,377 | −1,766 |
| 2026-01-05 | 2026-01-26 | 93,976 | 88,179 | −1,285 |
| 2026-03-07 | 2026-03-28 | 67,340 | 66,253 | −416 |
| 2026-04-11 | 2026-05-22 | 73,127 | 75,413 | +392 |
| 2026-07-11 | 2026-07-12 | 63,866 | 63,758 | −99 |
这张表比总结数字更有信息量。看两件事:
第一,大赢都在趋势行情里。 2024年初BTC从2.6万拉到4.1万,PPO给了一个干净的多头信号,这笔赚了5,429。紧接着2月到3月那波更猛,从4.2万拉到6.9万,赚了9,674。光这两笔就占了总利润的大头。
第二,中间有一段密集亏损期。 2024年4月到10月,连续6笔亏损。这段恰好是BTC横盘整理阶段,PPO在零线附近来回穿,每次触发信号后很快又反向穿,产生一连串小额亏损。动量指标在震荡市里就这个德性。
五、盈亏不对称才是内核
很多人盯着胜率看。33%,7胜14负,直觉上确实不漂亮。
但算一下:平均盈利$3,931.94,平均亏损$1,562.72。
每次赢的时候赚的钱大约是每次输的2.5倍。这才是策略活下来的原因。

图4:盈亏不对称:少数大赢覆盖多数小亏
动量策略的底层逻辑不是猜对方向,它根本不判断未来走势。它做的事情是:趋势来了就跟住,趋势没来就挨打。PPO的零线交叉信号本质上是帮你附着在一段持续的动量上。趋势走了多远,你就跟了多远。中间不判断、不加主观干预。
震荡市里它反复亏损不是错误,而是它本来就不是为震荡市设计的。这个工具的工作条件就是”趋势存在”。
这和很多人的直觉相反:一个好的策略不一定是胜率高的策略。能让赢的时候赚的比输的时候亏的多得多的策略,即使输多赢少,也能跑出正期望值。
六、适用场景
适合的场景:
- 趋势明确的资产:BTC趋势段、强势板块中个股、动量驱动的品种;
- 中长周期:日线及以上级别,信号比较干净;
- 作为动量过滤器,配合其他条件一起用;
- 需要跨品种横向对比时,PPO天然可跨品种。
不适合的场景:
- 横盘震荡行情:零线附近会反复触发,磨损严重;
- 极短周期:分钟级别噪音太大,信号密度过高;
- 独立使用:任何单一指标做决策都有风险,PPO也不例外。
MACD在这些场景下其实也有同样的问题,因为底层逻辑一样。PPO的优势只在百分比归一化这一件事上,但底子还是趋势跟踪。趋势不在的时候,什么指标都扛不住。
七、代码分享
分享Google Colab上完整的Notebook,包含数据拉取、PPO计算、信号生成、回测和图表:
https://colab.research.google.com/drive/1jMXV5nwRsWDbmouyaaPxm8tJjcaM8oRU
想自己改的话,换ticker、调fast/slow周期、或者matype切到1跑EMA版本对比,结果会不一样。
需要强调的是,单靠这一个指标不可能稳定盈利。但PPO作为一个动量温度计是合格的。百分比归一化这一步,让它比MACD更适合做多品种、多时间框架的系统化策略组件。
简单规则防不了黑天鹅,但复杂规则常常骗了自己。PPO的简单程度,恰好是它的优势。
#PPO指标 #MACD #百分比振荡器 #量化回测 #动量策略 #技术指标 #比特币回测 #跨品种比对 #低胜率高赔率 #TA-Lib #老余捞鱼
Be First to Comment