AI 量化實測:Qwen 3 自動寫策略,12 次迭代結果
你有沒有想過,讓 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 用法亂猜。