TQuant Lab KD 指標策略,探索股價反轉時機?

本文重點摘要

  • 文章難度:★★☆☆☆
  • 本文改編自KD指標回測實戰,利用 TQaunt Lab 進行策略優化與調整。
  • 利用 TQuant Lab 內建因子計算出 KD 指標,並透過 KD 指標判斷股價反轉時機,比較 KD 指標策略於 ( 2020-01-01 至 2024-04-10 ) 能否賺取超額報酬。

前言

KD指標(英文:Stochastic Oscillator),也稱為隨機指標,是技術分析常見的指標之一,主要用於判斷股價短期的強弱程度與可能反轉的時機。KD 指標的數值介於 0-100,一般以 50 作為分水嶺,當指標大於 50 時,表示股價處於強勢階段;反之,當指標小於 50 時,股價屬於弱勢階段。另外,當 KD 指標小於 20 時,股票往往有超賣的跡象,隨時有反轉向上的可能;反之當 KD 指標大於 80 時,股票往往有超買的跡象,隨時有反轉向下的可能。因此,許多人依此來建構交易訊號,作為買賣股票的依據。

KD 指標的計算流程如下:

  • RSV = ( ( 當日收盤價 – 近 N 日的最低價 ) / ( 近 N 日的最高價 – 近 N 日的最低價 ) ) * 100
  • K 值 = 昨日 K 值 × ( 2 / 3 ) + 當日 RSV × ( 1 / 3 )
  • D 值 = 昨日 D 值 × ( 2 / 3 ) + 當日 K 值 × ( 1 / 3 )

從算式來看,可以把 RSV 解讀成當日股價相較於近 N 日股價,是屬於較強勢還是弱勢。K 值,又被稱為快線,因為受到當日股價強弱的影響較大;而 D 值計算的原理如同再進行一次平滑,故對當前股價變化反應較慢。

另外,算式中的 N 值為計算指標的移動窗格,可以根據不同的投資屬性而定。設定較大的 N 值可以使 KD 值趨於平穩,並因為基於較長的基期計算 KD 值,可使指標提供的反轉訊號較為精準,適合中長期的投資人。反之,較小的 N 值會使 KD 指標較為敏感,適合短期的投資人。

KD 指標策略

本文採用 KD 指標來判斷股價反轉時機,利用以下進出場規則建立交易策略並進行回測:

  • K ≤ 20,買入,因其代表股價較弱、市場過冷的狀態
  • K ≥ 80,賣出,代表市場過熱,因此選擇獲利了結

此外,因為本策略涉及較長的回測期間,因此將 N 值設為 36 日,而非在計算 KD 指標時較為常見的 14 日窗格。

編輯環境與模組需求

本文使用 Windows 11 並以 Jupyter Lab 作為編輯器。

載入套件與環境設定

import pandas as pd
import numpy as np
import os

tej_key = 'your key'
api_base = 'https://api.tej.com.tw'

os.environ['TEJAPI_KEY'] = tej_key 
os.environ['TEJAPI_BASE'] = api_base

選取股票池並導入價量資料

  1. 利用 get_universe 選取 2012-01-01 至 2019-12-31 於台灣 50 指數中的股票。
  2. 設定回測期間 (2020-01-01 至 2024-04-10 ),並利用 !zipline ingest -b tquant 導入價量資料。
from zipline.sources.TEJ_Api_Data import get_universe

# get the stock list from Taiwan 50 index
StockList = get_universe('2012-01-01', '2019-12-31', idx_id = 'IX0002')
StockList.append('IR0001')

# set backtest period
start = '2020-01-01'
end = '2024-04-10'

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

!zipline ingest -b tquant

建立 Pipeline 函式

Pipeline() 提供使用者快速處理多檔標的的量化指標與價量資料的功能,於本次案例我們用以處理:

  • 利用 TQuant Lab 的內建因子 FastStochasticOscillator ( 快速隨機指標 ) 計算 K 值。

p.s. FastStochasticOscillator ( 快速隨機指標 ) 即為我們所需的 K 值。

from zipline.pipeline import Pipeline
from zipline.pipeline.data import TWEquityPricing
from zipline.pipeline.factors import FastStochasticOscillator
from zipline.TQresearch.tej_pipeline import run_pipeline 

def make_pipeline():
    
    return Pipeline(
        columns = {
            "FastStochasticOscillator": FastStochasticOscillator(
                inputs = [TWEquityPricing.close, TWEquityPricing.low, TWEquityPricing.high],
                window_length = 36
            )
        }
    )

start_date = pd.Timestamp('2020-01-01',tz='utc')
end_date = pd.Timestamp('2024-04-10',tz='utc')
result = run_pipeline(make_pipeline(), start_date, end_date)

