Table of Contents
KD指標(英文:Stochastic Oscillator),也稱為隨機指標,是技術分析常見的指標之一,主要用於判斷股價短期的強弱程度與可能反轉的時機。KD 指標的數值介於 0-100,一般以 50 作為分水嶺,當指標大於 50 時,表示股價處於強勢階段;反之,當指標小於 50 時,股價屬於弱勢階段。另外,當 KD 指標小於 20 時,股票往往有超賣的跡象,隨時有反轉向上的可能;反之當 KD 指標大於 80 時,股票往往有超買的跡象,隨時有反轉向下的可能。因此,許多人依此來建構交易訊號,作為買賣股票的依據。
KD 指標的計算流程如下:
從算式來看,可以把 RSV 解讀成當日股價相較於近 N 日股價,是屬於較強勢還是弱勢。K 值,又被稱為快線,因為受到當日股價強弱的影響較大;而 D 值計算的原理如同再進行一次平滑,故對當前股價變化反應較慢。
另外,算式中的 N 值為計算指標的移動窗格,可以根據不同的投資屬性而定。設定較大的 N 值可以使 KD 值趨於平穩,並因為基於較長的基期計算 KD 值,可使指標提供的反轉訊號較為精準,適合中長期的投資人。反之,較小的 N 值會使 KD 指標較為敏感,適合短期的投資人。
本文採用 KD 指標來判斷股價反轉時機,利用以下進出場規則建立交易策略並進行回測:
此外,因為本策略涉及較長的回測期間,因此將 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
get_universe
選取 2012-01-01 至 2019-12-31 於台灣 50 指數中的股票。!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()
提供使用者快速處理多檔標的的量化指標與價量資料的功能,於本次案例我們用以處理:
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
initialize()
函式用於定義交易開始前的每日交易環境,於此例中我們設置:
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()
為構建交易策略的重要函式,會在回測開始後每天被呼叫,主要任務為設定交易策略、下單與紀錄交易資訊。
本範例運用KD指標來建構交易策略,在指標顯示超賣時買進,在指標顯示超買時賣出。
交易策略的進出場規則:
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
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)
透過上圖可以發現大盤在這 4 年內有 2 倍的報酬,反觀 KD 指標策略僅有約 17.7 % 的累積報酬,年化報酬率與年化波動度則分別為 4 % 和 17.1 %,會造成 KD 指標策略與大盤績效在回測期間的差距,筆者認為有三大原因:
針對以上三點,我們可以將 KD 指標策略搭配其他指標來獲得改善,比如一些協助判斷指標背離的因子 ( 關於指標背離的運用可參考:TQuant Lab RSI 均線策略,找出低檔反向操作 ),或是結合 MACD 等指標,這部分我們留待日後再進行更深入的探討。
本次策略發想自 KD指標回測實戰,利用 TQaunt Lab 導入多檔股票並使用 Pipeline
的內建因子庫加速計算 KD 指標策略所需的 K 值 ,而後進行 KD 指標策略的回測。雖然回測的結果不盡理想,但我們也因此觀察出 KD 指標策略的三個缺點:指標鈍化、錯過買賣時機點以及交易假訊號產生,投資人在使用 KD 指標時也應注意以上的狀況或搭配其他指標幫助進出場。
溫馨提醒,本次策略與標的僅供參考,不代表任何商品或投資上的建議。之後也會介紹使用TEJ資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。
電子報訂閱