FinLab

AI 量化實測:Qwen 3 自動寫策略,12 次迭代結果

January 31, 2026

你有沒有想過,讓 AI 自己反覆寫量化策略、跑回測、看結果、再改進 — 完全不靠人工介入?

最近開源界最火的模型 Qwen 3,號稱程式碼能力接近 GPT-4,而且免費、可以在本地跑。我決定做一個真實實驗:讓 Qwen 3 自己迭代寫出 CAGR 30% 以上的台股選股策略

結果?比你想像的複雜很多。


實驗設計:AI 量化策略自動迭代迴圈

我設計了一個自動化迴圈:

1. 給 Qwen 3 一個指令:「寫一個高 CAGR 的台股策略」
2. 提取模型回傳的 Python 程式碼
3. 用 FinLab 實際跑回測
4. 把回測結果(CAGR、Sharpe、MDD)回饋給模型
5. 請模型改進 → 回到步驟 2

目標很簡單:CAGR >= 30%。最多跑 5 次迭代。

這個迴圈用 Python 實作,透過 Ollama 的 REST API 呼叫本地的 Qwen 3 模型:

顯示程式碼
import requests
import json
 
response = requests.post('http://localhost:11434/api/chat', json={
    'model': 'qwen3:8b',
    'messages': [
        {'role': 'system', 'content': FINLAB_API_REFERENCE},
        {'role': 'user', 'content': '寫一個 CAGR > 30% 的台股策略...'}
    ],
    'stream': False,
    'think': False  # 重要:關閉思考模式
})

注意:Qwen 3 預設會啟動思考模式(thinking),會大量消耗 token 在內部推理上。呼叫 API 時必須設定 think: False,否則可能整個回應都被思考內容佔滿,看不到實際程式碼。


Qwen 3 是什麼?

Qwen 3 是阿里巴巴開發的開源大型語言模型系列。我們測試了兩個版本:

模型 參數量 大小 架構
qwen3:0.6b 6 億 0.5 GB Dense
qwen3:8b 80 億 5.2 GB Dense
qwen3:30b-a3b 305 億(活躍 33 億) 18.6 GB MoE

其中 30B-A3B 是最受關注的版本 — MoE(混合專家)架構,128 位「專家」中每次只啟動 8 位。SWE-Bench 程式碼修復能力達到 69.6%,接近 GPT-4 的水準。

授權是 Apache 2.0 — 完全免費、可商用。


硬體實測:你真的能在自己電腦上跑嗎?

我的測試環境

項目 規格
CPU Intel i7-8559U(4 核心)
RAM 16 GB
GPU Intel Iris Plus 655(內顯,無 CUDA)
OS macOS

這是一台 2018 年的 Intel Mac — 沒有獨顯、沒有 NVIDIA GPU、RAM 也只有 16GB。

推理速度實測

模型 Prompt 評估 生成速度 每次迭代時間
qwen3:0.6b 36-50 秒 3.1-5.4 tok/s 76-115 秒
qwen3:8b 321-419 秒 0.4-0.6 tok/s 652-893 秒

殘酷的現實:8B 模型在純 CPU 上,光是評估 prompt 就要 5-7 分鐘,生成一段 200 token 的程式碼需要 8-10 分鐘。一次完整的迭代要 11-15 分鐘

0.6B 快很多(1-2 分鐘一次),但程式碼品質顯著下降。

硬體建議

等級 硬體 可跑模型 體驗
入門 16GB RAM, 無 GPU 0.6B-1.7B 堪用但慢
推薦 32GB RAM + RTX 3060 8B 流暢
理想 64GB RAM + RTX 4090 30B-A3B 即時
企業 A100 80GB 30B 全精度 生產級

結論:沒有獨顯的 Mac 只適合 0.6B 模型做概念驗證。真正要用 Qwen 3 做量化開發,至少需要一張 16GB VRAM 的顯卡。


實驗一:裸裝 Qwen 3(不給 API 說明)

第一輪測試,我直接問 Qwen 3:「用 FinLab 寫一個高報酬的台股策略。」

結果:完全失敗。

Qwen 3 生成的程式碼:

顯示程式碼
# Qwen 3 裸裝版本的錯誤
import finlab as fl          # 錯誤:應該用 from finlab import data
fl.set_env("local")          # 錯誤:這個 API 不存在
data = fl.data.get()          # 錯誤:get() 需要參數
 
condition = data['收盤價'] > data['收盤價'].rolling(60).mean()
# 錯誤:data.get() 回傳的 DataFrame columns 是股票代號,不是欄位名

問題分析:Qwen 3 完全不知道 FinLab 的 API。它用自己的想像力猜了一套不存在的用法。這跟你隨便問一個沒寫過 FinLab 的工程師一樣 — 他會根據常見的 pandas 用法亂猜。

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始