result
KD 指標策略
Pipeline 計算結果展示

建立 initialize 函式

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

  • 流動性滑價
  • 交易手續費
  • 買入持有加權股價報酬指數 ( IR0001 ) 的報酬作為基準
  • 將上述計算的 Pipeline 導入交易流程中
from zipline.api import *
from zipline.finance import slippage, commission

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))
    # setting benchmark    
    set_benchmark(symbol('IR0001'))  
    attach_pipeline(make_pipeline(), 'mystrategy')

建立 handle_data 函式

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

本範例運用KD指標來建構交易策略,在指標顯示超賣時買進,在指標顯示超買時賣出。

交易策略的進出場規則:

  • Long Entry:
    • K ≤ 20 且現金水位充足,買入股票池中條件成立的股票,配置帳戶資金 100,000 元。
  • Short Entry:
    • K ≥ 80,賣出條件成立的股票。
def handle_data(context, data):
    out_dir = pipeline_output('mystrategy')  # to get daily K value from pipeline
    for i in out_dir.index:
        K_value = out_dir.loc[i, 'FastStochasticOscillator']
        stock_position = context.portfolio.positions[i].amount
        cash_position = context.portfolio.cash

        # initial long entry:
        if stock_position == 0 and cash_position >= 100000:
            if K_value <= 20:
                order_value(i, 100000)

        elif stock_position > 0:
            # overweight entry: 
            if K_value <= 20 and cash_position >= 100000:
                order_value(i, 100000)

            # short entry:
            elif K_value >= 80: 
                order_target_percent(i, 0.0)

執行交易策略

使用 run_algorithm() 執行上述所編撰的 KD 指標策略,設置交易期間為 start_date ( 2020-01-01 ) 到 end_date ( 2024-04-10 ),所使用資料集為 tquant,初始資金為 10,000,000 元。其中輸出的 results 就是每日績效與交易的明細表。

from zipline import run_algorithm

start_date = pd.Timestamp('2020-01-01',tz='utc')
end_date = pd.Timestamp('2024-04-10',tz='utc')

results = run_algorithm(start = start_date,  
                        end = end_date,
                        initialize = initialize,                      
                        capital_base = 1e7,                      
                        handle_data = handle_data,
                        data_frequency = 'daily',
                        bundle = 'tquant'
                        )
results
KD 指標策略
交易明細表

利用 Pyfolio 進行績效評估

import pyfolio as pf

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(bt_returns, positions = positions, transactions = transactions,
                          benchmark_rets = benchmark_rets)
KD 指標策略
回測表現與大盤比較圖

透過上圖可以發現大盤在這 4 年內有 2 倍的報酬,反觀 KD 指標策略僅有約 17.7 % 的累積報酬,年化報酬率與年化波動度則分別為 4 % 和 17.1 %,會造成 KD 指標策略與大盤績效在回測期間的差距,筆者認為有三大原因:

  1. 指標鈍化:在股市走強初期,因股價逐步向上攀升,使 KD 指標向上達到 >= 80 的超買訊號,導致策略出清部位,無法享受到後續持續上漲的波段價差。
  2. 錯過買賣時機點:在此範例中我們以 K 值 = 20 及 80 作為交易進出點,不過有些股票可能還沒跌破 20 便開始回升;反之,尚未突破 80 即出現上檔賣壓,於這些情形中,KD 指標策略便無法賺取報酬。
  3. 交易假訊號產生:交易假訊號可能會發生於高波動的股票,因為股價的大幅震盪,使指標出現誤判。舉例來說,KD 指標策略出現買進訊號,但其實股票只是在進行盤整波動。

針對以上三點,我們可以將 KD 指標策略搭配其他指標來獲得改善,比如一些協助判斷指標背離的因子 ( 關於指標背離的運用可參考:TQuant Lab RSI 均線策略,找出低檔反向操作 ),或是結合 MACD 等指標,這部分我們留待日後再進行更深入的探討。

結論

本次策略發想自 KD指標回測實戰,利用 TQaunt Lab 導入多檔股票並使用 Pipeline 的內建因子庫加速計算 KD 指標策略所需的 K 值 ,而後進行 KD 指標策略的回測。雖然回測的結果不盡理想,但我們也因此觀察出 KD 指標策略的三個缺點:指標鈍化、錯過買賣時機點以及交易假訊號產生,投資人在使用 KD 指標時也應注意以上的狀況或搭配其他指標幫助進出場。

溫馨提醒,本次策略與標的僅供參考,不代表任何商品或投資上的建議。之後也會介紹使用TEJ資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。

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

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

原始碼

延伸閱讀

相關連結

返回總覽頁
Procesing