文章目录
- 结论先行
- 原版海龟到底在交易什么
- ATR、N 与 Unit 应该怎样理解
- 论文真正支持了什么
- Python 回测应该怎样写才不自欺
- 加密货币里的海龟:证据比想象中更有意思
- 实战上怎样把 Turtle 改造成 Crypto Turtle
- Polymarket 上能不能做“海龟”
- 更合理的 Polymarket Turtle 版本
- Polymarket 的现有研究到了哪里
结论先行
截至 2026 年 10 月 6 日,海龟交易法仍然值得学,但最好把它理解为一个完整的规则化趋势跟踪框架,而不是“20 日新高买、10 日新低卖”这一条技术指标。Curtis Faith 后来整理的《The Original Turtle Trading Rules》明确把完整系统拆成市场选择、头寸规模、入场、止损、退出和交易执行等模块;其中 System 1 才是大家最熟悉的 20 日突破体系。[1]
你给出的 Day 9 教材总体方向正确,但有三个很重要的历史/技术细节需要修正:
| 教材中的说法 | 更接近原版海龟的说法 |
|---|---|
| “收盘价突破 20 日新高入场” | 原版 System 1 是价格盘中突破此前 20 日高点/低点即触发,不是等收盘确认;跳空越过触发价时按开盘附近处理。[2] |
| “ATR20 就是过去20 天 TR 简单平均” | 第一个 N 确实用 20 日 TR 简单平均初始化,但之后原版用 Nt = (19Nt−1+ TRt)/20 递推,本质上接近今天所说的 Wilder smoothing,而不是每天重新计算普通滚动均值。[3] |
| “1% 风险预算 ÷2ATR” 就是Turtle Unit | 这是合理的现代固定止损风险法,但不是原版 Unit。原版令 1N 的价格移动≈账户权益的 1%,所以 Unit 是 1% Equity/(N × DollarPerPoint);初始 2N 止损意味着一个完整 Unit 最坏约对应 2% 账户权益风险。[4] |
历史故事也值得稍微去神话化。Faith 的规则手册记载,Dennis 与 William Eckhardt 在 1983 年中讨论“交易能力能否教授”,随后从超过 1,000 名申请者中面试约 80 人、选出 10 人,再加上 3 名 Dennis 已认识的人,组成第一期 13 人班,并在 1983 年底接受约两周训练。因此“Dennis 找来 13 个完全不懂交易的门外汉”是流行化简写;13 是第一期人数,而且并非所有人都是完全随机的陌生新手。[5]
真正值得 Day 9 带走的一句话是:
海龟的核心不是预测下一根 K 线,而是:用突破确认可能出现的趋势,用 ATR 把不同市场变成可比较的风险单位,在趋势正确时逐步增加暴露,在错误时机械止损,在大趋势结束前尽量不提前止盈。[6]
而且,现代学术证据支持的是更广义的“趋势/时间序列动量”现象,并不是证明“20/10 海龟参数永远赚钱”。长期趋势跟踪研究确实在股票指数、债券、商品和外汇等多类资产中发现过持续性,但技术规则也存在严重的数据挖掘、参数挑选、交易成本和制度变化问题。[7]
原版海龟到底在交易什么
原版海龟有两个主要突破系统。System 1 使用较短周期,System 2 使用更慢的突破。你当前课程所说的“20 日突破 + 10 日退出”对应的是 System 1 的核心骨架。[8]
| 环节 | 原版 System 1 | 教学简化版可以怎么写 |
|---|---|---|
| 入场 | 多头突破此前 20 日最高价,空头突破此前 20 日最低价;盘中即可触发 | 收盘价 > 前 20 日最高价则次日做多 |
| 加仓 | 每从上一个实际成交价有利移动 0.5N,增加一个 Unit,最多共 4 Units | 每上涨 0.5ATR 加仓一次,最多4 层 |
| 止损 | 新 Unit 通常距其入场价 2N;加仓时前面 Units 的止损也随之上移 | 入场价 −2ATR;后续做移动止损 |
| 退出 | 多头跌破 10 日低点、空头突破 10 日高点退出 | 收盘跌破前 10 日低点则退出 |
这些规则分别可在原始规则的 entry、pyramiding、stop 和 exit 部分找到。[9]
但 System 1 还有一个经常被博客遗漏的规则:如果上一次相同方向的突破按照规则会成为一笔盈利交易,则下一次 20 日突破可能被跳过;为防止因此漏掉巨型趋势,还有一个 55 日“failsafe breakout”。System 2 则直接使用更长期的 55 日突破,并不使用相同的跳过逻辑。[2]
所以严格来说:
“20 日新高买、10 日新低卖”
只是一个 Donchian/channel breakout 风格的 Turtle–lite,并不等价于完整的原始 Turtle System 1。
另一个关键点是,原海龟并非只做多。它本质上是一个双向、多资产趋势系统:上涨突破做多、下跌突破做空,同时用 N 把商品、货币、利率等具有完全不同波动尺度的市场标准化。Faith 的规则手册把这种波动率调整头寸明确列为系统核心。[10]
这也解释了为什么单独在 SPY 或 BTC 上回测“只做多 20/10”只能检验一种教学简化策略,而不能复制 Dennis 当年的组合系统。
此外,“海龟胜率 30%–40%、盈亏比至少 2:1”更适合作为趋势跟踪的经验描述,而不是海龟规则保证出来的数学常数。真实胜率、盈亏比会随资产、参数、交易成本、样本期和是否允许做空而显著变化。更稳妥的表达是:突破系统会接受大量小失败,以换取少数非常长的趋势交易;因此它依赖收益分布的右尾,而不是依赖高命中率。 广义趋势跟踪长期研究与原规则的设计逻辑都与这一点一致。[11]
ATR、N 与 Unit 应该怎样理解
ATR 最重要的贡献并不是“发出买卖信号”,而是把今天到底算不算一个很大的价格移动这件事转化为统一的尺度。
真实波幅定义为:

