近期台積電突破千元,台股站上23000點,法人警示指標已達短線超買階段,短線過熱新聞滿天飛,究竟該不蓋把手中持股賣出呢? 本文將帶領讀者觀察,市場常用的技術指標RSI、KD、乖離率達到超買階段,是否隱含股市接下來會有回調。
RSI
RSI指標,(英文全名:Relative Strength Index),中文稱為「相對強弱指標」,是一種以股價漲跌為基礎,在一段時間內的收盤價,用於評估價格變動的速度 (快慢) 與變化 (幅度) 的技術分析工具,RSI藉由計算一段期間內股價的漲跌變化,判斷最近的趨勢屬於偏強 (偏多) 還是偏弱 (偏空)。RSI 大於 80 時,為超買訊號,市場過熱,要準備開始跌了。RSI 小於 20 時,為超賣訊號,市場過冷,要準備開始漲了。
from finlab import login
from finlab.plot import plot_tw_stock_candles
from finlab.data import indicator
login("FINLAB_TOKEN")
rsi = indicator("RSI", timeperiod=10)
plot_tw_stock_candles(
stock_id="0050",
recent_days=120,
adjust_price=True,
technical_func=[{"RSI": rsi}],
)
回測
回測條件:
- 近月上漲幅度 > 歷史月漲幅90分位數 # 股市近期大幅上漲
- 收盤價 < 3日平均收盤價 # 收盤價略為回檔,避免賣在指標頓化階段
- RSI > 80 # 指標超買
import pandas as pd
import matplotlib.pyplot as plt
from finlab import login
from finlab.data import indicator
login("FINLAB_TOKEN")
rsi = indicator("RSI", timeperiod=10)
close = data.get("etl:adj_close")
rets_m = close / close.shift(20) - 1
quantile_return = rets_m.rolling(window=rets_m.shape[0], min_periods=0).quantile(0.9)
def backtest(cond: pd.DataFrame, close: pd.DataFrame):
results = []
for code in cond.columns:
for tdate in cond[code].index[cond[code]]:
cum_return = (
close.loc[tdate:, code]
.iloc[:10]
.pct_change()
.fillna(0)
.cumsum()
.reset_index(drop=True)
)
perf = {}
perf["code"] = code
perf["tdate"] = tdate
for idx in cum_return.index:
perf[f"t+{idx}"] = cum_return.iat[idx]
results.append(perf)
df = pd.DataFrame(results)
df.set_index("code", inplace=True)
return df
cond = pd.DataFrame(index=close.index, columns=close.columns)
for code in close.columns:
cond[code] = (
(rets_m[code] > quantile_return[code])
& (rsi[code] >= 80)
& (close[code] < ma3[code])
)
df = backtest(cond, close)
# plot
fig, ax = plt.subplots(nrows=2, ncols=1)
df.iloc[:, 2:].median().plot(title="累積報酬率(中位數)", ax=ax[0])
(df.iloc[:, 2:] < 0).mean().plot(title="下跌機率", ax=ax[1])
plt.subplots_adjust(hspace=0.5)
由上圖可以看到,市場近期大幅上漲後,RSI進入超買階段,但接下來10個交易日累積的報酬率幾乎都大於零,表示股市仍持續上漲。下跌的機率也略低於5成,並不會明顯走跌。由此可見,RSI 技術指標超買並不隱含接下來會有回調。
KD
KD指標(英文:Stochastic Oscillator),也稱為隨機指標,是一種動量指標,用於判斷金融產品的價格走勢勢頭以及超買超賣情況的技術工具,被廣泛地應用在預測金融產品的中短期的行情趨勢。
KD指標用於判斷金融產品在當前價格與一段時間內價格波動範圍的動量,從而提供判斷市場趨勢走向的方向。KD指標主要是兩條線組成,分別是K值(快線)和 D值(慢線)。
K值和D值是KD指標的主要組成部分,它們共同作用於市場分析,提供了超買和超賣的信號。當 D 值 > 80,為高檔超買訊號,代表多頭強勢,市場過熱,隨時可能回檔或下跌,但還要注意反轉,所以建議等出現死亡交叉後再賣出。當 D 值 < 20,為低檔超賣訊號,代表空頭強勢,市場過冷,隨時可能反彈或回升,但需考慮鈍化問題,所以建議等出現黃金交叉後再買進。
from finlab import login
from finlab.plot import plot_tw_stock_candles
from finlab.data import indicator
login("FINLAB_TOKEN")
k, d = indicator("STOCH", fastk_period=9, slowk_period=3, slowd_period=3)
technical_func = [{'K':k,'D':d}]
plot_tw_stock_candles(
stock_id="0050",
recent_days=120,
adjust_price=True,
technical_func=technical_func,
)
回測
回測條件:
- 近月上漲幅度 > 歷史月漲幅90分位數 # 股市近期大幅上漲
- 收盤價 < 3日平均收盤價 # 收盤價略為回檔,避免賣在指標頓化階段
- D > 80 # 指標超買
cond = pd.DataFrame(index=close.index, columns=close.columns)
for code in close.columns:
cond[code] = (
(rets_m[code] > quantile_return[code])
& (d[code] >= 80)
& (close[code] < ma3[code])
)
df = backtest(cond, close)
# plot
fig, ax = plt.subplots(nrows=2, ncols=1)
df.iloc[:, 2:].median().plot(title="累積報酬率(中位數)", ax=ax[0])
(df.iloc[:, 2:] < 0).mean().plot(title="下跌機率", ax=ax[1])
plt.subplots_adjust(hspace=0.5)
由上圖可以看到,市場近期大幅上漲後,KD進入超買階段,但接下來10個交易日累積的報酬率幾乎都大於零,表示股市仍持續上漲。下跌的機率也略低於5成,上漲的機率反而高一些。由此可見,KD 指標超買並不隱含接下來會有回調。
乖離率
乖離率分析(BIAS Ratio / Deviation rate)也被稱爲偏離率分析或者BIAS指標, 是一種輔助型技術指標。主要被用於測量市場的波動率,找出市場價與平均價之間的差距與偏移。當偏移率越高時,回調的幾率也越高。
from finlab import login
from finlab.plot import plot_tw_stock_candles
from finlab.data import indicator
bias = close / close.average(20) - 1
technical_func = [{'bias':bias}]
plot_tw_stock_candles(
stock_id="0050",
recent_days=120,
adjust_price=True,
technical_func=technical_func,
)
回測
回測條件:
- 近月上漲幅度 > 歷史月漲幅90分位數 # 股市近期大幅上漲
- 收盤價 < 3日平均收盤價 # 收盤價略為回檔,避免賣在指標頓化階段
- 乖離率 > 歷史乖離率90分位數 # 指標超買
quantile_bias = bias.rolling(window=bias.shape[0], min_periods=0).quantile(0.95)
cond = pd.DataFrame(index=close.index, columns=close.columns)
for code in close.columns:
cond[code] = (
(rets_m[code] > quantile_return[code])
& (bias[code] >= quantile_bias[code])
& (close[code] < ma3[code])
)
df = backtest(cond, close)
# plot
fig, ax = plt.subplots(nrows=2, ncols=1)
df.iloc[:, 2:].median().plot(title="累積報酬率(中位數)", ax=ax[0])
(df.iloc[:, 2:] < 0).mean().plot(title="下跌機率", ax=ax[1])
plt.subplots_adjust(hspace=0.5)
由上圖可以看到,市場近期大幅上漲後,bias進入超買階段,但接下來10個交易日累積的報酬率幾乎都大於零,表示股市仍持續上漲。下跌的機率也略低於5成,上漲的機率反而高一些。由此可見,bias 指標超買並不隱含接下來會有回調。
RSI + KD + BIAS
前面觀察到,個別指標達到超買階段時,並沒有隱含未來會下跌回調。若我們將三種指標結合,當三者皆達超買階段,是否也是同樣的現象呢?
回測條件:
- 近月上漲幅度 > 歷史月漲幅90分位數 # 股市近期大幅上漲
- 收盤價 < 3日平均收盤價 # 收盤價略為回檔,避免賣在指標頓化階段
- RSI > 80
- D > 80
- 乖離率 > 歷史乖離率90分位數
由圖可見,就算我們將三種指標結合,均達超買階段,也不意味著短期未來會下跌回調。
結論
- 個別技術指標達超買階段,並不表示股市接下來會下跌回調。
- 若將RSI、KD、乖離率三指標結合,均達超買階段時,也不表示股市接下來會下跌回調。
總結來說,若已在車上的投資朋友們,別輕易賣出股票,短線過熱只是因為短期漲多的現象,股市會不會再持續上漲,還是得回歸基本面,若公司未來基本面持續增長,股價自然會持續上升。
用程式自動下單
FinLab 提供永豐金 Python API,下單非常簡單,只要短短幾行,程式就會幫你計算現在應該有的部位,並且進行「買賣」只需要在適當的時間(例如開盤、收盤)執行,程式就會自動下單買進賣出,將你的帳戶部位調整成獲利的形狀!再也不用自己計算每檔股票要買幾張了!非常的方便喔!
import os
from finlab.online.sinopac_account import SinopacAccount
from finlab.online.order_executor import OrderExecutor, Position
# 設定帳號金鑰
os.environ['SHIOAJI_API_KEY'] = '永豐證券API_KEY'
os.environ['SHIOAJI_SECRET_KEY'] = '永豐證券SECRET_KEY'
os.environ['SHIOAJI_CERT_PERSON_ID']= '身份證字號'
os.environ['SHIOAJI_CERT_PATH']= '永豐證券憑證路徑'
os.environ['SHIOAJI_CERT_PASSWORD'] = '永豐證券憑證密碼' # 預設與身份證字號
# 以 100 萬台幣計算當前帳戶應該有的股票
fund = 1000000
target_position = Position.from_report(report, fund)
# 進行下單
acc = SinopacAccount()
order_executor = OrderExecutor(target_position, acc)
order_executor.create_orders()
程式預設使用當前價格進行「限價單」但你也可以透過客製化的方式,調整成「漲跌停」、「零股」、「融資券」,非常的簡單方便,讓你在股市中複製好策略的績效!