Claude / MCP · Alpaca API · 期權數據

用 Claude + Alpaca API 查期權數據:踩坑實錄

為什麼查個股價要批准十次?怎麼一條指令搞定
從 MCP 工具消失、六步拆單、404 端點、到 Put 貴 20 倍的完整排查過程

4 個卡點
1 條最終指令
Alpaca v1beta1 端點
📅 2026-04-01 22:16 NZDT
背景 卡點 1:MCP 工具消失 卡點 2:六條指令 卡點 3:404 錯誤 卡點 4:Put 貴 20 倍 最終一條指令 看懂輸出欄位 FAQ
背景:一個「簡單」的問題

Thomas 問 Claude:「NVDA 這週到期的 ATM put call 價格是多少?」
聽起來很簡單,對吧?結果踩了四個坑,以下是完整的解決過程。

Claude Code
AI 助手
Alpaca MCP
原計劃
MCP 消失了
新對話沒有
Python 腳本
繞過 MCP
Alpaca REST API
直接呼叫
期權數據
最終結果
ATM(平值)
期權行使價 = 目前股票市場價,表示合約「剛好在界線上」。
買彩票選最接近中獎號碼的數字,既不算贏也不算輸
ITM(實值)
Call 的行使價低於股價,或 Put 的行使價高於股價——已有「內在價值」。
已經確定有一點贏了,所以保費貴
OTM(虛值)
Call 的行使價高於股價,或 Put 的行使價低於股價——還需要股價大幅移動才有價值。
買彩票號碼差很遠,中獎概率低,保費便宜
坑1
卡點 1:MCP 工具「消失」了
問題
Alpaca MCP 顯示 Connected,但 Claude 找不到任何期權工具
現象
MCP 設定頁面顯示 ✓ Connected,但問 Claude「你有哪些工具」,它回答沒有 Alpaca 相關工具
原因
MCP 的 stdio 工具需要在對話一開始就載入。開新對話時,Claude 不會自動偵測這些工具的存在
解決方法
改用 Python 直接呼叫 Alpaca REST API,完全繞過 MCP
MCP 工具就像電動起子,接上電(Connected)不代表每次換工地(新對話)都能自動啟動——你要重新插一次電才行。與其每次插電,不如用手動起子(Python 腳本)直接幹活。
方法 優點 缺點 適合場景
Alpaca MCP Claude 可以自然語言呼叫工具 新對話要重新激活;對話內每步都需要批准 互動式探索,不急
Python 直接 API 一條指令出結果;可打包所有步驟;不依賴 MCP 狀態 需要自己寫腳本 已知要查什麼,要快速出結果
小技巧:如何在新對話中「喚醒」MCP 工具

在對話開頭說:「請使用 Alpaca MCP 工具查詢……」就能提示 Claude 去找對應工具。但如果你只是要查固定數據,直接 Python 腳本更省事。

坑2
卡點 2:查個期權,Claude 拆成了六步

Thomas:「NVDA 這週到期的 ATM put call 價格是多少?」
Claude(很認真地):「好的,我先查一下 NVDA 現價,然後找本週到期的合約代號,再查 snapshot……」

問題
一個問題被拆成六步,每步都要批准
實際過程
查股價 → 等批准 → 查合約清單 → 等批准 → 查 snapshot → 等批准 → 整理輸出 → 等批准
原因
Claude 預設「探索式」工作模式,邊查邊根據結果決定下一步,適合不知道要查什麼的情境
用戶反應
「我不想查個期權數據都要這麼批准和這麼久,我不高興了!」
解決方法
一條 Python 指令把所有 API 呼叫打包,直接輸出最終結果
讓 Claude 探索式查詢就像叫外賣時,服務員每端一道菜都問你「這道可以上嗎」——當然煩!我們要的是「全部做好一起端上來」。
方式 步驟數 批准次數 等待時間 適合場景
探索式(Claude 預設) 4~8 步 4~8 次 2~5 分鐘 不確定要查什麼
打包式(Python 腳本) 1 步 1 次 5~10 秒 目標明確,要快速出結果
什麼時候探索式其實是好的

如果你不確定合約代號、不知道哪個到期日有流動性、或者要 Claude 幫你分析「這個期權值不值得買」——探索式才是對的。打包式適合「我知道我要什麼,只是懶得手打 API 呼叫」的情境。