原版 Turtle 手册中的等价写法是:

其中 PDC 是前一日收盘价。这样做的意义是:若市场隔夜从 100 跳空到 110,单纯看当天 H − L 会严重低估实际发生的价格移动,而 True Range 会把前收盘到今日区间之间的跳空算进去。原海龟把由此得到的 N 描述为一个市场“一天通常移动多少价格点数”的尺度。[3]
一个手算例子:
| 日 | 前收盘 | High | Low | 当日收盘 | H − L | ∣H − C ∣prev | ∣L − C ∣prev | TR |
|---|---|---|---|---|---|---|---|---|
| A | 100 | 103 | 99 | 101 | 4 | 3 | 1 | 4 |
| B | 101 | 104 | 102 | 103 | 2 | 3 | 1 | 3 |
| C | 103 | 102 | 97 | 99 | 5 | 1 | 6 | 6 |
所以如果为了练习采用三日简单 ATR:
4 + 3 + 6 ATR = = 4.33 3 3 注意第三天仅看最高价减最低价得到 5,但真实波幅是 6,因为市场相对前收盘出现了向下跳动。
原版海龟的 N 在最初取得 20 个 TR 后才用普通平均初始化:

以后更新为:
19N + TR N = t−1 t t 20 例如昨天 N = 4.00,今天 TR = 6.00:
19 × 4 + 6 N = = 4.10 new 20 这意味着一次异常大波动不会让风险尺度瞬间从 4 跳到 6,而是逐步提高。这个递推公式是原规则明确规定的。[3]
这里还要修正一句常见教材表述:
“N 就是你愿意承担的波动。”
更准确的是:
N 是市场实际波动的估计值;你愿意承担多少风险,是 risk budget。
一个是市场状态变量,另一个是投资者风险偏好。两者通过仓位公式连接。
原版计算:


原文明确说,Unit 被调整到使 1N 的不利移动大约等于账户权益的 1%。[3]
因此用你给的例子:

N = 2 元/股
1 手 = 100 股每手的 1N 波动:
2 × 100 = 200 元
原版 Turtle Unit:
10,000 Unit = = 50 手200 若初始止损距离为 2N = 4 元:

也就是约 2% 账户权益。这与原规则“一个 Unit 的 1N≈1%,最大 stop≈2N”的组合是一致的。[4]
而你教材中的:
10,000 Unit = = 25 手2 × 2 × 100 并没有算错;它实际上回答的是另一个问题:
“我希望从入场到 2ATR 止损被击中时,最多只亏账户的 1%,应该买多少?”
这是今天非常常见、而且对个人量化交易往往更直观的固定止损风险 sizing:

所以建议 Day 9 明确区分两套定义:

与

