iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
AI Engineering

買錯保險的血淚教訓:我用 Python + AI Agent 重構人生財務防禦系統系列 第 27

Day 27 — 零套件串接即時股價:Python 原生 urllib 與 Fallback 機制

  • 分享至 

  • xImage
  •  

前情提要:昨天我們定義了 AI 的溫暖對話準則。
本日目標:為了讓 /life-simulate 更逼真,我們要讓系統能抓取真實世界的 ETF 報價與匯率。但我們「堅持不裝」重型套件。


1. 為什麼不用 requests 或 yfinance? (The Meat)

在 Python 世界抓資料,大家直覺都是 pip install requestsyfinance
但身為一個追求極簡的開源專案,我們希望任何人下載原始碼後,不需要安裝一堆套件就能跑。

因此,我們要使用 Python 內建的標準函式庫 urllib.request 來呼叫 Yahoo Finance 的公開 API:

  • 美股 ETFhttps://query1.finance.yahoo.com/v8/finance/chart/VT
  • 台股 ETFhttps://query1.finance.yahoo.com/v8/finance/chart/0050.TW
  • 匯率 (USD/TWD)https://query1.finance.yahoo.com/v8/finance/chart/TWD=X

2. 實作核心:極簡 API 抓取與降級機制 (Code Snippet)

網路總是有斷線的時候。如果 API 掛了,我們的遊戲就不能玩了嗎?
絕對不行!因此我們要在 financial_api.py 中實作一個「Fallback 機制」。如果在 5 秒內抓不到資料,系統會自動切換到本地的 Mock 資料。

# financial_api.py
import urllib.request
import json

MOCK_DATA = {
    "VT": 125.40,
    "VOO": 510.25,
    "0050": 185.30,
    "USDTWD": 32.50
}

def fetch_live_price(symbol):
    """
    Fetch live price from Yahoo Finance Chart API.
    Falls back to MOCK_DATA on failure.
    """
    yahoo_symbol = symbol
    if symbol == "0050":
        yahoo_symbol = "0050.TW"
    elif symbol == "USDTWD":
        yahoo_symbol = "TWD=X"
        
    url = f"https://query1.finance.yahoo.com/v8/finance/chart/{yahoo_symbol}"
    
    try:
        req = urllib.request.Request(
            url, 
            headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
        )
        with urllib.request.urlopen(req, timeout=5) as response:
            data = json.loads(response.read().decode())
            meta = data["chart"]["result"][0]["meta"]
            price = meta["regularMarketPrice"]
            return round(price, 2)
    except Exception as e:
        # Fallback to Mock
        return MOCK_DATA.get(symbol, 100.0)

def get_financial_dashboard():
    vt_price = fetch_live_price("VT")
    voo_price = fetch_live_price("VOO")
    tw_price = fetch_live_price("0050")
    usdtwd = fetch_live_price("USDTWD")
    
    return {
        "VT_usd": vt_price,
        "VOO_usd": voo_price,
        "0050_twd": tw_price,
        "USDTWD_rate": usdtwd,
        "VT_twd_equivalent": round(vt_price * usdtwd, 1),
        "VOO_twd_equivalent": round(voo_price * usdtwd, 1)
    }

if __name__ == "__main__":
    print("Fetching Financial Dashboard:")
    data = get_financial_dashboard()
    print(json.dumps(data, indent=2, ensure_ascii=False))

透過這種設計,我們的 AI Agent 不僅能取得實時的全球經濟數據,還具備了 100% 的容錯穩定性!


3. 今日總結與明日預告

今天我們實作了最輕量級的 API 爬蟲。在 Agentic AI 的時代,Agent 的能力取決於它能呼叫多少 Tool。我們用最原始的方式,賦予了 AI 看懂全球股市的能力。

思考題:如果你要在這個系統裡加入「比特幣 (BTC)」的資產,你覺得可以去哪裡抓免費的報價 API?

明日預告:你聽過 RAG (檢索增強生成) 嗎?明天(Day 28),我們不用任何複雜的向量資料庫,用純 Python 寫一個極簡版 RAG,讓 AI 讀懂我寫的部落格金句!



上一篇
Day 26 — 拒絕 LangChain:用純 Python 狀態注入打造有溫度的 AI 教練
下一篇
Day 28 — 拒絕殺雞用牛刀:用 50 行 Python 手刻極簡 RAG 引擎
系列文
買錯保險的血淚教訓:我用 Python + AI Agent 重構人生財務防禦系統30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言