坑3
卡點 3:API 端點 404,找不到頁面
問題
呼叫 /v2/options/quotes/latest 返回 404
錯誤的端點
https://data.alpaca.markets/v2/options/quotes/latest
原因
Alpaca 期權數據不在 v2 路徑下,而是在 v1beta1(測試版端點)路徑,且要用 snapshots 而不是 quotes
正確端點
https://data.alpaca.markets/v1beta1/options/snapshots
就像你去超市找「有機豆腐」,結果一直在「豆製品區」找,其實它放在「健康食品區」——相同超市,不同貨架。
latestQuote(最新報價)
bp(Bid Price):願意買入的最高價
ap(Ask Price):願意賣出的最低價
bp=你賣的話能得到多少;ap=你買的話要付多少
greeks(希臘字母)
delta、gamma、theta、vega——衡量期權對各種市場因素的敏感度
就像天氣預報的各種指標,告訴你這個期權有多「容易受影響」
impliedVolatility(IV)
市場對未來波動的預期,以百分比表示。IV 越高,期權越貴
天氣越不穩定,保險費越貴——IV 就是「市場擔心程度」
latestTrade(最新成交)
最近一筆成交的價格和時間,確認市場真的有人在交易
二手市場最近一筆實際成交價
API 端點 + 參數
https://data.alpaca.markets/v1beta1/options/snapshots
  ?symbols=NVDA260402C00180000,NVDA260402P00180000
  &feed=indicative

# symbols  : 合約代號,多個用逗號分開
# feed     : indicative = 指示性報價(不需要 live data 訂閱也能查)
#            opra = 官方交易所數據(需要付費訂閱)
indicative vs opra:用哪個

免費帳戶用 indicative,數據有 15 分鐘延遲但基本夠用。付費訂閱 Options Data 後可用 opra 取得即時報價。做研究分析用 indicative 完全沒問題。

坑4
卡點 4:Put 比 Call 貴了 20 倍,以為數據壞了
問題
NVDA $180 Put = $5.79,$180 Call = $0.28,差了 20 倍
現象
查詢時顯示 NVDA 現價 $182,但 $180 Put 要 $5.79,$180 Call 只要 $0.28
第一反應
「數據肯定錯了!ATM 的 Put 和 Call 不應該差這麼多」
真正原因
查詢時間是收盤後,數據是前一個交易日(3/31)的收盤價 $174,不是當天即時價 $182
解釋
股價 $174,$180 Put(有權在 $180 賣出)= ITM 實值,當然貴。$180 Call(有權在 $180 買入)= OTM 虛值,便宜
就像你在盤後查昨天收盤的保險報價,昨天已經發生了事故(股價下跌),所以「賭繼續下跌」的保險(Put)當然比「賭反彈」的保險(Call)貴。
CALL(看漲期權)
給你以固定價格買入股票的權利。股價越高,Call 越值錢。
買了一張「以 $180 買入 NVDA」的券。如果 NVDA 漲到 $200,你可以行使這個券以 $180 買入,馬上賺 $20
PUT(看跌期權)
給你以固定價格賣出股票的權利。股價越低,Put 越值錢。
買了一張「以 $180 賣出 NVDA」的保險。如果 NVDA 跌到 $160,你可以行使這個保險以 $180 賣出,避免了 $20 的損失
合約 行使價 基準股價(盤後數據) 狀態 價格 原因
$180 Put $180 $174(3/31 收盤) ITM 實值 $5.79 $180 > $174,已有 $6 內在價值,貴
$180 Call $180 $174(3/31 收盤) OTM 虛值 $0.28 $180 > $174,需要漲 $6 才有價值,便宜
Python
# 查市場狀態
clock = get('https://paper-api.alpaca.markets/v2/clock')
print(clock)

# 返回示例:
# {"is_open": false, "next_open": "2026-04-02T13:30:00Z", "next_close": "2026-04-02T20:00:00Z"}
# is_open: false = 現在是收盤時間,數據是上一個交易日的
# is_open: true  = 現在是開盤時間,數據接近即時
盤後查詢的注意事項

盤後查詢到的股價(透過 quotes/latest)可能是盤後交易的價格,而期權 snapshot 使用的基準價格通常是當日收盤價,兩個數字可能不一致。查詢到「反常」的 Put/Call 價差時,先確認市場是否開盤。

最終
最終正確查詢方案:一條指令搞定