后者恰好是前者的一半。
ATR 还有一个实际限制:它以“美元、人民币、BTC、概率点”等价格单位计量,因此 ATR=2 对 20 元资产与2,000 元资产完全不是同一个波动水平。跨资产比较时,更合理的辅助指标通常是:
ATR ATR% = Price 不过原海龟解决跨期货市场比较的方式不是直接比较 ATR%,而是把 N 乘上合约的 dollar-per-point,再进行账户风险标准化。[3]
论文真正支持了什么
严格说,并不存在一篇学术论文证明“Richard Dennis 的完整 20/10 + 0.5N 加仓 + 2N 止损海龟参数具有普遍超额收益”。原始海龟首先是一个实务交易系统;学术上更扎实的证据来自两个相邻领域:trading–range breakout/技术交易规则与time–series momentum/trend following。
几个最重要的研究节点如下:
| 研究 | 样本与方法 | 对海龟的意义 |
|---|---|---|
| Brock, Lakonishok & LeBaron, Journal of Finance, 1992 | 在长期 Dow Jones 数据上检验moving average 与 trading- range breakout 等简单技术规则 | 是“突破类技术规则可能包含统计信息”的早期经典证据之一。[12] |
| Sullivan, Timmermann & White | 扩大 Brock 等人的规则空间,在约百年 Dow 数据中用 White Reality Check 专门处理 data snooping | 提醒你:测试几十、几百个 N,最后只公布最赚钱的一个,会制造虚假的“海龟参数优势”。[13] |
| Moskowitz, Ooi & Pedersen, Journal of Financial Economics, 2012 | 研究 58 个流动的股票指数、债券、外汇和商品期货/远期市场 | 发现资产自身过去收益对未来收益存在显著时间序列动量关系;这是现代趋势跟踪最重要的跨资产证据之一。[14] |
| Hurst, Ooi & Pedersen | 把时间序列趋势策略的历史样本往前扩展到约 1880 年 | 作者构造的趋势跟踪组合在很长历史与多种经济环境中表现出持续性,说明趋势现象不只存在于现代CTA 样本。[15] |
其中最重要的研究方法论区别是:

时间序列动量研究经常用过去若干月总收益的正负决定 long/short;海龟则使用过去 N 天价格区间突破。这两种信号高度相关于“趋势”概念,但不是同一公式。Moskowitz、Ooi、Pedersen 的结果因此支持的是趋势跟踪的经济现象,不能被解释成“20 日一定比 37 日、55 日更优”。[16]
这也给出了“为什么海龟可能赚钱”的更现代解释。
首先,当价格存在一定时间尺度上的持续趋势时,突破规则会试图在趋势形成后加入,而不是猜底。时间序列动量在多资产中的实证结果与这一机制相符。[17]
其次,海龟的退出距离一般比进入确认更“耐心”,并且规则禁止因为小利润就主观提前结束趋势;系统通过小额、频繁的失败换取偶尔的大趋势。原规则自己就强调突破后经常并不会形成大趋势,因此长期纪律是体系的重要组成部分。[18]
第三,ATR 风险标准化使“天然高波动资产”不会仅仅因为每天移动得多,就在组合中自动占据巨大风险。原版 position sizing 的目的正是让不同市场的 N 波动对应接近的账户风险。[3]
但这种优势绝不能直接等价为免费 alpha。Sullivan、Timmermann 与 White 的研究专门指出,技术规则研究需要控制 data snooping;否则研究者尝试足够多的窗口、过滤器和参数,总能事后找到漂亮曲线。[13]
所以严谨的海龟研究应该比较的是一大片合理参数区域,例如:

而不是发现“23/11 最赚钱”之后宣布 23 和 11 具有经济意义。
如果一个趋势策略是真的 robust,你希望看到的是参数高原:
20/10、30/15、40/20、55/20 都大体可行,只是表现不同。
而不是一个非常尖锐的单点最优值。
Python 回测应该怎样写才不自欺
Day 9 最适合作为第一阶段的回测,并不需要一上来实现完整海龟。建议先测试:

然后让信号下一根 bar 才持仓,防止把当天已知收盘价用于赚取当天收益。
这不是 Dennis 原版盘中 breakout,而是一个特别适合学习、容易检查 look-ahead bias 的close–confifirmed Turtle–lite。原版使用此前 N 日区间并盘中触发,所以教学回测要清楚标注这种差异。[8]
下面代码默认使用 BTC-USD,因此年化因子设置为 365;若研究股票 ETF,可以把 ANN=252 。代码同时计算原版风格的 N,但入场策略暂时维持固定 100% long exposure,目的是把信号能力与ATR 仓位管理能力分开测试。
# pip install pandas numpy yfinance matplotlib
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
SYMBOL = "BTC-USD"
START = "2017-01-01"
CUTOFF = "2026-10-06"
ENTRY_DAYS = 20
EXIT_DAYS = 10
N_DAYS = 20
# Crypto: 365
# Stocks / ETFs: usually use 252
ANN = 365
# One-way assumed execution cost.
# Example: 10 bps = 0.10%
COST_BPS = 10.0
# ----------------------------
# Load data
# ----------------------------
raw = yf.download(
SYMBOL,
start=START,
auto_adjust=False,
progress=False,
)
# Newer yfinance versions may return MultiIndex columns.
if isinstance(raw.columns, pd.MultiIndex):
raw.columns = raw.columns.get_level_values(0)
df = (
raw[["Open", "High", "Low", "Close"]]
.dropna()
.sort_index()
.loc[:CUTOFF]
.copy()
)
if len(df) < max(ENTRY_DAYS, EXIT_DAYS, N_DAYS) + 2:
raise ValueError("Not enough observations for the requested lookback.")
# ----------------------------
# True Range
# ----------------------------
prev_close = df["Close"].shift(1)
tr = pd.concat(
[
df["High"] - df["Low"],
(df["High"] - prev_close).abs(),
(df["Low"] - prev_close).abs(),
],
axis=1,
).max(axis=1)
df["TR"] = tr
# ----------------------------
# Original-Turtle-style N:
# first 20 observations = SMA seed,
# afterwards N_t = (19*N_prev + TR_t)/20
# ----------------------------
N = pd.Series(np.nan, index=df.index, dtype=float)
if len(df) >= N_DAYS:
N.iloc[N_DAYS - 1] = df["TR"].iloc[:N_DAYS].mean()
for i in range(N_DAYS, len(df)):
N.iloc[i] = (
(N_DAYS - 1) * N.iloc[i - 1]
+ df["TR"].iloc[i]
) / N_DAYS
df["N"] = N
df["ATR_pct"] = df["N"] / df["Close"]
# ----------------------------
# IMPORTANT:
# shift(1) means today's signal only sees PRIOR bars.
# ----------------------------
df["entry_high"] = (
df["High"]
.rolling(ENTRY_DAYS)
.max()
.shift(1)
)
df["exit_low"] = (
df["Low"]
.rolling(EXIT_DAYS)
.min()
.shift(1)
)
# Close-confirmed Turtle-lite
df["entry_signal"] = df["Close"] > df["entry_high"]
df["exit_signal"] = df["Close"] < df["exit_low"]
# ----------------------------
# State machine
# target = desired position after observing today's close
# ----------------------------
target = pd.Series(0.0, index=df.index)
in_market = False
for i in range(len(df)):
if pd.isna(df["entry_high"].iloc[i]) or pd.isna(df["exit_low"].iloc[i]):
target.iloc[i] = 0.0
continue
if not in_market and df["entry_signal"].iloc[i]:
in_market = True
elif in_market and df["exit_signal"].iloc[i]:
in_market = False
target.iloc[i] = 1.0 if in_market else 0.0
df["target"] = target
# One-bar delay prevents earning the return that created the signal.
df["position"] = df["target"].shift(1).fillna(0.0)
# ----------------------------
# Returns
# ----------------------------
df["asset_ret"] = df["Close"].pct_change().fillna(0.0)
# Position changes: 0->1 or 1->0
df["turnover"] = (
df["position"]
.diff()
.abs()
.fillna(df["position"].abs())
)
cost_rate = COST_BPS / 10_000.0
df["strategy_ret"] = (
df["position"] * df["asset_ret"]
- df["turnover"] * cost_rate
)
df["buy_hold_ret"] = df["asset_ret"]
# Start comparison only after 20-day breakout is available
start_idx = df["entry_high"].first_valid_index()
bt = df.loc[start_idx:].copy()
# ----------------------------
# Performance metrics
# ----------------------------
def stats(r: pd.Series, ann: int) -> dict:
r = r.dropna()
equity = (1.0 + r).cumprod()
total_return = equity.iloc[-1] - 1.0
years = len(r) / ann
cagr = (
equity.iloc[-1] ** (1.0 / years) - 1.0
if years > 0 and equity.iloc[-1] > 0
else np.nan
)
vol = r.std(ddof=0) * np.sqrt(ann)
sharpe = (
r.mean() / r.std(ddof=0) * np.sqrt(ann)
if r.std(ddof=0) > 0
else np.nan
)
drawdown = equity / equity.cummax() - 1.0
max_drawdown = drawdown.min()
return {
"Total Return": total_return,
"CAGR": cagr,
"Annual Vol": vol,
"Sharpe (rf=0)": sharpe,
"Max Drawdown": max_drawdown,
}
result = pd.DataFrame(
{
"20/10 Breakout": stats(bt["strategy_ret"], ANN),
"Buy & Hold": stats(bt["buy_hold_ret"], ANN),
}
).T
entries = (
(bt["position"] == 1)
& (bt["position"].shift(1).fillna(0) == 0)
).sum()
result["Entries"] = [entries, 1]
result["Exposure"] = [bt["position"].mean(), 1.0]
print(result)
# ----------------------------
# Equity curve
# ----------------------------
equity = pd.DataFrame(
{
"20/10 Breakout":
(1 + bt["strategy_ret"]).cumprod(),
"Buy & Hold":
(1 + bt["buy_hold_ret"]).cumprod(),
}
)
equity.plot(
title=f"{SYMBOL}: 20/10 Breakout vs Buy & Hold"
)
plt.ylabel("Growth of $1")
plt.tight_layout()
plt.show()
这个版本特别注意了一个最常见的回测错误:
rolling(20).max().shift(1)
而不是:
rolling(20).max()
如果不 shift,当天 High 已经被放进“过去 20 日高点”里,逻辑就与“突破此前 20 日最高价”不同。
第二个需要注意的是:
position = target.shift(1)
这避免把当天收盘形成的信号拿来赚当天已经发生的收益。
第三个需要注意的是成本。突破系统往往会在横盘市场出现多次失败信号,因此即使 gross backtest 看起来不错,交易频率与成本也可能明显影响净结果。技术交易研究和加密货币研究都显示,成本假设会实质改变策略结论。[19]
这个程序还不是完整 Turtle backtest。真正复刻 System 1 至少还需要加入:

