Skip to content

PPO实测:只改MACD一小步,三年跑出73%的收益(附完整代码)

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。

本文约 3800 字 | 预计阅读 8 分钟

· · ·

三年,21笔交易,赚了7笔,胜率只有33.3%。

你大概率觉得这策略不行吧。但它三年总收益是73.72%。

这不是什么深度学习模型,也没用到情绪分析或新闻数据。它只靠一个1990年代就有的老指标:PPO,百分比振荡器(Percentage Price Oscillator)。它是MACD的表兄弟,核心逻辑几乎没变,只改了一个细节。

把减法变成了除法。

这一除,价格6万的BTC和6块钱的小票,就可以用同一套参数看同一个指标了。

下面把原理、回测数据、Python代码全部拆开。看完你应该能在自己电脑上跑一遍。

一、MACD的一个老问题

先说MACD是什么。如果你用了很多年,直接跳到第二节。

MACD不复杂,分三步:

  1. 算两条EMA(指数移动平均线):一条快线(通常12周期)、一条慢线(通常26周期);
  2. 快线减慢线,得到MACD线(DIF线);
  3. 对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-182024-01-2026,78141,624+5,429
2024-02-052024-03-2542,70169,889+9,674
2024-04-032024-04-1566,04763,363−1,221
2024-05-182024-06-1667,00866,572−348
2024-07-192024-08-0666,77755,978−4,026
2024-08-252024-09-0564,39856,104−2,709
2024-09-192024-10-0963,00360,522−815
2024-10-172024-12-2767,46794,071+6,351
2025-01-122025-02-0694,58396,497+279
2025-03-282025-04-0684,43878,136−1,918
2025-04-202025-06-0685,259104,286+4,600
2025-06-172025-06-21104,706102,155−844
2025-07-032025-08-03109,758114,103+799
2025-08-142025-08-25118,478110,014−2,083
2025-09-132025-09-28116,066112,011−1,042
2025-10-052025-10-18123,637107,091−3,306
2025-12-092025-12-1892,78485,377−1,766
2026-01-052026-01-2693,97688,179−1,285
2026-03-072026-03-2867,34066,253−416
2026-04-112026-05-2273,12775,413+392
2026-07-112026-07-1263,86663,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 #老余捞鱼

Published inAI&Invest专栏

Be First to Comment

    发表回复