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 的别名。
单腿 / 2 腿现金结算型与价差型:方向明确时使用
3 腿蝶式:赌标的价格落在某一区间
4 腿铁鹰/鹰式:赌区间收敛或赌突破两种用法
双到期日历/对角:同一标的、不同到期日的组合
依据 optopsy/strategies/__all__ 实际导出绘制的分类示意图;非官方分类图。官方文档写 38 个而代码导出 40 个。

CATEGORY MATRIX

Optopsy 策略有哪些:十类策略对照表(类别、腿数、行情观点与注意点)

先按「你对行情的判断」缩小到一两类,再往下看具体函数名。下表按源码里的模块分组。

类别包含的策略函数腿数对应的行情观点适用场景注意点
单腿long_callsshort_callslong_putsshort_puts1看涨或看跌先验证流程是否跑通;最简的入门策略卖方单腿的理论风险敞口偏高,回测结果对滑点假设也偏敏感
跨式 / 宽跨long_straddlesshort_straddleslong_stranglesshort_strangles2赌波动率放大或收敛,而非方向事件前后、波动率处于极值时宽跨的两腿 Delta 不同,需分别设 leg1_delta / leg2_delta
垂直价差long_call_spreadshort_call_spreadlong_put_spreadshort_put_spread2有方向但想限定风险希望把亏损上界框住的场景四个方向组合容易记混,注意函数名里的 long/short 指代的是整体策略而非腿
比例价差call_back_spreadput_back_spreadcall_front_spreadput_front_spread2(1:2)后价差赌大幅移动,前价差赌价格钉住想做不对称赔率的场景腿的数量比是 1:2,与垂直价差不是同一类;老版本包不含这一类的 4 个函数
蝶式long_call_butterflyshort_call_butterflylong_put_butterflyshort_put_butterfly3看价格落在中间行权价附近区间震荡、想控制成本三腿需要 leg1_deltaleg3_delta 三个参数配合
铁鹰 / 铁蝶iron_condorreverse_iron_condoriron_butterflyreverse_iron_butterfly4铁鹰赌区间,反向铁鹰赌突破最典型的卖方区间策略四腿,需 leg1_deltaleg4_delta;wing 与短腿的 Delta 要拉开
鹰式(同类型)long_call_condorshort_call_condorlong_put_condorshort_put_condor4同样赌区间,但四腿用同一种期权想用纯 call 或纯 put 构造区间与铁鹰的区别是不混用 call/put,四个行权价同向递增
Covered / 领口covered_callprotective_putcollarcash_secured_put2–3(含股票腿)持有标的并做增强或对冲已有股票仓位想加期权腿可传真实股价(官方推荐 yfinance);不传则用合成深度实值 call 代替股票腿
日历long_call_calendarshort_call_calendarlong_put_calendarshort_put_calendar2(双到期)同一行权价、不同到期日,赌时间价值衰减差异预期短期窄幅、长期有波动front_dte_* / back_dte_* 设两组 DTE,且前月 DTE 上界必须小于后月 DTE 下界
对角long_call_diagonalshort_call_diagonallong_put_diagonalshort_put_diagonal2(双到期)行权价与到期日都不同的组合想同时调整方向与时间维度参数与日历同源,但行权价可不同,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 的策略分类本质是按「方向 + 波动率 + 时间」三个维度切的。把观点写成一句话,就能对应到上表的某一类。

    预期输出:得到一个类别名(如「铁鹰 / 铁蝶」或「跨式 / 宽跨」)

  • 在类别里选方向版本,再定腿的 Delta
    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_rangedelta_range 分组的统计表

  • 用 raw=True 看逐笔,确认不是「看起来对」
    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_entryentryexitpct_change

  • 先用单腿跑通

    首次上手建议用 long_callsshort_puts。腿数最少、参数最少,先把「数据能不能吃进去」这件事验证掉,再换多腿策略。

    多腿先只改一个参数

    四腿策略的参数很多。首轮只调 max_entry_dteexit_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 个,以及 collarcash_secured_put。现代版补齐后是 40 个。「38」很可能是某次改版后没更新的遗留数字。

    对你的实际影响

    两点:①按文档数字去核对清单会少两个;②如果你在 Python 3.11 上装到了老包,缺的就不止两个,而是整整 10 个,而且不会有任何提示。安装页的差异表列了完整对照。

    LEGS AND PARAMS

    Optopsy 腿数与参数映射说明:别把 Delta 设到不存在的腿上

    Optopsy 用 leg1_deltaleg4_delta 分别控制每条腿。腿的编号在不同策略里指向不同的合约,这是最容易设错的地方。

    策略类型用到的参数腿的默认角色数据额外要求适用场景注意点
    单腿(call / put)leg1_delta一个虚值腿仅需标准 8 列入门与方向性验证leg2_delta 不报错但不生效
    跨式 / 宽跨leg1_deltaleg2_delta通常两腿为平值或对称虚值标准 8 列波动率方向的表达跨式两腿行权价相同,宽跨不同
    垂直价差leg1_deltaleg2_delta一近一远的两腿标准 8 列限定风险的 directional 表达两腿 Delta 要拉开,否则会选到相邻行权价
    蝶式leg1_deltaleg3_delta中间腿通常平值,两翼虚值标准 8 列区间钉住型表达三腿 Delta 需满足价格单调,否则选不出组合
    铁鹰 / 铁蝶 / 鹰式leg1_deltaleg4_delta两条短腿 + 两条翼腿标准 8 列区间与突破两类表达翼腿与短腿 Delta 不要重叠,否则不再是翼
    Covered / 领口leg1_delta(股票侧)、leg2_delta(期权侧)股票腿用深度实值 Delta 代理可选 stock_data;用真实股价时需 OHLCV已有股票仓位的增强或对冲不传 stock_data 时用合成深度实值 call 替代,结果与真实持有股票有差异
    日历 / 对角leg1_deltaleg2_delta + front_dte_min/maxback_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_maxback_dte_min 交叉条件不满足读报错里的字段名与约束说明确保 front_dte_max < back_dte_min 且各组内 min ≤ max
    raw=1 直接报类型错误参数被 Pydantic 严格校验拒绝:布尔必须是真正的 bool看报错是否提到 rawmin_bid_askraw=True;浮点参数写 0.10 而不是 010
    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_putshort_puts 有什么区别?

    官方文档明确写 cash_secured_putshort_puts别名,功能等价。它被单独列出来是为了命名贴近交易员的习惯用语。

    Covered Call 需要我另外提供股票数据吗?

    可以不用,但建议用。官方说明:传 stock_data 时使用真实股价(推荐 yfinance 的输出);不传时用合成的深度实值 call 代理股票腿。两者结果会有差异,尤其是分红与股票流动性相关的部分。

    一个策略要设几个 leg*_delta

    取决于腿数:单腿 1 个;跨式/宽跨/垂直/比例/日历/对角 2 个;蝶式 3 个;铁鹰与鹰式 4 个。设了不存在的腿不会报错,但也不会生效——这是很容易被忽略的静默行为。

    能不能把多个策略组合成一个组合回测?

    可以。库里有 simulate_portfolio(),按权重把多条腿各自独立跑一遍再合并权益曲线。每个腿可以指定不同的策略、数据与参数。详见模拟与绩效页。

    跑出来的分组统计该怎么读?

    默认输出按 dte_range(入场 DTE 区间)与 delta_range(Delta 区间)分组,每组给出 countmean / std / min / 25% / 50% / 75% / max先看 count:样本太少的组不要下结论;再看分布而不是只看均值,期权收益分布通常很不对称。以官方文档与源码实现为准。

    下一步:搞懂行权价是怎么被选出来的

    逐腿 Delta 页说明 TargetRange 的语义、四种角色的默认值、源码里的分组取最近实现,以及结果为空时的排查顺序。