上一笔突破是否盈利的 fifilter、55 日 failsafe、做空逻辑、组合层面的市场相关性和 Unit 上限,以及跳空造成的实际成交价。原规则明确包括这些组件。[20]
因此研究上最好按顺序拆解:

每次只添加一层。这样你才能知道最终收益究竟来自趋势信号、风险控制还是加仓。
加密货币里的海龟:证据比想象中更有意思
加密货币其实是非常自然的趋势跟踪实验场,因为它有长时间的大幅趋势行情,同时也有剧烈反转;但学术文献给出的结论并不是“技术分析在 crypto 必赚”,而是相当混合,而且交易成本、样本选择、泡沫阶段和数据挖掘处理非常重要。[21]
与海龟最相关的一批研究包括:
| 研究 | 做了什么 | 主要启示 |
|---|---|---|
| Gerritsen, Bouri, Ramezanifar & Roubaud, 2020 | 用 2010–2019 左右的日频Bitcoin 数据研究多种趋势型技术规则,其中包括 trading- range breakout | 研究报告某些规则,尤其 breakout 类型,在样本中具有预测能力并能改善相对买入持有的风险调整表现。[22] |
| Grobys, Ahmed & Sapkota, 2020 | 研究 2016–2018 年 11 种主要加密货币的简单技术规则 | 某些 moving-average 规则在非 Bitcoin 币种上出现显著表现,说明结果具有明显的币种异质性。[23] |
| Svogun & Bazán- Palomino, 2022 | 在 2016–2021 样本中研究 69 个 moving-average 与breakout 规则,覆盖日频和一分钟频率 | 泡沫阶段和交易成本会显著改变“是否超过buy-and-hold”的判断,而且不同币种的结果并不一致。[24] |
| Deprez & Frömmel, 2024 | 测试 75,360 个技术规则,并明确考虑交易成本、multiple testing 与样本外表现 | 在严格筛选后,作者仍发现技术规则组合在Bitcoin 样本外尤其从风险收益角度可能优于buy-and-hold;但这恰恰说明必须处理数据挖掘,而不是只展示最佳曲线。[25] |
| 研究 | 做了什么 | 主要启示 |
|---|---|---|
| 大规模 crypto trend 研究 | 有研究扩展到接近 3,000 种加密资产并考察价格与成交量趋势指标 | 发现趋势型变量具有一定预测信息,但不同持有周期和信号类型表现不同。[26] |
| 其他较新的综合研究 | 对广泛技术规则做样本外检验 | 也有研究发现“过去最优规则”未来表现缺乏持续性,并对可实际获取的超额利润提出明显质疑。[27] |
这组文献其实非常适合作为量化研究训练,因为它说明:
存在趋势证据
并不等于:
随便选一个趋势参数都存在可交易 alpha
实战上怎样把 Turtle 改造成 Crypto Turtle
首先应该固定 K 线时区。传统期货有明确交易日,而 crypto 是连续市场;如果你测试“20 日高点”,最好明确使用例如 UTC 日线,不要让交易所的日线切割规则在不同数据源之间改变。研究过程中同一套信号必须基于与你实际成交市场一致的数据。
其次,crypto 的全天候交易使传统“隔夜 gap”概念弱于股票,但 TR 仍有意义,因为大幅连续价格移动、流动性断层和极端波动仍然需要反映进 N。ATR 在这里更重要的作用通常不是“捕捉隔夜跳空”,而是动态缩放仓位和止损距离。
第三,应该把原版的“合约每点价值”替换成实际交易工具的 contract specifification。现货 BTC、线性永续、反向合约不能直接用同一份 Unit 数字。核心原则仍然是:

第四,不应只回测 BTC。原海龟最重要的优势之一来自多市场捕捉少数大趋势;只在一只资产上等待趋势,会把大量组合层面的分散化价值丢掉。跨资产趋势跟踪的历史研究本身也是在多市场组合上获得较强证据。[17]
因此一个更像 Turtle 的 crypto universe 可以是高流动性 BTC、ETH 与一组满足事前流动性条件的主流币,再同时允许 long/short。但这里必须防止survivorship bias:不能拿今天还活着的前二十名币,倒推到 2018 年假装当时已经知道这些是未来赢家。
第五,交易成本必须真实。Svogun 与 Bazán-Palomino 特别说明,在 crypto 技术规则中,加入交易成本以及区分泡沫期后,策略相对 buy-and-hold 的判断会发生变化;Deprez 与 Frömmel 更是把交易成本和 multiple- hypothesis selection 直接纳入研究流程。[28]
完整的 crypto 研究因此不应该只报:

