端到端流水線
Alpha Vantage → 數(shù)據(jù)清洗 → 指令微調(diào) → 推理服務(wù) → 交易網(wǎng)關(guān) → 券商 API
微調(diào)數(shù)據(jù)格式示例
{
"instruction": "根據(jù)2024?05?10之前60日K線及當(dāng)日新聞,預(yù)測次日SPY漲跌",
"input": "開盤...新聞...",
"output": "漲"
}
推理返回示例
{"symbol":"TSLA","pred":"跌","prob":0.62,"reason":"Q1交付不及預(yù)期+技術(shù)破位"}
依賴安裝:
pip install llama-factory==0.7.1 transformers==4.40.0 alpha-vantage==2.3.1
獲取原始 OHLCV
from alpha_vantage.timeseries import TimeSeries
ts = TimeSeries(key='YOUR_KEY', output_format='pandas')
df, _ = ts.get_daily_adjusted('SPY', outputsize='full')
df = df.sort_index().tail(60)
自動(dòng)標(biāo)注漲跌
label="漲"label="跌"文本化 K 線
“過去 60 個(gè)交易日,最高價(jià) XXX,最低價(jià) XXX,成交量呈現(xiàn)放大趨勢…”
加入宏觀新聞
生成 2?000 條訓(xùn)練樣本
train.jsonl / val.jsonl配置 finetune.yaml
model_name_or_path: NousResearch/Llama-2-7b-hf
stage: sft
finetuning_type: lora
lora_rank: 64
lora_target: q_proj,v_proj
dataset: spy_news
template: alpaca
num_train_epochs: 3
per_device_train_batch_size: 1
gradient_accumulation_steps: 32
learning_rate: 2e-4
bf16: true
output_dir: ./llama3-spy-lora
啟動(dòng)訓(xùn)練
llamafactory-cli train finetune.yaml
監(jiān)控 TensorBoard
train_loss 從?1.4 降至?0.8eval_accuracy 達(dá)?62?%(基線?50?%)from fastapi import FastAPI
from peft import PeftModel
from transformers import LlamaForCausalLM, LlamaTokenizer
import torch
app = FastAPI()
base = LlamaForCausalLM.from_pretrained(
"NousResearch/Llama-2-7b-hf",
torch_dtype=torch.bfloat16,
device_map="auto"
)
model = PeftModel.from_pretrained(base, "./llama3-spy-lora")
tokenizer = LlamaTokenizer.from_pretrained("NousResearch/Llama-2-7b-hf")
@app.post("/predict")
def predict(req: dict):
prompt = f"根據(jù)以下信息預(yù)測次日{(diào)req['symbol']}漲跌:{req['text']}"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=32, do_sample=False)
answer = tokenizer.decode(out[0], skip_special_tokens=True)
pred = "漲" if "漲" in answer else "跌"
return {"symbol": req["symbol"], "pred": pred}
性能:單卡 4 并發(fā),QPS≈12,P99延遲≈280?ms
信號(hào)轉(zhuǎn)訂單(Alpaca API 示例)
import alpaca_trade_api as tradeapi
api = tradeapi.REST(API_KEY, SECRET, base_url='https://paper-api.alpaca.markets')
if pred == "漲":
api.submit_order(symbol="SPY", qty=10, side='buy', type='market', time_in_force='gtc')
定時(shí)任務(wù)**
觸發(fā):每日 16:00 ET
流程:拉數(shù)據(jù) → 調(diào)用推理 → 下單 → 釘釘推送
年化收益:31?%,最大回撤?9?%
同期 SPY:年化?19?%,回撤?12?%
| 癥狀 | 診斷 | 對策 |
|---|---|---|
| 數(shù)據(jù)泄漏 | 新聞時(shí)間戳晚于收盤 | 確保新聞時(shí)間早于當(dāng)日收盤 |
| 顯存飆升 | LoRA rank >?128 | 降低 rank 至 64\~128 |
| 新聞?wù)Z言不符 | 中文新聞未翻譯 | 先翻譯再喂入模型 |
| 推理“漲跌互現(xiàn)”幻覺 | 溫度設(shè)置 ≠ 0 | 強(qiáng)制 do_sample=False(greedy) |
| 券商 API T+0 限制 | ETF 市價(jià)單無法當(dāng)天平倉 | 使用“市價(jià) + 日內(nèi)平倉”策略 |
GitHub:github.com/yourname/llama3-alpha-trading
包含:
data_pipeline.py:Alpha Vantage → jsonlfinetune.yaml & train.shinference/:完整 FastAPI 服務(wù)cloud_function.zip:阿里云函數(shù) 60?秒部署微調(diào)開源大模型并非“穩(wěn)賺不賠”的水晶球,而是讓交易迭代從“天”為單位降至“小時(shí)”,將研究成本從十張 V100 降到一張 4090。
用GPT?4+Llama?3,用一杯咖啡的錢,跑完價(jià)值百萬的策略。