踩完四個坑之後,這是最終整理出來的一條指令。把所有 API 呼叫打包,直接輸出市場狀態 + 股價 + 期權數據的完整表格。

1
GCP Secret Manager 已存好密鑰alpaca-paper-api-keyalpaca-paper-secret-key(詳見 Alpaca MCP 指南)
2
gcloud CLI 已登入:執行 gcloud auth login 確認可以存取 Secret Manager
3
確認合約代號:需要知道要查詢的期權合約代號(格式見下方「合約代號格式」)
PYTHONUTF8=1 py -c "
import urllib.request, json, urllib.parse, subprocess

def secret(name):
    r = subprocess.run(
        'gcloud secrets versions access latest --secret=' + name + ' --project=nvda-strategy',
        capture_output=True, text=True, shell=True)
    return r.stdout.strip()

KEY = secret('alpaca-paper-api-key')
SEC = secret('alpaca-paper-secret-key')
H = {'APCA-API-KEY-ID': KEY, 'APCA-API-SECRET-KEY': SEC}

def get(url):
    req = urllib.request.Request(url, headers=H)
    with urllib.request.urlopen(req) as r: return json.loads(r.read())

# 市場狀態 + 股價
clock = get('https://paper-api.alpaca.markets/v2/clock')
spot  = get('https://data.alpaca.markets/v2/stocks/NVDA/quotes/latest')['quote']['ap']
print(f'市場: {\"開盤\" if clock[\"is_open\"] else \"收盤\"}  NVDA: \${spot}')

# 期權 snapshot(把 symbols 換成你要的合約代號)
symbols = 'NVDA260402C00180000,NVDA260402P00180000,NVDA260402C00182500,NVDA260402P00182500'
params  = urllib.parse.urlencode({'symbols': symbols, 'feed': 'indicative'})
snaps   = get(f'https://data.alpaca.markets/v1beta1/options/snapshots?{params}')['snapshots']

print(f'\n{\"合約代號\":<30} {\"類型\":>5} {\"行使價\":>8} {\"Bid\":>7} {\"Ask\":>7} {\"中間價\":>7} {\"IV\":>7} {\"Delta\":>8}')
print('-'*82)
for sym in sorted(snaps):
    s  = snaps[sym]; q = s['latestQuote']; g = s['greeks']
    typ    = 'CALL' if 'C' in sym[4:] else 'PUT '
    strike = float(sym[-8:]) / 1000
    bp, ap = q['bp'], q['ap']
    print(f'{sym:<30} {typ:>5} {strike:>8.1f} {bp:>7.2f} {ap:>7.2f} {(bp+ap)/2:>7.2f} {s[\"impliedVolatility\"]:>7.1%} {g[\"delta\"]:>8.3f}')
"
NVDA 260402 C 00180000
NVDA = 股票代號
260402 = 到期日(2026年4月2日)
C = Call(C=看漲,P=看跌)
00180000 = 行使價 $180.00(乘 1000,8位)
代號意思
NVDA260402C00180000NVDA 2026/04/02 到期 Call $180
NVDA260402P00180000NVDA 2026/04/02 到期 Put $180
NVDA260404P00182500NVDA 2026/04/04 到期 Put $182.5
AAPL260117C00200000AAPL 2026/01/17 到期 Call $200
如何找到本週到期的合約代號

可以先用 Alpaca 的合約查詢端點:https://data.alpaca.markets/v1beta1/options/contracts?underlying_symbols=NVDA&expiration_date_lte=2026-04-06,這會列出所有本週到期的 NVDA 合約代號,再挑選你要查的放進腳本。

輸出
看懂輸出欄位的意思
輸出結果
市場: 收盤  NVDA: $182.30