而至少还要同时报告:


以及不同牛熊周期的子样本表现。
一个很有价值的实验是同时比较:
| 策略 | 信号 | 仓位 |
|---|---|---|
| Buy & Hold | 无 | 100% long |
| Breakout | 20/10 | 100% 或 0% |
| Vol-scaled Breakout | 20/10 | 1/ATR |
| Turtle-lite | 20/10 | ATR sizing + 2N stop |
| Turtle | 20/10 | ATR sizing + stop + 0.5N pyramiding |
| Slow Turtle | 55/20 | 同上 |
如果“海龟效果”只在一个特定参数、一个币和一个牛市里存在,这不够令人信服;如果 20/10、40/20、55/20 在 BTC、ETH 和多个流动币种上都呈现类似的风险收益改善,那才越来越接近真正的 robust trend effffect。数据挖掘文献说明这种参数稳定性检查至关重要。[13]
Polymarket 上能不能做“海龟”
可以研究,而且这是一个相当有意思的研究题目;但我的结论会比 crypto 更谨慎:
不建议把经典 Turtle 原封不动搬到 Polymarket。更合理的是建立一个“ATR/突破思想启发的prediction–market momentum strategy”。
原因在于 Polymarket 合约的经济结构与股票、商品或 BTC 完全不同。
截至 2026 年 10 月 6 日,Polymarket 官方文档描述的是一个 CLOB 市场:每个 outcome token 的价格位于0 到 1 美元之间,价格被解释为市场隐含概率;买入实际支付 ask,卖出实际收到 bid,页面展示的 midpoint 并不一定是你的可成交价。[29]
这马上带来第一个根本问题:

传统 BTC 可以从 50,000 涨到 100,000 再到 200,000;一个 YES token 不可能突破 1。
而且事件结束后,赢家 token 通常兑付为 1,输家变成 0;Polymarket 当前官方文档说明预测市场通常通过UMA resolution 机制结算,而特定 up/down 类型市场可以使用 Chainlink TWAP。每个市场还具有明确的resolution rules、end date 和 edge cases。[30]
因此这种时间序列不是普通无限期限资产:

这意味着距结算时间本身就是状态变量。
一个“90 天后是否发生 X”的 60¢ 合约,与“5 分钟后是否发生 X”的 60¢ 合约,即使价格和 ATR 完全相同,也绝不是同一种风险。
第二个问题是,Polymarket 的“买入并持有”基准概念不同。对 BTC:

很自然。
但预测市场的“Buy YES and hold”实际上是一笔终局二元 payoffff:

忽略费用时,一个 0.60 美元的 YES:

因此,单纯发现“上涨突破后多数时候继续涨”还不足以说明存在利润;你必须比较当前价格已经隐含的probability 与最终发生频率。
第三个问题是 ATR。
Polymarket 官方当前提供历史 price-history 数据,并允许按时间窗口取得 outcome token 的历史价格点;但官方文档也明确说明,不同频率数据保存期限不同,完整历史默认可能只有较粗的十二小时级别,较高频率数据的历史深度有限。[31]
这意味着:
如果你只有官方长期历史 price points,就不一定能够准确重建数年前某个市场每天真正的intraday High/Low。
于是传统:

可能因为缺少真实 H/L 而被系统性低估。
研究者可以把高频价格点聚合成 OHLC,但只能在数据历史分辨率允许的区间这么做。长期严谨研究最好自己从实时 order book / trades 开始归档。官方文档同时说明 CLOB 有 offff-chain matching 与 on-chain settlement;官方的数据资源页则指出链上可查询 trades、balances、positions、redeems,并提供 API/ WebSocket 与第三方链上数据渠道。[32]
最新的 Polymarket 微观结构预印本也特别指出,因为订单的创建和取消存在 offff-chain 部分,仅靠公共链上归档不能完整还原历史 quote lifecycle;这对研究过去的 spread、depth 和 maker 行为是一个结构性限制。该研究仍是预印本,因此应视作新证据而非成熟共识。[33]
第四个问题是交易摩擦,而且这点截至 2026 年特别值得更新。
当前 Polymarket 官方费用文档已经不是简单的“Polymarket 全部免交易费”。官方文档显示,某些类别向taker 收费,而 maker 不收费;费用公式为:

不同类别的 fee rate 不同,当前文档例如列出 crypto 为 0.07、fifinance/politics 为 0.04,而 geopolitical/ world-events 类别可以为零。[34]
例如 crypto market 在:

买 100 shares:

名义成交价值:

所以这笔例子的 taker fee 相对于成交价值就是:

