BUILT-IN PLAYBOOK
Optopsy 策略手册:40 个内置策略怎么分类、怎么挑
官方文档说「38 个内置策略」,而源码 __all__ 实际导出 40 个——官方策略页自己的分类表也是 10 类 × 4 个。本页按源码实测口径整理,并给出从行情观点出发的三步挑法。
- 10 类 × 4 个:单腿、跨式宽跨、垂直价差、比例价差、蝶式、铁鹰、鹰式、Covered/Collar、日历、对角。
- 腿数不同:单腿 1 腿;跨式/垂直/比例 2 腿;蝶式 3 腿;铁鹰与鹰式 4 腿;日历与对角是双到期。
- 一类要真实股价:Covered/Collar 系列可传
stock_data,不传则用合成深度实值 call 代替。 - 一个别名:
cash_secured_put官方注明是short_puts的别名。
optopsy/strategies/ 与 __all__ 实际导出绘制的分类示意图;非官方分类图。官方文档写 38 个而代码导出 40 个。CATEGORY MATRIX
Optopsy 策略有哪些:十类策略对照表(类别、腿数、行情观点与注意点)
先按「你对行情的判断」缩小到一两类,再往下看具体函数名。下表按源码里的模块分组。
| 类别 | 包含的策略函数 | 腿数 | 对应的行情观点 | 适用场景 | 注意点 |
|---|---|---|---|---|---|
| 单腿 | long_calls、short_calls、long_puts、short_puts | 1 | 看涨或看跌 | 先验证流程是否跑通;最简的入门策略 | 卖方单腿的理论风险敞口偏高,回测结果对滑点假设也偏敏感 |
| 跨式 / 宽跨 | long_straddles、short_straddles、long_strangles、short_strangles | 2 | 赌波动率放大或收敛,而非方向 | 事件前后、波动率处于极值时 | 宽跨的两腿 Delta 不同,需分别设 leg1_delta / leg2_delta |
| 垂直价差 | long_call_spread、short_call_spread、long_put_spread、short_put_spread | 2 | 有方向但想限定风险 | 希望把亏损上界框住的场景 | 四个方向组合容易记混,注意函数名里的 long/short 指代的是整体策略而非腿 |
| 比例价差 | call_back_spread、put_back_spread、call_front_spread、put_front_spread | 2(1:2) | 后价差赌大幅移动,前价差赌价格钉住 | 想做不对称赔率的场景 | 腿的数量比是 1:2,与垂直价差不是同一类;老版本包不含这一类的 4 个函数 |
| 蝶式 | long_call_butterfly、short_call_butterfly、long_put_butterfly、short_put_butterfly | 3 | 看价格落在中间行权价附近 | 区间震荡、想控制成本 | 三腿需要 leg1_delta–leg3_delta 三个参数配合 |
| 铁鹰 / 铁蝶 | iron_condor、reverse_iron_condor、iron_butterfly、reverse_iron_butterfly | 4 | 铁鹰赌区间,反向铁鹰赌突破 | 最典型的卖方区间策略 | 四腿,需 leg1_delta–leg4_delta;wing 与短腿的 Delta 要拉开 |
| 鹰式(同类型) | long_call_condor、short_call_condor、long_put_condor、short_put_condor | 4 | 同样赌区间,但四腿用同一种期权 | 想用纯 call 或纯 put 构造区间 | 与铁鹰的区别是不混用 call/put,四个行权价同向递增 |
| Covered / 领口 | covered_call、protective_put、collar、cash_secured_put | 2–3(含股票腿) | 持有标的并做增强或对冲 | 已有股票仓位想加期权腿 | 可传真实股价(官方推荐 yfinance);不传则用合成深度实值 call 代替股票腿 |
| 日历 | long_call_calendar、short_call_calendar、long_put_calendar、short_put_calendar | 2(双到期) | 同一行权价、不同到期日,赌时间价值衰减差异 | 预期短期窄幅、长期有波动 | 用 front_dte_* / back_dte_* 设两组 DTE,且前月 DTE 上界必须小于后月 DTE 下界 |
| 对角 | long_call_diagonal、short_call_diagonal、long_put_diagonal、short_put_diagonal | 2(双到期) | 行权价与到期日都不同的组合 | 想同时调整方向与时间维度 | 参数与日历同源,但行权价可不同,Delta 要分腿设 |
依据 optopsy/strategies/ 下 6 个模块的公开函数定义、optopsy/__init__.py 的 __all__ 与官方策略文档整理(采集 2026-09-23)。
上表的 40 个函数是源码实测口径。官方 README、文档首页、策略页与包 docstring 都写「38 Built-in Strategies」,但其策略页自己的分类列表就是 10 类 × 4 个 = 40 条。
HOW TO PICK
Optopsy 怎么挑策略:三步从行情观点到一行代码
不用先把 40 个都记住。按下面三步走,先跑通一个再扩展。
示例取自官方 getting-started 与 examples 文档中的写法;本站未在 Python 3.12+ 环境实跑。
# 例:认为未来一个月 SPX 会区间震荡,且波动率偏高
# 例:认为某标的财报后会大幅波动,方向不确定
Optopsy 的策略分类本质是按「方向 + 波动率 + 时间」三个维度切的。把观点写成一句话,就能对应到上表的某一类。
预期输出:得到一个类别名(如「铁鹰 / 铁蝶」或「跨式 / 宽跨」)
import optopsy as op
results = op.iron_condor(
data,
max_entry_dte=45,
exit_dte=21,
leg2_delta={"target": 0.20, "min": 0.15, "max": 0.25},
leg3_delta={"target": 0.20, "min": 0.15, "max": 0.25},
min_bid_ask=0.10,
)
类别 + long/short(或反向)决定函数名;腿的 Delta 决定行权价远离平值的程度。min_bid_ask 顺手过滤流动性差的合约。
预期输出:返回按 dte_range 与 delta_range 分组的统计表
trades = op.iron_condor(
data,
max_entry_dte=45,
exit_dte=21,
raw=True,
)
print(trades.columns.tolist())
print(trades[["dte_entry", "entry", "exit", "pct_change"]].head())
分组统计只能告诉你分布,逐笔明细才能让你确认入场日、入场成本、出场价与持有天数是否符合预期。做任何结论前的必要一步。
预期输出:raw=True 时列里出现逐笔字段,如 dte_entry、entry、exit、pct_change
先用单腿跑通
首次上手建议用 long_calls 或 short_puts。腿数最少、参数最少,先把「数据能不能吃进去」这件事验证掉,再换多腿策略。
多腿先只改一个参数
四腿策略的参数很多。首轮只调 max_entry_dte 与 exit_dte,其余用默认值,确认结果数量在合理范围后再逐个收紧 Delta 区间。
用同一套参数横向比
对比不同策略时把 DTE 与 Delta 参数固定成同一个字典再展开,否则差异里混着参数差异,结论没有意义。
38 VS 40
Optopsy 官方写 38 个、源码导出 40 个:差在哪、怎么核对
这不是笔误级的细节——它决定了你按文档去找某个策略时会不会扑空。下面是逐处核对的结果。
| 出现位置 | 官方写的是 | 实际情况 | 核对方式 |
|---|---|---|---|
| README 的 Features 一节 | 「38 Built-in Strategies」 | 源码导出 40 个策略函数 | 对 __init__.py 的 __all__ 做分类计数 |
| 文档首页(docs/index.md) | 「38 Built-in Strategies」 | 同上 | 同上 |
| 策略总览页(docs/strategies.md) | 开头写 38,但正文分类表是 10 类 × 4 个 = 40 条 | 该页自身前后矛盾 | 数该页的类别小节与每节条目 |
| 包 docstring(optopsy/__init__.py) | 「38 built-in options strategies」 | 同上 | 读源码文件头 |
| 口语化文档页(chat-ui.md) | 「38 built-in strategies」 | 同上 | 读该页 What it does 一节 |
四份官方资料写 38,一处官方页面自身列出了 40 条。本站以源码 __all__ 实测计数(40)为准,并把差异如实标出。
差的 10 个是哪一类
与 PyPI 上另一套老包对比可以看出端倪:老包(2.2.0)只导出 30 个策略函数,缺的正是比例价差 4 个、鹰式 4 个,以及 collar 与 cash_secured_put。现代版补齐后是 40 个。「38」很可能是某次改版后没更新的遗留数字。
对你的实际影响
两点:①按文档数字去核对清单会少两个;②如果你在 Python 3.11 上装到了老包,缺的就不止两个,而是整整 10 个,而且不会有任何提示。安装页的差异表列了完整对照。
LEGS AND PARAMS
Optopsy 腿数与参数映射说明:别把 Delta 设到不存在的腿上
Optopsy 用 leg1_delta 到 leg4_delta 分别控制每条腿。腿的编号在不同策略里指向不同的合约,这是最容易设错的地方。
| 策略类型 | 用到的参数 | 腿的默认角色 | 数据额外要求 | 适用场景 | 注意点 |
|---|---|---|---|---|---|
| 单腿(call / put) | leg1_delta | 一个虚值腿 | 仅需标准 8 列 | 入门与方向性验证 | 设 leg2_delta 不报错但不生效 |
| 跨式 / 宽跨 | leg1_delta、leg2_delta | 通常两腿为平值或对称虚值 | 标准 8 列 | 波动率方向的表达 | 跨式两腿行权价相同,宽跨不同 |
| 垂直价差 | leg1_delta、leg2_delta | 一近一远的两腿 | 标准 8 列 | 限定风险的 directional 表达 | 两腿 Delta 要拉开,否则会选到相邻行权价 |
| 蝶式 | leg1_delta–leg3_delta | 中间腿通常平值,两翼虚值 | 标准 8 列 | 区间钉住型表达 | 三腿 Delta 需满足价格单调,否则选不出组合 |
| 铁鹰 / 铁蝶 / 鹰式 | leg1_delta–leg4_delta | 两条短腿 + 两条翼腿 | 标准 8 列 | 区间与突破两类表达 | 翼腿与短腿 Delta 不要重叠,否则不再是翼 |
| Covered / 领口 | leg1_delta(股票侧)、leg2_delta(期权侧) | 股票腿用深度实值 Delta 代理 | 可选 stock_data;用真实股价时需 OHLCV | 已有股票仓位的增强或对冲 | 不传 stock_data 时用合成深度实值 call 替代,结果与真实持有股票有差异 |
| 日历 / 对角 | leg1_delta、leg2_delta + front_dte_min/max、back_dte_min/max | 前月与后月各一条腿 | 标准 8 列;两个到期日都要有数据 | 时间维度上的表达 | 跨字段校验要求前月 DTE 上界 < 后月 DTE 下界;默认 exit_dte=7 与普通策略的 0 不同 |
依据 docs/parameters.md 的逐腿说明、docs/api-reference.md 与各策略模块的默认值整理。
角色默认 Delta 参考:标准虚值腿 target=0.30, min=0.20, max=0.40;平值腿 0.50 / 0.40 / 0.60;虚值翼 0.10 / 0.05 / 0.20;作为股票代理的深度实值 0.80 / 0.60 / 0.95。这些是官方文档给出的默认值,个别策略会在此基础上调整。
PLAYBOOK TROUBLESHOOTING
Optopsy 策略调用阶段的六类常见问题
策略能调用、但结果不对劲时的排查顺序。前三类与逐腿 Delta 直接相关。
| 现象 | 最可能的原因 | 怎么确认 | 怎么修 |
|---|---|---|---|
换了策略名就报 AttributeError | 用到了老包没有的策略(比例价差 / 鹰式 / Collar) | 查 hasattr(op, 'iron_condor') 与 len(op.__all__) | 换到 Python 3.12–3.13 重装(见安装页) |
| 策略跑通但一行结果都没有 | leg1_delta 区间太窄,或数据里 delta 取值不在区间内 | 单独打印数据里 delta 的取值区间与分布 | 放宽 min/max,或先只放宽到 0.05–0.95 确认链路通 |
| 四腿策略结果明显比两腿少很多 | 翼腿与短腿 Delta 区间重叠,或四腿缺任一腿的报价 | 把四腿的 Delta 区间分别打印出来看是否分层 | 把翼腿 Delta 调小(如 0.05–0.15),并放宽 min_bid_ask |
| 日历 / 对角报参数校验错误 | front_dte_max 与 back_dte_min 交叉条件不满足 | 读报错里的字段名与约束说明 | 确保 front_dte_max < back_dte_min 且各组内 min ≤ max |
传 raw=1 直接报类型错误 | 参数被 Pydantic 严格校验拒绝:布尔必须是真正的 bool | 看报错是否提到 raw 或 min_bid_ask | 写 raw=True;浮点参数写 0.10 而不是 0 或 10 |
| Covered / 领口结果与预期差很多 | 没传 stock_data,股票腿用合成深度实值 call 替代 | 检查调用里是否传了 stock_data | 传入真实 OHLCV(官方推荐 yfinance),或明确接受代理腿的近似性 |
依据官方参数文档的校验说明、getting-started 的空结果排查清单与本项目对源码的核验整理。
本站不提供任何策略的收益评价或推荐结论。回测跑通不等于策略有效:成交假设、数据质量、样本区间都会显著影响结果。官方免责声明同样如此表述。
FAQ
Optopsy 策略常见问题
Optopsy 到底有多少个内置策略?
按源码 __all__ 实测是 40 个,分 10 类、每类 4 个。官方四处资料写的是 38 个,但官方策略页自己的分类表就列出了 40 条。本站以源码为准,差异逐条列在本页。
有没有 PPO、DQN 这类机器学习策略?
没有。Optopsy 是规则化的期权策略回测库,40 个策略都是期权组合结构(单腿、价差、蝶式、鹰式、日历等),不含强化学习或机器学习算法。这一点要和使用强化学习框架的项目区分开。
cash_secured_put 和 short_puts 有什么区别?
官方文档明确写 cash_secured_put 是 short_puts 的别名,功能等价。它被单独列出来是为了命名贴近交易员的习惯用语。
Covered Call 需要我另外提供股票数据吗?
可以不用,但建议用。官方说明:传 stock_data 时使用真实股价(推荐 yfinance 的输出);不传时用合成的深度实值 call 代理股票腿。两者结果会有差异,尤其是分红与股票流动性相关的部分。
一个策略要设几个 leg*_delta?
取决于腿数:单腿 1 个;跨式/宽跨/垂直/比例/日历/对角 2 个;蝶式 3 个;铁鹰与鹰式 4 个。设了不存在的腿不会报错,但也不会生效——这是很容易被忽略的静默行为。
能不能把多个策略组合成一个组合回测?
可以。库里有 simulate_portfolio(),按权重把多条腿各自独立跑一遍再合并权益曲线。每个腿可以指定不同的策略、数据与参数。详见模拟与绩效页。
跑出来的分组统计该怎么读?
默认输出按 dte_range(入场 DTE 区间)与 delta_range(Delta 区间)分组,每组给出 count 与 mean / std / min / 25% / 50% / 75% / max。先看 count:样本太少的组不要下结论;再看分布而不是只看均值,期权收益分布通常很不对称。以官方文档与源码实现为准。