米国株の決算前に「オプション市場はどれくらいの変動を織り込んでいるか」を、ATM(アットザマネー)ストラドルから出す小さな計算を、個人開発の米国株オプションアプリで使っています。その計算と、先週の決算5件を実際の反応と並べた結果をまとめます。方向を当てる話ではなく、幅の目安をどう定義して、どう比べるかの話です。
想定変動幅の定義
- 株価に最も近い行使価格(ATM)を選ぶ
- 同じ行使価格のコールとプットの仲値(買気配と売気配の中間)を足す = ストラドル
- ストラドル ÷ 株価 = 想定変動幅(%)
気配が欠けている行は、0として扱わず「計算できない」にします。欠損をゼロにすると、後の集計で「動かないと織り込んでいた」ように見えてしまうためです。
from typing import Optional
def straddle_mid(call_bid: float, call_ask: float, put_bid: float, put_ask: float) -> Optional[float]:
"""同じ行使価格のコールとプットの仲値を足す。気配が欠けていたら None(0 にしない)。"""
legs = (call_bid, call_ask, put_bid, put_ask)
if any(v is None or v <= 0 for v in legs) or call_ask < call_bid or put_ask < put_bid:
return None
return (call_bid + call_ask) / 2 + (put_bid + put_ask) / 2
def implied_move_pct(straddle: Optional[float], spot: float) -> Optional[float]:
"""ATMストラドル ÷ 株価。満期までの想定値幅(%)。方向は持たない。"""
if straddle is None or spot <= 0:
return None
return round(straddle / spot * 100, 1)
def within_range(expected_pct: float, actual_pct: float) -> bool:
"""符号を落として比べる。範囲内 = 実際の反応の絶対値が想定変動幅以下。"""
return abs(actual_pct) <= expected_pct
来週(10/27〜31)の主な決算の例
2026-10-23 の米国市場終値時点、満期 2026-10-30 のATMストラドルで計算した値です(アプリの公開APIから取得した数値を、上のコードで再計算して一致を確認しました)。
| 銘柄 | 行使価格 | ストラドル | 株価 | 想定変動幅 |
|---|---|---|---|---|
| MSFT | 525 | 27.68 | 524.51 | ±5.3% |
| GOOGL | 320 | 19.38 | 320.21 | ±6.1% |
| AMZN | 247.5 | 19.45 | 248.00 | ±7.8% |
| INTC | 87 | 8.63 | 86.96 | ±9.9% |
注意点が2つあります。
- 満期までの値幅です。 満期は 10/30 で、決算当日の1回の反応だけでなく、満期までの数営業日の動きも含みます。「決算翌日にこの幅だけ動く」という意味ではありません。
- 方向は含みません。 上がるか下がるかは何も示していません。
先週の5件を実際の反応と並べる
同じ定義で保存していた先週(10/19〜)の決算5件と、発表後の最初の通常取引日の反応(終値ベース)を並べると、次のようになります。
| 銘柄 | 想定変動幅 | 実際の反応 | 範囲 |
|---|---|---|---|
| NFLX | ±9.3% | -5.3% | 範囲内 |
| NEE | ±3.3% | -0.7% | 範囲内 |
| IBM | ±7.4% | +0.3% | 範囲内 |
| LRCX | ±7.1% | -11.8% | 範囲外 |
| TSLA | ±5.6% | -3.1% | 範囲内 |
5件中4件が範囲内、LRCX だけが想定の約1.7倍動きました。ただし、この表をそのまま「当たった・外れた」の成績として読むのは危険です。
- 想定変動幅は満期(10/23)までの値幅、実際の反応は1営業日の値動きで、期間が揃っていません。
- 保存した時刻が発表より後だった可能性があり、アプリでも「事前時点を確認できず」と表示しています。事前に出していた予想として検証済み、とは言えません。
- 5件は少なすぎて、傾向は何も言えません。
なので今は「期間も保存時刻も違う参考比較」として並べ、事前に保存した記録だけを別に数える設計にしています。比較用のコードは within_range の数行ですが、何と何を比べているかを行ごとに残すほうが重要だと感じています。
(参考)アプリの公開ページ「決算検証レシート」(2026-10-19週)の画面です。保存時刻・満期・「事前時点を確認できず」の表示をそのまま載せています。
まとめ
- 想定変動幅は、ATMストラドル ÷ 株価という単純な定義に固定する
- 気配の欠損は 0 にせず None
- 実際の反応と比べるときは、期間(満期まで vs 1営業日)と保存時刻を必ず併記する
これは投資助言ではなく、データの扱い方の共有です。文章の作成にAIを使用し、数値は公開APIの実測値を再計算して確認しました。個人開発アプリ(米国株のオプション・実績の予想変動幅を扱います)は筆者の作品です: https://www.signumhq.com/app?from=qiita_1024
