Table of Contents
在 TQuant 回測與實盤交易中,下單函數是策略與資金管理的樞紐。選對下單方法不僅能讓程式碼更簡潔易讀,還能提升風險控管與組合再平衡的效率。TQuant 提供三大維度(股數、金額、權重)的下單函數,以及每種維度的「普通下單」與「目標下單」對應版本,共有以下六種方式。接下來,將分別說明它們的功能特色、參數意義與應用建議。
操作說明:
如前面的文章說明,下單函數主要是在 handle_data 函數中進行使用以及邏輯的設計,並且在 run_algorithm 的回測函數中,會以迴圈的方式每日去檢驗是否達成下單條件,因此我們可以將這個下單邏輯設定的非常仔細,來應對真實世界的交易情況。
功能:直接以指定股數買入或賣出。適合需精確控制每筆下單股數的場景。
參數:asset : 目標資產 (以symbol(‘股票代碼’)、amount : 買賣股數(正值買入、負值賣出)
範例:
# 買入 100 股
order(symbol('2330.TW'), 100)
# 賣出 50 股
order(symbol('2330.TW'), -50)
應用建議:當您已知每筆固定股數、或需對特定股數區間進行操作時,order 最為直接。
功能:自動計算(目標股數 − 目前持股),並下單至指定股數。適合以持股目標為導向的調倉策略。
參數:asset:目標證券、target_amount:最終持股股數
範例:
# 不論當前持有多少,都將持倉調整至200股,因此當持股高於200股時將自動進行賣出,反之即為買入。
order_target(symbol('2330.TW'), 200)
應用建議:若下單需求是「調整至某固定股數」,可省去自行計算差額的麻煩。
功能:以指定資金金額買入或賣出,按當日價格估算可成交股數。適合以資金規模為單位的操作。
參數:asset:目標證券、value:買入/賣出金額(正值買入、負值賣出)
範例:
# 以新台幣 50,000 元買入
order_value(symbol('2330.TW'), 50000)
應用建議:當策略以「每筆金額固定」或需根據組合總資金比例分配時,order_value 更直觀。
功能:將該標的調整至目標市值(=目標市值 − 當前市值)。方便進行市值層面的再平衡。
參數:asset:目標證券、target_value:最終持倉市值
範例:
# 調整至持有市值200,000元,因此當該檔持股高於200,000元時將自動進行賣出,反之即為買入。
order_target_value(symbol('2330.TW'), 200000)
應用建議:在多標的組合中,若想對單檔市值進行嚴格再平衡,可使用此函數。
功能:依組合淨值比例買入或賣出,例如 0.1 表示買入占淨值 10% 的標的。
參數:asset:目標證券、percent:下單比例(正值買入、負值賣出)
範例:
# 買入占組合淨值 15% 的 2330.TW
order_percent(symbol('2330.TW'), 0.15)
應用建議:當策略需動態調整各檔權重但不在意精確股數或金額時,order_percent 操作最簡便。
功能:將該標的調整至目標權重(=目標權重 − 當前權重),實現嚴格的組合再平衡。
參數:asset:目標證券、target_percent:最終目標權重(介於 −1.0 ~ 1.0)
範例:
# 調整至占比 20%,因此當該檔持股高於 20%時將自動進行賣出,反之即為買入。
order_target_percent(symbol('2330.TW'), 0.20)
應用建議:在多檔資產或風格輪動策略中,order_target_percent 是最直觀的再平衡工具。
結合 TQuant Day 4 的文章內容,我們可以結合四大回測架構以及剛學習的下單方法做出簡易的投資策略
### 方便理解我們挑選兩支簡單策略。
首先我們會需要匯入回測資料,此處為下一篇文章的內容,此時我們只需要瞭解這是將需要交易的股票資料匯入回測系統的指令!
匯入回測資料程式碼展示:此處的回測期間設定為2023-12-31至2024-12-31一年的區間,大約252個交易日。讀者可以在 pool 的串列中新增想交易的股票代碼,即可匯入他們的價量資料匯入回測系統!
import os
import tejapi
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.family'] = 'Arial'
tej_key = 'your key'
os.environ['TEJAPI_BASE'] = "https://api.tej.com.tw"
os.environ['TEJAPI_KEY'] = tej_key
from zipline.data.run_ingest import simple_ingest
from zipline.api import set_slippage, set_commission, set_benchmark, symbol
from zipline.api import order_target_percent, order_value
from zipline import run_algorithm
pool = ['0050', 'IR0001']
start_date = '2023-12-31'
end_date = '2024-12-31'
simple_ingest(name = 'tquant' , tickers = pool , start_date = start_date , end_date = end_date)
def initialize(context, pool = pool):
# 定義需要回測的股票有哪些,目前的 pool 內容為 0050 ETf, IR0001 (讀者可以先默認這是大盤)
context.pool = pool
# 此變數 i 是用來記錄回測當下是第幾個交易日
context.i = 0
# 此處為設定策略的比較基準:加權報酬指數
set_benchmark(symbol('IR0001'))
### 讀者可以設定滑架以及手續費模型
#set_slippage(slippage.TW_Slippage(spread = 0.3 , volume_limit = 1))
#set_commission(commission.Custom_TW_Commission(min_trade_cost=20, discount=1.0, tax = 0.003))
# 策略一的邏輯,當回測開始的第一天 all in 0050 ETF
def handle_data_1(context, data):
if context.i == 0:
order_target_percent(symbol('0050'), 1.0)
context.i += 1
# 策略二的邏輯,每30天買入 0050 ETF 買次花費 10000元
def handle_data_2(context, data):
if context.i % 30 == 0:
order_value(symbol('0050'), 10000)
context.i += 1
def analyze_1(context, perf):
plt.style.use('ggplot')
plt.figure(figsize = (15, 6))
plt.plot(perf.index, perf['algorithm_period_return'], label = 'strategy 1')
plt.plot(perf.index, perf['benchmark_period_return'], label = 'benchmark')
plt.title("Strategy 1")
plt.legend()
plt.show()
results = run_algorithm(
start = pd.Timestamp(start_date, tz = 'utc'),
end = pd.Timestamp(end_date, tz = 'utc'),
initialize = initialize,
handle_data = handle_data_1,
analyze = analyze_1,
bundle = 'tquant',
capital_base = 8e4)
def analyze_2(context, perf):
plt.style.use('ggplot')
plt.figure(figsize = (15, 6))
plt.plot(perf.index, perf['algorithm_period_return'], label = 'strategy 2')
plt.plot(perf.index, perf['benchmark_period_return'], label = 'benchmark')
plt.title('Strategy_2')
plt.legend()
plt.show()
results = run_algorithm(
start = pd.Timestamp(start_date, tz = 'utc'),
end = pd.Timestamp(end_date, tz = 'utc'),
initialize = initialize,
handle_data = handle_data_2,
analyze = analyze_2,
bundle = 'tquant',
capital_base = 8e4)
以上介紹了 Zipline 中六種下單方式,各有適用場景與優劣。精確股數、資金金額或投組權重的選擇,應以策略邏輯與風控需求為依歸。掌握正確的下單函數,不僅能讓回測程式更簡潔,也可確保交易指令準確無誤,有助於提升策略開發效率與執行品質。祝您在量化研究與實盤應用中取得更佳成果!
歡迎投資朋友參考,之後也會持續介紹使用 TEJ 資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。
溫馨提醒,本次分析僅供參考,不代表任何商品或投資上的建議。
【TQuant 從 0 到 1 – Day 1】 量化交易入門神器:用 TQuant Lab 讓錢自己來敲門,小白秒變量化大神!
【TQuant 從 0 到 1 – Day 2】 避開量化交易的隱形殺手:用 TQuant Lab 精準控制手續費與滑價,讓策略更勝一籌!
【TQuant 從 0 到 1 – Day 3】打造投資數據全視角:股票池篩選與 TejToolAPI 資料獲取
【TQuant 從 0 到 1 – Day 4】 回測四大架構的基本設定: Initialize的具體設定有什麼?
相關連結