在本課中,我們將學習如何將交易策略部署到實時環境,使用交易API與券商接口進行下單。同時,我們將討論如何實時監控交易策略的性能,以及如何定期評估並調整策略,以確保其有效性和穩定性。今日 Colab
pandas
、numpy
、matplotlib
、requests
、websocket-client
等。示例:我們這次以 Alpaca API 為例(支持美股交易,且有沙盒環境可供測試)
import alpaca_trade_api as tradeapi
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_SECRET_KEY'
BASE_URL = 'https://paper-api.alpaca.markets'
api = tradeapi.REST(API_KEY, API_SECRET, BASE_URL, api_version='v2')
account = api.get_account()
print(f"可用資金:{account.buying_power}")
print(f"投資組合價值:{account.portfolio_value}")
api.submit_order(
symbol='AAPL',
qty=10,
side='buy',
type='market',
time_in_force='day'
)
api.submit_order(
symbol='AAPL',
qty=10,
side='sell',
type='limit',
limit_price=150.00,
time_in_force='gtc' # Good 'Til Canceled
)
orders = api.list_orders(status='all', limit=100)
for order in orders:
print(f"訂單ID:{order.id}, 狀態:{order.status}, 價格:{order.limit_price}")
import pandas as pd
def get_bars(symbol, timeframe, limit):
barset = api.get_barset(symbol, timeframe, limit=limit)
bars = barset[symbol]
data = [{'close': bar.c} for bar in bars]
df = pd.DataFrame(data)
return df
def simple_moving_average_strategy(symbol):
df = get_bars(symbol, 'day', 50)
df['SMA20'] = df['close'].rolling(window=20).mean()
df['SMA50'] = df['close'].rolling(window=50).mean()
if df['SMA20'].iloc[-1] > df['SMA50'].iloc[-1]:
# 下買單
api.submit_order(
symbol=symbol,
qty=10,
side='buy',
type='market',
time_in_force='day'
)
print(f"買入 {symbol}")
elif df['SMA20'].iloc[-1] < df['SMA50'].iloc[-1]:
# 下賣單
api.submit_order(
symbol=symbol,
qty=10,
side='sell',
type='market',
time_in_force='day'
)
print(f"賣出 {symbol}")
else:
print("無交易信號")
示例:訂閱實時行情
import websocket
import json
def on_open(ws):
print("連接成功")
auth_data = {
"action": "authenticate",
"data": {
"key_id": API_KEY,
"secret_key": API_SECRET
}
}
ws.send(json.dumps(auth_data))
listen_message = {
"action": "listen",
"data": {
"streams": ["T.AAPL"]
}
}
ws.send(json.dumps(listen_message))
def on_message(ws, message):
print("接收到消息:", message)
def on_error(ws, error):
print("發生錯誤:", error)
def on_close(ws):
print("連接關閉")
socket = "wss://data.alpaca.markets/stream"
ws = websocket.WebSocketApp(socket, on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close)
ws.run_forever()
import time
while True:
account = api.get_account()
positions = api.list_positions()
print(f"投資組合價值:{account.portfolio_value}")
for position in positions:
print(f"持倉:{position.symbol}, 數量:{position.qty}, 盈虧:{position.unrealized_pl}")
time.sleep(60) # 每分鐘檢查一次
import logging
from datetime import datetime
logging.basicConfig(filename='trading.log', level=logging.INFO)
def log_trade(action, symbol, price, quantity):
logging.info(f"{datetime.now()} - {action} {quantity} {symbol} at {price}")
matplotlib
或 plotly
等庫,繪製實時價格和指標圖表。Dash
或 Streamlit
等框架,構建網頁儀表板。示例:使用 matplotlib
實時更新圖表
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
prices = []
def update(frame):
current_price = get_current_price('AAPL')
prices.append(current_price)
plt.cla()
plt.plot(prices)
plt.xlabel('時間')
plt.ylabel('價格')
plt.title('AAPL 實時價格')
ani = FuncAnimation(plt.gcf(), update, interval=1000)
plt.show()
示例:當賬戶資產下降超過 5% 時發出告警
initial_portfolio_value = float(account.portfolio_value)
def check_risk():
account = api.get_account()
current_value = float(account.portfolio_value)
change = (current_value - initial_portfolio_value) / initial_portfolio_value
if change <= -0.05:
send_alert(f"資產下降超過 5%,當前價值:{current_value}")
def send_alert(message):
# 發送電子郵件或其他通知方式
print("告警:", message)
那我們也可以將今日的內容與 Backtrader
結合,進行實時交易策略部署監控
Backtrader 支持與多個實時交易平台集成,包括:
我們使用 Backtrader 與 Alpaca API 集成,將策略部署到實時環境。以下是具體步驟:
pip install backtrader
pip install alpaca-backtrader-api
import backtrader as bt
class MyStrategy(bt.Strategy):
def __init__(self):
self.sma20 = bt.indicators.SimpleMovingAverage(self.datas[0], period=20)
self.sma50 = bt.indicators.SimpleMovingAverage(self.datas[0], period=50)
def next(self):
if not self.position:
if self.sma20[0] > self.sma50[0]:
self.buy(size=10)
print(f"買入 {self.datas[0]._name}")
else:
if self.sma20[0] < self.sma50[0]:
self.sell(size=10)
print(f"賣出 {self.datas[0]._name}")
from alpaca_backtrader_api import AlpacaStore
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_SECRET_KEY'
USE_POLYGON = False # 是否使用 Polygon 作為數據源
# 設置 Alpaca Store
store = AlpacaStore(key_id=API_KEY, secret_key=API_SECRET, paper=True, usePolygon=USE_POLYGON)
# 設置 Broker
broker = store.getbroker()
# 設置實時數據源
data = store.getdata(dataname='AAPL', timeframe=bt.TimeFrame.Ticks, compression=1)
# 或者使用分鐘級別的數據
data = store.getdata(dataname='AAPL', timeframe=bt.TimeFrame.Minutes, compression=1)
cerebro = bt.Cerebro()
cerebro.addstrategy(MyStrategy)
cerebro.setbroker(broker)
cerebro.adddata(data)
# 設置初始資金
cerebro.broker.setcash(100000.0)
# 運行策略
cerebro.run()
Backtrader 內置了對實時數據和交易的支持,您可以通過策略中的回調方法(如 next
、notify_order
、notify_trade
等)監控實時交易的情況。
可能有部份讀者開始有點稿混,那我們來分類一下使用情況
您可以根據自己的需求和熟悉程度選擇使用 Backtrader 或直接使用 Alpaca API。如果您希望在一個框架內完成策略開發到部署的全流程,並且需要強大的回測和分析功能,那麼 Backtrader 是一個不錯的選擇。如果您更關注交易的執行和性能,並且策略相對簡單,直接使用 Alpaca API 可能更合適。
通過本課的學習,應該能夠將交易策略部署到實時環境,並且能夠使用交易 API 進行下單。同時,您也學會了如何實時監控策略的性能,並定期評估和調整策略,以適應不斷變化的市場環境。