跳轉到

手續費模型介紹

  • 交易成本(transaction costs)被廣泛認為是影響投資績效的重要因素。它們不僅影響投資績效,還影響了將資產轉換成現金的難易度。

zipline.api.set_commission(self, equities=None, futures=None)

設定回測時所使用的手續費模型

Parameters:

  • equities (EquityCommissionModel, optional) -用於交易股票的手續費模型。

    • EquityCommissionModel:zipline.finance.commission
  • futures (FutureCommissionModel, optional) -用於交易期貨的手續費模型。(目前不支援)

    • FutureCommissionModel:zipline.finance.commission

Raises:

SetCommissionPostInit-set_commission 只能在 initialize 階段使用。

Notes:

  • set_commission 只能一次用一種方法。
  • 手續費計算時,價格以成交日收盤價為準,數量也以成交時為準。也就是說,如果因為股數變動造成 amount 有任何變化,計算上都是用成交時新的 amount。

手續費模型共有四種:

  • zipline.finance.commission.PerShare
  • zipline.finance.commission.PerTrade
  • zipline.finance.commission.PerDollar
  • zipline.finance.commission.Custom_TW_Commission

Examples:

from zipline.api import set_commission
from zipline.finance import commission

def initialize(context):
    set_commission(commission.<其中一種commission models>)

PerDollar : 按照交易金額抽成計算

zipline.finance.commission.PerDollar(cost=0.0015)

  • 按照交易金額抽成計算。
  • 僅適用於 equities。

Parameters:

  • cost (float, optional) : 每交易一元的股票所需支付的固定費用。預設為 0.0015 元。

Notes:

手續費計算時,價格以成交日收盤價為準,數量也以成交時為準,也就是說,如果因為股數變動造成 amount 有任何變化,計算上都是用成交時新的 amount。手續費計算時,價格以成交日收盤價為準,數量也以成交時為準,也就是說,如果因為股數變動造成 amount 有任何變化,計算上都是用成交時新的 amount。

Examples:

import pandas as pd
import datetime
import tejapi
import os
import warnings
from logbook import Logger, StderrHandler, INFO
warnings.filterwarnings('ignore')

# set log
log_handler = StderrHandler(format_string='[{record.time:%Y-%m-%d %H:%M:%S.%f}]: ' +
                            '{record.level_name}: {record.func_name}: {record.message}',
                            level=INFO)
log_handler.push_application()
log = Logger('CommissionModel')

# tej_key
os.environ['TEJAPI_KEY'] = "your key" 
os.environ['TEJAPI_BASE'] = "https://api.tej.com.tw"

# date
# set date
start='2022-12-01'
end='2022-12-31'
os.environ['mdate'] = '20221201 20221231'

tz = 'UTC'
start_dt, end_dt = pd.Timestamp(start, tz = tz), pd.Timestamp(end, tz = tz)

# calendar
calendar_name='TEJ'

# bundle_name
bundle_name = 'tquant'

# ticker
os.environ['ticker'] = '1216 IR0001'

# ingest
!zipline ingest -b tquant
Merging daily equity files:
[2023-11-27 03:31:44.753277] INFO: zipline.data.bundles.core: Ingesting tquant.
from zipline.finance import commission, slippage
from zipline.api import *

from zipline import run_algorithm
from zipline.utils.calendar_utils import get_calendar

from zipline.utils.run_algo import (get_transaction_detail,
                                    get_record_vars)

  • 模型參數cost設定為: 0.001 ,相當於每交易一元的股票所需支付 0.001 元。
  • 滑價模型設定為:slippage.FixedSlippage(spread=0.00)。其中,spread 設定為 0,這樣會比較好觀察結果,因為滑價會導致成交價格改變。若有滑價則會使用考慮滑價後的價格計算手續費。
    def initialize_perdollar(context):
        context.i = 0
        context.tickers = ['1216']
        context.asset = [symbol(ticker) for ticker in context.tickers]      
        set_slippage(slippage.FixedSlippage(spread=0.00))
    
        # set_commission
        set_commission(equities=commission.PerDollar(cost=0.001))
    
        set_benchmark(symbol('IR0001'))
    
    def handle_data(context, data):
    
        if context.i == 0:
            for asset in context.asset:
                order_target(asset, 1000)
        if context.i == 2:
            for asset in context.asset:
                order_target(asset, 0)
    
        record(close=data.current(context.asset, 'close'))
        context.i += 1
    
    capital_base = 1e5
    
    closing_price = tejapi.get('TWN/APIPRCD',
                               coid=['1216'],
                               opts={'columns':['mdate','coid','close_d']},
                               mdate={'gte':start_dt,'lte':end_dt },
                               paginate=True)
    
    perdollar = run_algorithm(start=start_dt,
                              end=end_dt,
                              initialize=initialize_perdollar,
                              handle_data=handle_data,
                              capital_base=capital_base,
                              trading_calendar=get_calendar(calendar_name),
                              bundle=bundle_name)
    
  • 查看12/1的收盤價

    # 收盤價
    closing_price[0:2]
    

  • 在 12/1 下單一張統一(1216)股票,用 PerDollar 算法,費用就是下一個交易日 12/2 的收盤價 65 * 1000 股 * 0.001 = 65。

    # PerDollar算法:費用65元
    perdollar['orders'][1]
    
    [{'id': '363000dc2c1e4e5eae7ed2ec4b85ee43',
    'dt': Timestamp('2022-12-02 13:30:00+0800', tz='Asia/Taipei'),
    'reason': None,
    'created': Timestamp('2022-12-01 13:30:00+0800', tz='Asia/Taipei'),
    'amount': 1000,
    'filled': 1000,
    'commission': 65.0,
    'stop': None,
    'limit': None,
    'stop_reached': False,
    'limit_reached': False,
    'sid': Equity(0 [1216]),
    'status': }]