这是官方当前费率表直接给出的数值关系。[34]
这对 Turtle 风格策略极其重要:
一个需要频繁 breakout、stop、重新入场的系统,如果每次都跨 spread 并做 taker,可能在信号有统计预测力的情况下仍然没有净交易利润。
而且 Polymarket 的 displayed midpoint 本身不是可成交价;官方文档明确指出买入要打 ask,卖出拿 bid。用 midpoint 做回测会天然高估高换手策略。[29]
更合理的 Polymarket Turtle 版本
我会把经典的价格突破:

改为:

其中:

也就是说,必须要求突破足够大,能够覆盖 spread 与预期手续费,而不是“高 0.1¢ 也算新高”。
此外可以定义概率价格的波动尺度:

或当没有可靠 OHLC 时,用:

作为更诚实的 volatility proxy。
仓位则不能仅按照传统:
R q = 2ATR 因为 resolution 有可能直接让 token 从当前价格跳到 0。
更稳健的两层风险约束是:

同时:

最后:

原因很简单:买 YES 时,即使你计划在跌 2ATR 时止损,也不能假设这个 stop 一定在 resolution 或突发新闻前成交;从当前 p 到零的损失仍然是可能的终局损失。这一设计是基于 Polymarket 的二元结算结构推导出的风险控制,而不是原海龟规则本身。[30]
还需要加入一个原海龟完全不存在的新变量:

可以研究:

例如避免把一个距离结算只剩极短时间的概率从 0.90 上涨到 0.95,错误解释为与股票从 90 涨到 95 相同的趋势。
Polymarket 的现有研究到了哪里
截至 2026 年 10 月 6 日,我没有在检索到的文献中发现一篇同行评审研究直接完整测试

在 Polymarket 上的论文。
这实际上是一个研究空白。
目前非常新的 Polymarket 量化文献更多集中在favorite–longshot bias、微观结构、价格冲击、信息传播、套利和 AI agent trading,而不是传统 CTA 趋势系统。例如 2026 年 9 月发布的一篇 Polymarket 预印本使用约5.88 亿笔交易和 248 万个账户研究 favorite-longshot bias,发现不同概率区间及不同事件聚合方式会产生截然不同的收益关系,并且结果依赖如何对相关合约进行分组。该文仍是预印本,不能等同于成熟同行评审结果。[35]
另一篇 2026 年 9 月预印本把 1.737 亿笔签名交易与新闻引用进行匹配,识别大量至少五个百分点、伴随集中单边交易的 price dislocations;它说明 Polymarket 确实存在快速、有方向性的价格移动,但这并不自动意味着这些移动具有可盈利的后续 momentum。[36]
这恰好给出了一个很好的研究假设:
H : Polymarket breakout 后不存在可交易的 continuation 0
对比:
H : 控制 spread、fee、liquidity、TTR 后仍存在 continuation 1
一个严谨的 Polymarket breakout 研究流程应该是:
市场样本。 只使用在每个历史时点已经存在的 market,不能事后只保留今天看得到的成功市场;并设置事前liquidity/depth 条件。官方目前提供 outcome-level price history、order book 和链上数据接口,可以作为数据基础。[37]
价格。 同时维护 mid、bid、ask。生成 signal 可以使用 mid,但实际买入必须按 ask 或完整 order-book 模拟,卖出按 bid。否则 breakout backtest 很容易制造虚假 alpha。[29]
波动。 有完整 OHLC 时计算 probability-ATR;没有完整 OHLC 时不要伪造 TR,而改用绝对价格变化 EWMA、realized volatility 或自己归档的高频 book。
入场。

再要求:

以及足够深度。
退出。 可以同时测试 opposite breakout、ATR stop、time stop 与 resolution exit,而不是假设股票式 10 日低点一定最合理。
风险。 除技术止损外增加“直接结算为零”的最大亏损约束。
成本。 每笔成交使用当时所属 market 的真实 fee parameter,并使用 bid/ask;当前官方费用结构按类别变化,因此把历史全样本固定成“0 fee”已经不是可靠方法。[34]
验证。 参数只在训练集选择,然后 walk-forward 到未来市场;同时使用 data-snooping/multiple-testing 控制,因为测试:

再从中挑最好看的一个,本质上与传统技术分析中的数据挖掘问题相同。Sullivan、Timmermann、White 的Reality Check 思路以及后来 crypto 技术规则研究的大规模 multiple-testing 方法都直接适用于这里。[38]
最终,Day 9 最值得形成的研究框架不是“海龟法则是否神奇”,而是:

在传统期货里,这就是经典 Turtle 的语言;在 BTC/ETH 中,它可以自然演化为 volatility-scaled trend following;到了 Polymarket,则必须再加入:

