一鍵設定 FinMind × Claude,開發策略更方便

0Shares
Image

用Claude跟Finmind開發策略一陣子,真的會上癮,想到啥策略跟AI說,AI自動去Finmind抓資料,回測,真的是省非常多時間力氣,但對於初學者,一開始設定可能打退堂鼓了,所以寫了一個程式,可以自動做好設定,讓你輕輕鬆鬆就能跟AI一起開發策略

用 Claude 開發台股策略時,你是不是每開一個新對話、新專案,就要再貼一次 FinMind 的 API Key?這篇介紹一支我寫的小程式 setup_finmind.ps1:執行一次、貼上一次 token,之後 Claude Desktop 和 Claude Code 都會自動連上 FinMind 抓資料,再也不用重複設定。

先講痛點:為什麼需要這支程式

FinMind 提供了大量台股、期貨、選擇權與總經資料,搭配 Claude 開發策略非常方便。但實際用下來,有幾個很煩的地方:

  • 每次都要重貼 API Key開新對話、開新專案,Claude 都不知道你的 token,只好一再貼上。
  • Key 散落各處token 被貼進對話、寫死在程式碼裡,一不小心就跟著程式分享出去。
  • 手改 JSON 容易出錯Claude Desktop 的 MCP 設定要改 JSON,少一個逗號整個設定就壞掉。
  • 兩套工具、兩套設定Claude Desktop 和 Claude Code 各自有設定,要分別處理一次。
  • PowerShell 的小陷阱官方指令中的 -- 在 PowerShell 會被吃掉,照貼也會出現錯誤。

這支程式就是把上面這些事情一次自動處理掉。

這支程式會幫你做什麼

FinMind 官方有提供 MCP(Model Context Protocol)伺服器 finmind-mcp,裝好之後 Claude 可以直接用自然語言查 FinMind 的資料。這支程式負責把它「裝好、接好、記住」,共六個步驟:

步驟做了什麼好處
1. 驗證 token實際呼叫一次 FinMind APItoken 貼錯會立刻知道,可以重新輸入
2. 設定環境變數把 token 存成系統環境變數 FINMIND_TOKEN你自己的 Python 策略程式也能直接讀到
3. 檢查 uv沒有安裝 uv 就自動安裝finmind-mcp 靠 uv 執行,不用自己研究
4. 設定 Claude Desktop把 FinMind 加進 claude_desktop_config.json自動備份原檔,不動其他設定
5. 設定 Claude Code以 --scope user 加入 FinMind所有專案通用,新專案不用再設定
6. 全域 CLAUDE.md寫入「token 從環境變數讀取」與「台股資料優先用 FinMind」兩條規則Claude 寫程式時不會再跟你要 token,也會優先採用 FinMind 的資料

程式可以重複執行,不會重複新增設定。以後換了新 token、或換一台新電腦,再跑一次就好。

安裝前準備

  • Windows 10 / 11 電腦
  • 已安裝 Claude Desktop(若也使用 Claude Code,請一併裝好)
  • FinMind 帳號與 token:登入後到 FinMind 使用者頁面 複製,並確認信箱已完成驗證

安裝步驟

直接從 GitHub 下載最新版 · 在 GitHub 查看原始碼 · 下載 ZIP
  1. 完全關閉 Claude Desktop。只關視窗不夠,要在右下角系統匣的 Claude 圖示按右鍵 →「結束」。程式執行時會修改它的設定檔,開著可能會被覆蓋。
  2. 執行程式。在下載的 setup_finmind.ps1 上按右鍵,選「使用 PowerShell 執行」。
  3. 貼上 token。看到「貼上 FinMind token」的提示時,貼上你的 token 並按 Enter(輸入時畫面不會顯示,這是正常的)。
  4. 等待完成。畫面會依序顯示六個步驟的結果,出現「全部完成!」就好了。
  5. 重新打開 Claude Desktop。如果有開著的終端機或 Claude Code,也請關掉重開,環境變數才會生效。

如果視窗一閃就關掉,或出現「無法執行指令碼」:這是 Windows 的執行原則擋住了。請打開 PowerShell,執行下面這行(假設檔案放在「下載」資料夾):

powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\Downloads\setup_finmind.ps1"
查看完整程式碼
# FinMind 一鍵設定:Claude Desktop + Claude Code + 環境變數 + 全域 CLAUDE.md
# 使用方式:在檔案上按右鍵 →「使用 PowerShell 執行」

$ErrorActionPreference = "Stop"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$utf8 = New-Object System.Text.UTF8Encoding $false

function Ok($m)   { Write-Host "  [OK] $m" -ForegroundColor Green }
function Warn($m) { Write-Host "  [!]  $m" -ForegroundColor Yellow }
function Step($m) { Write-Host "`n== $m ==" -ForegroundColor Cyan }

try {
    Write-Host "FinMind 一鍵設定" -ForegroundColor Cyan
    Write-Host "開始前請先完全關閉 Claude Desktop(系統匣圖示按右鍵 → 結束)。"
    Read-Host "已關閉的話按 Enter 繼續"

    # 1. 輸入並驗證 token
    Step "1/6 輸入 FinMind token"
    while ($true) {
        $sec = Read-Host "貼上 FinMind token(輸入時不會顯示)" -AsSecureString
        $t = [Runtime.InteropServices.Marshal]::PtrToStringAuto(
                [Runtime.InteropServices.Marshal]::SecureStringToBSTR($sec)).Trim()
        if (-not $t) { Warn "沒有輸入內容,請再貼一次"; continue }
        try {
            $r = Invoke-RestMethod "https://api.finmindtrade.com/api/v4/data?dataset=TaiwanStockInfo&data_id=2330" `
                    -Headers @{ Authorization = "Bearer $t" } -TimeoutSec 30
            if ($r.status -eq 200) { Ok "token 驗證成功"; break }
            Warn "token 驗證失敗:$($r.msg)"
        } catch {
            Warn "token 驗證失敗:$($_.Exception.Message)"
        }
        $again = Read-Host "要重新輸入嗎?(Y/n)"
        if ($again -match '^[nN]') { throw "已取消" }
    }

    # 2. 系統環境變數
    Step "2/6 設定環境變數 FINMIND_TOKEN"
    [Environment]::SetEnvironmentVariable("FINMIND_TOKEN", $t, "User")
    $env:FINMIND_TOKEN = $t
    Ok "已設定(你的策略程式可用 os.environ[""FINMIND_TOKEN""] 讀取)"

    # 3. uv / uvx
    Step "3/6 檢查 uv"
    $env:Path = [Environment]::GetEnvironmentVariable("Path","User") + ";" + [Environment]::GetEnvironmentVariable("Path","Machine")
    $uvxCmd = Get-Command uvx -ErrorAction SilentlyContinue
    if (-not $uvxCmd) {
        Warn "找不到 uv,開始自動安裝..."
        powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
        $env:Path = "$env:USERPROFILE\.local\bin;" + [Environment]::GetEnvironmentVariable("Path","User") + ";" + [Environment]::GetEnvironmentVariable("Path","Machine")
        $uvxCmd = Get-Command uvx -ErrorAction SilentlyContinue
        if (-not $uvxCmd) { throw "uv 安裝失敗,請手動安裝後重新執行本程式" }
    }
    $uvx = $uvxCmd.Source
    Ok "uvx 位置:$uvx"

    # 4. Claude Desktop 設定檔
    Step "4/6 設定 Claude Desktop"
    $candidates = @("$env:APPDATA\Claude\claude_desktop_config.json")
    $candidates += Get-ChildItem "$env:LOCALAPPDATA\Packages" -Directory -Filter "Claude_*" -ErrorAction SilentlyContinue |
                   ForEach-Object { Join-Path $_.FullName "LocalCache\Roaming\Claude\claude_desktop_config.json" }
    $cfg = $candidates | Where-Object { Test-Path $_ } | Select-Object -First 1
    if (-not $cfg) {
        $cfg = $candidates[0]
        New-Item -ItemType Directory -Force (Split-Path $cfg) | Out-Null
        [IO.File]::WriteAllText($cfg, '{ "mcpServers": {} }', $utf8)
        Warn "原本沒有設定檔,已新建:$cfg"
    }
    Copy-Item $cfg "$cfg.bak" -Force
    $json = [IO.File]::ReadAllText($cfg, [Text.Encoding]::UTF8) | ConvertFrom-Json
    if (-not $json.PSObject.Properties["mcpServers"]) {
        $json | Add-Member -NotePropertyName mcpServers -NotePropertyValue ([pscustomobject]@{})
    }
    $entry = [pscustomobject]@{
        command = $uvx
        args    = @("finmind-mcp")
        env     = [pscustomobject]@{ FINMIND_TOKEN = $t }
    }
    $json.mcpServers | Add-Member -NotePropertyName finmind -NotePropertyValue $entry -Force
    [IO.File]::WriteAllText($cfg, ($json | ConvertTo-Json -Depth 100), $utf8)
    Ok "已加入 finmind(原檔備份:$cfg.bak)"

    # 5. Claude Code
    Step "5/6 設定 Claude Code"
    if (Get-Command claude -ErrorAction SilentlyContinue) {
        $ErrorActionPreference = "Continue"
        & claude mcp remove finmind --scope user 2>$null | Out-Null
        $addArgs = @('mcp','add','finmind','--scope','user','-e',"FINMIND_TOKEN=$t",'--',$uvx,'finmind-mcp')
        & claude @addArgs
        $ErrorActionPreference = "Stop"
        if ($LASTEXITCODE -eq 0) { Ok "已加入 Claude Code(所有專案通用)" }
        else { Warn "Claude Code 加入失敗,可稍後手動處理" }
    } else {
        Warn "沒有安裝 Claude Code,略過"
    }

    # 6. 全域 CLAUDE.md
    Step "6/6 設定全域 CLAUDE.md"
    $dir = "$env:USERPROFILE\.claude"
    $md  = "$dir\CLAUDE.md"
    $rules = @(
        @{
            key  = "FINMIND_TOKEN"
            name = "token 規則"
            text = @"

## FinMind
- FinMind API token 存在環境變數 FINMIND_TOKEN,程式一律用 os.environ["FINMIND_TOKEN"] 讀取。
- 不要向我要 token,也不要把 token 寫進任何檔案。
- 查詢資料可直接使用 finmind MCP 工具。
"@
        },
        @{
            key  = "台股資料來源"
            name = "資料來源規則"
            text = @"

## 台股資料來源
- 台股資料(股價、K線、三大法人、融資融券、月營收、財報、期貨選擇權)一律優先用 FinMind(MCP 或 API)。
- 網路搜尋只用於新聞與事件解讀。
- 不同來源數字有出入時,以 FinMind 為準,並告訴我差異。
"@
        }
    )
    New-Item -ItemType Directory -Force $dir | Out-Null
    if (-not (Test-Path $md)) { [IO.File]::WriteAllText($md, "", $utf8) }
    foreach ($r in $rules) {
        $content = [IO.File]::ReadAllText($md, [Text.Encoding]::UTF8)
        if ($content.Contains($r.key)) {
            Ok "CLAUDE.md 已有$($r.name),未變更"
        } else {
            $add = if ($content.Trim().Length -eq 0) { $r.text.TrimStart() } else { $r.text }
            [IO.File]::AppendAllText($md, $add, $utf8)
            Ok "已加入$($r.name)"
        }
    }

    Write-Host "`n全部完成!請重新打開 Claude Desktop。" -ForegroundColor Green
    Write-Host "若 Claude Code 或其他終端機正開著,也請關掉重開,環境變數才會生效。"
}
catch {
    Write-Host "`n發生錯誤:$($_.Exception.Message)" -ForegroundColor Red
}
Read-Host "`n按 Enter 關閉視窗"

安裝後怎麼用

在 Claude Desktop 對話中

開一個新對話,直接用中文問就好,Claude 會自己呼叫 FinMind 抓資料,不需要再提供 token:

  • 台積電最近一個月的股價走勢如何?
  • 2330 近一週三大法人買賣超
  • 0050 今年以來的每日收盤價,幫我算 120 日均線
  • 台指期近三個月的日線資料

第一次可以先問「查一下 2330 的基本資料」,有回傳台積電的產業別,就代表設定成功。

在 Claude Code 開發策略

在任何專案資料夾啟動 Claude Code,都能直接使用 FinMind。想確認有沒有接上,可以在終端機執行:

claude mcp list

清單中看到 finmind ... ✔ Connected 就代表成功。

在你自己的 Python 程式中

回測程式通常需要大量歷史資料,建議還是由程式自己呼叫 FinMind API。token 已經存在環境變數裡,程式碼只要這樣讀取,不必把 token 寫死在檔案中:

import os
import requests

token = os.environ["FINMIND_TOKEN"]
url = "https://api.finmindtrade.com/api/v4/data"
params = {
    "dataset": "TaiwanStockPrice",
    "data_id": "0050",
    "start_date": "2024-01-01",
}
resp = requests.get(url, params=params,
                    headers={"Authorization": f"Bearer {token}"})
data = resp.json()["data"]
print(len(data), "筆資料")

因為全域 CLAUDE.md 已寫好這條規則,請 Claude 幫你寫策略時,它也會自動用這種方式讀 token。

重要建議:提問時明確說「使用 FinMind 資料」

裝好 FinMind 之後,Claude 手上同時有兩種取得資料的方式:FinMind 資料庫,以及網路搜尋。它會依問題自行判斷該用哪一個,但這個判斷不是百分之百固定。有時候它會改去搜尋網頁,從新聞或財經網站拼湊數字。

網頁上的數字常常零散、不完整,日期也可能對不齊。拿這種資料做策略判斷或回測,結果可能失真。所以我建議:不論是一般對話還是開發策略,都在提問時明確寫出「使用 FinMind 資料」,避免 AI 取用其他來源的資料。

不建議這樣問建議這樣問
台積電最近表現如何?用 FinMind 資料查台積電近一個月股價與三大法人買賣超
幫我回測 0050 均線策略幫我回測 0050 的 120 日均線策略,資料一律從 FinMind API 抓取
台指期最近籌碼怎麼樣?使用 FinMind 資料庫,整理台指期近 20 日外資未平倉變化

想查新聞、法說會內容或「為什麼今天大跌」這類事件解讀時,才需要網路搜尋。這時可以分開講清楚,例如:「股價數據用 FinMind,原因請搜尋新聞」。

安裝程式已在全域 CLAUDE.md 寫入「台股資料優先用 FinMind」的規則,Claude Code 會自動遵守。不過在一般對話中,每次多寫一句「使用 FinMind 資料」仍是最可靠的做法。如果發現 Claude 的數字和 FinMind 不一致,請以 FinMind 為準。

常見問題

token 換了怎麼辦?

在 FinMind 網站重設 token 後,舊的會立即失效。關閉 Claude Desktop,再執行一次 setup_finmind.ps1 貼上新 token 即可,所有地方會一起更新。

Claude 回覆「Token is illegal」?

通常是改完設定後沒有「完全」重開 Claude Desktop,MCP 還在用舊的 token。請從系統匣圖示按右鍵結束後再打開。若仍失敗,確認 token 複製完整、FinMind 信箱已驗證,然後重新執行程式。

改壞了 Claude Desktop 的設定怎麼還原?

程式修改前會自動備份成 claude_desktop_config.json.bak,位置在 %APPDATA%\Claude\。把 .bak 檔改回原檔名即可還原。

token 會不會外流?

token 只存在你自己電腦的三個地方:使用者環境變數、Claude Desktop 設定檔、Claude Code 設定檔,不會上傳到任何地方。要注意的是不要把這些設定檔分享給別人,也不要把 token 貼到對話或公開的程式碼裡。

沒有用 Claude Code,也可以執行嗎?

可以。程式偵測不到 Claude Code 時會自動略過該步驟,其他設定照常完成。

Mac 可以用嗎?

這支程式是 Windows 專用。Mac 使用者可以參考 FinMind 官方的 MCP 安裝說明 手動設定。

結語

開發策略最該花時間的地方是想法和驗證,而不是一再處理 API Key 跟設定檔。花一分鐘跑完這支程式,之後打開 Claude 就能直接問資料、寫回測,把注意力放回策略本身。

0Shares


0 Comments
Oldest
Newest Most Voted
(adsbygoogle = window.adsbygoogle || []).push({});

最近發文

加入我們

Categories

最新留言

(adsbygoogle = window.adsbygoogle || []).push({});
0
本文有想法或疑問嗎?歡迎討論x
()
x