合約代號                       類型    行使價     Bid     Ask    中間價      IV    Delta
----------------------------------------------------------------------------------
NVDA260402C00180000            CALL   180.0    0.20    0.36    0.28   85.2%    0.350
NVDA260402C00182500            CALL   182.5    0.08    0.20    0.14   88.1%    0.210
NVDA260402P00180000            PUT    180.0    5.60    5.98    5.79  112.3%   -0.650
NVDA260402P00182500            PUT    182.5    7.20    7.65    7.43  115.8%   -0.795
Bid(買入價)
市場上有人願意買入這個期權的最高出價。你要「賣出」這個期權,能得到的最高價格。
收購商給的收購價——你賣給他,他出這個價
Ask(賣出價)
市場上有人願意賣出這個期權的最低出價。你要「買入」這個期權,需要付的最低價格。
商店標價——你向他買,他要這個價
中間價(Mid Price)
Bid 和 Ask 的平均值 (bid+ask)/2,通常是「比較公平」的理論價格。掛限價單時的參考價。
買賣雙方都能接受的「折中價」
IV(隱含波動率)
市場對這個股票未來波動幅度的預期,百分比表示。IV 越高表示大家預期股價會大幅波動,期權越貴。
保險費率——越危險的標的,保費越高;IV 就是「危險程度」
Delta(對股價的敏感度)
股價每漲 $1,這個期權會漲多少錢。Call 的 delta 是正數(0 到 1),Put 是負數(-1 到 0)。
如果 NVDA 漲 $1,Delta=0.35 的 Call 大概漲 $0.35。Put Delta=-0.65 表示 NVDA 跌 $1,這個 Put 大概漲 $0.65
Delta 的特殊含義
Delta 也可以粗略理解為「到期時這個合約進入實值的概率」。Delta=0.35 的 Call 大約有 35% 機率到期時是實值。
越接近 ATM(0.5),成功概率越接近一半;越 OTM 就越靠近 0
?
Bid-Ask 差價大,正常嗎? 流動性低的期權(快到期、深度 OTM)Bid-Ask 差價可能很大,表示難買難賣。差價超過 20% 的中間價就要小心。
?
IV 越高是好是壞? 買入者不利(貴),賣出者有利(保費多)。IV 通常在財報、重大事件前後飆升。
?
怎麼找 ATM 合約? 找 Delta 最接近 0.5(Call)或 -0.5(Put)的合約,就是最接近 ATM 的。
FAQ
常見問題
Q: 執行腳本時出現 ModuleNotFoundError 或 HTTPError,怎麼辦?
腳本只用 Python 內建庫(urllib、json、subprocess),不需要額外安裝套件。如果出現 HTTPError 403 表示 API Key 有問題,先確認 gcloud 已登入且密鑰名稱正確。HTTPError 404 表示端點有誤,確認用的是 v1beta1 而不是 v2。
Q: 查詢返回 "snapshots": {} 空字典,是什麼問題?
通常有兩個原因:(1) 合約代號格式錯誤——最常見是行使價位數不對(必須是 8 位,$180 要寫 00180000 而不是 180000);(2) 合約已到期或不存在——確認日期是否還有效,用合約查詢端點確認代號。
Q: Paper account 的 API Key 可以查真實市場的期權數據嗎?
可以。Data API(data.alpaca.markets)和交易 API(paper-api.alpaca.markets)是分開的。Paper account 的密鑰可以查詢 Data API 的數據,只是無法執行真實交易。用 indicative feed 查期權數據是免費的。
Q: 如何知道本週哪些 NVDA 期權有足夠的流動性?
Bid-Ask Spread(差價):差價 / 中間價 < 10% 表示流動性好。也可以先查 Open Interest(未平倉量),Alpaca snapshots 端點也有 openInterest 欄位,越大越容易買賣。一般 ATM 附近和 $5 整數倍行使價的流動性最好。
Q: greeks 欄位返回 null,怎麼辦?
使用 indicative feed 有時不包含希臘字母,特別是快到期的合約。改用 feed=opra(需要付費訂閱),或嘗試查詢離到期日更遠的合約(通常至少 1 週以上)。也可以用 Black-Scholes 公式自己計算 delta,但那就比較複雜了。
Q: 可以查 NVDA 以外的股票嗎?
可以,把 symbols 參數改成對應股票的期權代號即可。格式相同:[股票代號][到期日YYMMDD][C/P][行使價x1000 8位]。大多數美股期權都支援,ETF 期權(如 SPY、QQQ)也可以查。
Q: 如果我不想用 GCP Secret Manager,可以直接把 API Key 放在腳本裡嗎?
技術上可以,但非常不建議。直接在腳本中硬寫 API Key,很容易被 Claude 的對話記錄留存下來,或不小心複製到其他地方。建議至少用環境變數:在命令列執行前設定 set APCA_API_KEY=你的key(Windows)或 export APCA_API_KEY=你的key(Unix),然後在腳本中用 os.environ['APCA_API_KEY'] 讀取。
↑ 回到頂部