TQuant Lab 處置股該買嗎?處置股的回測表現

處置股該買嗎
Photo by Nick Chong on Unsplash

本文重點概要

  • 文章難度:★☆☆☆☆
  • 處置股該買嗎?探討處置股與加權報酬之間的關係。
  • 以 TQuant Lab 回測平台撰寫買賣處置股票並回測風險與績效。

前言

什麼是處置股?處置股指的是買賣狀況異常的股票。何謂買賣狀況異常?證交所有一套分類機制,在股票列入「處置股票」名單前,會先列入「注意股票」一段時間,「注意股票」的挑選標準,其實就是買賣狀況異常的前兆。「注意股票」定義是股票 6 日累積漲跌幅超過 25% 即可能列為注意股票。這種異常的交易情形通常是因為漲跌幅度、周轉率、成交量是否報大量等幾個條件作為依據,而主管機關為了降低投資人風險,避免過熱的情形,制定這套警示處置的降溫機制。

而最近知名的 00940 也一度被主管機關注意,雖未掛牌上市,但募集資金已超過 1700 億元。若成功上市,依照目前的熱度,可能會被主管機關列為注意股甚至是處置股。然而,處置股真的是不好的投資標的嗎?因此本文打算做一個簡易的買進持有,回測處置股的表現。

處置股資料選取

我們將在 2020/01/01 至 2023/12/31 內找尋所有被金管會列為處置股的股票作為投資標的。

編輯環境與模組需求

本文使用 Windows 作業系統以及 Jupyter Notebook 作為編輯器。

資料導入

import os
import pandas as pd
import TejToolAPI 
from zipline.data import bundles
from logbook import Logger, StderrHandler, ERROR
from zipline.sources.TEJ_Api_Data import get_universe

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

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

start = '2020-01-01'
end = '2023-12-31'
pool = get_universe(start, end, mkt = ['TWSE', 'OTC'], stktp_c = '普通股')

os.environ['mdate'] = start + ' ' + end
os.environ['ticker'] = ' '.join(pool) + ' ' + 'IR0001'

!zipline ingest -b tquant

資料期間從 2020-01-01 至 2023–12–31,加入加權報酬指數 IR0001,作為大盤比較。

建立 initialize 函式

initialize() 函式用於定義交易開始前的每日交易環境,與此例中我們設置:

  • 滑價成本
  • 交易手續費
  • 報酬指數 ( IR0001 ) 作為大盤指數
from zipline.api import *
from zipline.finance import commission, slippage

bundle_data = bundles.load('tquant')
universe = bundle_data.asset_finder.retrieve_all(bundle_data.asset_finder.equities_sids)   
tickers = [col.symbol for col in universe]

def initialize(context):
    set_slippage(slippage.VolumeShareSlippage(volume_limit = 0.025, price_impact = 0.1))
    set_commission(commission.Custom_TW_Commission(min_trade_cost = 20, discount = 1.0, tax = 0.003))
    set_benchmark(symbol('IR0001'))
    context.asset = [symbol(i) for i in tickers]
    context.rules = ['處置股票(Disposition Securities)'] #找尋為處置股票的標的
    context.has_ordered = []

建立 before_trading_start 函式

before_trading_start() 類似 handle_data() ,為構建買賣處置股的重要函式,會在回測開始後每天被呼叫,主要任務為設定交易策略、下單與紀錄交易資訊。

def before_trading_start(context, data):
    
    for ticker in context.asset: 
        annotation = data.current(ticker, 'annotation')

        #非處置股則不下單,且清空帳上股票
        if isinstance(annotation, str) and any(s in annotation for s in context.rules) and not ticker in context.has_ordered:
            order(ticker, 1000)
            context.has_ordered.append(ticker)

        #若已經在帳戶內,則不下單
        elif ticker in context.has_ordered:
            order(ticker, 0)

        #已經離開處置股,則清空帳戶    
        else:
            if ticker in set(context.portfolio.positions.keys()): # 當日前持有部位的股票標的
                order_target(ticker, 0)
                context.has_ordered.remove(ticker)

執行交易策略

使用 run_algorithm() 執行上述設定的買賣處置股,設置交易期間為 start_dt(2020-01-01) 到 end_dt(2023-12-31),使用資料集 tquant,初始資金為一千萬元。其中輸出的 results 就是每日績效與交易的明細表。

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

start_date = pd.Timestamp(start, tz = 'utc')
end_date = pd.Timestamp(end, tz = 'utc')
capital_base = 1e7
calendar_name = 'TEJ'

results = run_algorithm(
    start = start_date,
    end = end_date,
    initialize=initialize,
    bundle='tquant',
    capital_base=capital_base,
    data_frequency='daily',
    before_trading_start = before_trading_start,
    trading_calendar=get_calendar(calendar_name)
)
results
處置股該買嗎
交易明細表

所以處置股該買嗎?利用 Pyfolio 進行績效評估

import pyfolio as pf
from pyfolio.utils import extract_rets_pos_txn_from_zipline

returns, positions, transactions = pf.utils.extract_rets_pos_txn_from_zipline(results)
benchmark_rets = results.benchmark_return

# Creating a Full Tear Sheet
pf.create_full_tear_sheet(returns, positions = positions, transactions = transactions,
                          benchmark_rets = benchmark_rets,
                          round_trips=False)
處置股該買嗎

透過上圖可以看到買賣處置股策略在這 46 個月中我們獲得了約 19.71% 的年化報酬,累積報酬約 100%,表現勉強與大盤持平。然而買賣處置股相較大盤卻是一個風險更高的投資策略,由於處置股特性是搓合時間變長,讓投資者無法及時進行交易,導致持有意願變低。因此當股票落在跌幅期間時,下降幅度會明顯於大盤,讓策略績效表現低迷。主管機關會因為一檔股票的周轉率、漲幅與過去表現相比太過不正常,讓該股票列為處置股。因此在買進過熱股票前,要先預期該股票是否會被主管機關列為注意股或是處置股,避免導致承受相較其他股票更大的風險。

處置股該買嗎
月報酬率變化圖

藉由上圖可以看到,買賣處置股的投資策略月報酬不僅報酬率不佳,且負報酬的比率相當高,當投資人採用該投資策略時將會承受相當承重的壓力。

結論

本次實作我們選擇處置股當作投資標的,利用 TQuant Lab 進行買進賣出持有標的的回測績效分析。從分析結果看來,處置股的年報酬率與累計報酬率勉強與大盤持平,但投資人承受的風險相當高。當兩組投資策略獲利相同時,投資人應選擇風險較低的投資標的作為投資目標,以避免風險與收益不匹配的問題。

筆者認為盲目跟從買入過熱的股票會有極高的風險,巴菲特曾經說過:「別人恐懼我貪婪」,意思是當別人一頭熱進場時,你跟著進場;別人看衰時,你也跟著停損,但真正的贏家不是查看當下情況,而是在遠方仔細觀察。因此,投資者應該以長期的視角來思考,避免盲目跟隨市場波動。重要的是要在購買股票時應該從多個角度進行評估和考慮,以確保做出明智的投資決策。

之後也會持續介紹使用 TEJ 資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。

溫馨提醒,本次策略僅供參考,不代表任何商品或投資上的建議

【TQuant Lab回測系統】解決你的量化金融痛點

全方位提供交易回測所需工具

Github 原始碼

點此前往 Github

延伸閱讀

相關連結

返回總覽頁
Procesing