因此,海龟最值得迁移的不是“20 天”这个数字,而是它的研究哲学:不预测故事,用规则观察趋势;不固定仓位,用波动尺度风险;不因为一次信号正确就过度下注;不靠主观情绪决定什么时候认错。 原版海龟、百年趋势跟踪研究、现代加密货币技术规则研究以及 Polymarket 当前的市场结构,放在一起看,最稳定的共同结论正是这一点。[39]
参考资料与引用
- Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - A Century of Evidence on Trend-Following Investing
https://www.aqr.com/Insights/Research/Journal-Article/A-Century-of-Evidence-on-Trend-Following-Investing - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - A Century of Evidence on Trend-Following Investing
https://www.aqr.com/Insights/Research/Journal-Article/A-Century-of-Evidence-on-Trend-Following-Investing - Simple Technical Trading Rules and the Stochastic Properties of Stock Returns – BROCK – 1992 – The Journal of Finance – Wiley Online Library
https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1540-6261.1992.tb04681.x - Data Snooping, Technical Trading, Rule Performance, and the Bootstrap | Financial Markets Group
https://www.fmg.ac.uk/publications/discussion-papers/data-snooping-technical-trading-rule-performance-and-bootstrap - Time series momentum – ScienceDirect
https://doi.org/10.1016/j.jfineco.2011.11.003?utm_source=chatgpt.com - A Century of Evidence on Trend-Following Investing
https://www.aqr.com/Insights/Research/Journal-Article/A-Century-of-Evidence-on-Trend-Following-Investing - Time series momentum – ScienceDirect
https://doi.org/10.1016/j.jfineco.2011.11.003?utm_source=chatgpt.com - Time series momentum – ScienceDirect
https://doi.org/10.1016/j.jfineco.2011.11.003?utm_source=chatgpt.com - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Data Snooping, Technical Trading, Rule Performance, and the Bootstrap | Financial Markets Group
https://www.fmg.ac.uk/publications/discussion-papers/data-snooping-technical-trading-rule-performance-and-bootstrap - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf - Technical analysis in cryptocurrency markets: Do transaction …
https://faculty.up.edu.pe/en/publications/technical-analysis-in-cryptocurrency-markets-do-transaction-costs/?utm_source=chatgpt.com - The profitability of technical trading rules in the Bitcoin market
https://www.sciencedirect.com/science/article/pii/S1544612319303770?utm_source=chatgpt.com - Technical trading rules in the cryptocurrency market
https://osuva.uwasa.fi/items/e19ff59f-880b-41c1-ba8d-1b3b1c88bbad - Technical analysis in cryptocurrency markets: Do transaction …
https://faculty.up.edu.pe/en/publications/technical-analysis-in-cryptocurrency-markets-do-transaction-costs/?utm_source=chatgpt.com - Are simple technical trading rules profitable in bitcoin markets?
https://biblio.ugent.be/publication/01HY3C3S169G1N6QNYR55NZMFB - Trend-based forecast of cryptocurrency returns – ScienceDirect
https://www.sciencedirect.com/science/article/pii/S0264999323001359?utm_source=chatgpt.com - The predictive ability of technical trading rules
https://ideas.repec.org/a/kap/fmktpm/v37y2023i4d10.1007_s11408-023-00433-2.html?utm_source=chatgpt.com - Technical analysis in cryptocurrency markets: Do transaction …
https://faculty.up.edu.pe/en/publications/technical-analysis-in-cryptocurrency-markets-do-transaction-costs/?utm_source=chatgpt.com - Prices & Orderbook – Polymarket Documentation
https://docs.polymarket.com/concepts/prices-orderbook - Resolution – Polymarket Documentation
https://docs.polymarket.com/concepts/resolution - Prices and Order Books – Polymarket Documentation
https://docs.polymarket.com/market-data/prices-order-books - Prices & Orderbook – Polymarket Documentation
https://docs.polymarket.com/concepts/prices-orderbook - Fill-Side Non-Retail Trading on Polymarket: An Empirical Study of Behavioral Tiers and Microstructure Signatures Under Quote-Attribution Constraints
https://arxiv.org/abs/2605.11640?utm_source=chatgpt.com - Fees – Polymarket Documentation
https://docs.polymarket.com/trading/fees - The Favorite-Longshot Bias in Prediction Markets: Evidence from Polymarket
https://arxiv.org/abs/2609.12878?utm_source=chatgpt.com - Price Dislocations, News Citations, and Epistemic Leverage on Polymarket
https://arxiv.org/abs/2609.06005?utm_source=chatgpt.com - Prices and Order Books – Polymarket Documentation
https://docs.polymarket.com/market-data/prices-order-books - Data Snooping, Technical Trading, Rule Performance, and the Bootstrap | Financial Markets Group
https://www.fmg.ac.uk/publications/discussion-papers/data-snooping-technical-trading-rule-performance-and-bootstrap - Microsoft Word – Original Turtle Rules.doc
https://oxfordstrat.com/coasdfASD32/uploads/2016/01/turtle-rules.pdf