跳轉到

指標

支援 TA-Lib 與 pandas_ta 上百種技術指標,一行即可計算數千檔、長年期資料,可用於個股分析與機器學習。

安裝 TA-Lib

  • 本地端:參考 官方安裝教學,支援 Windows、MacOS、Linux。
  • Google Colab:
    !pip install ta-lib
    

更多參數與函式請參考 TA-Lib 官方文件

計算所有股票的 RSI 數值

使用 data.indicator() 計算 RSI(timeperiod=14):

from finlab import data
data.indicator('RSI', timeperiod=14)

前 14 天因資料不足可能為 NaN

兩個時間序列的技術指標(KD值)

使用 data.indicator('STOCH') 計算 KD 值,會回傳兩個 DataFrame(K、D)。

from finlab import data
k, d = data.indicator('STOCH')
k

利用 KD 值來選股

列出最近一日 K > D 的股票:

(k > d).iloc[-1]
0015    False
0050     True
0051    False
0052     True
0053     True
        ...
9951     True
9955    False
9958    False
9960     True
9962     True
Name: 2021-07-13 00:00:00, Length: 2269, dtype: bool

計算 Pandas_ta 技術指標

pandas_ta 亦可計算多種技術指標;安裝與指標列表請見官方文件

pip install pandas-ta
透過 data.indicator() 使用,例如 supertrend:

from finlab import data

values = data.indicator('supertrend')
若 TA-Lib 無對應函式,將改用 pandas_ta(可能較慢)。

自製指標(Pandas 運算)

不依賴 TA-Lib,直接用 Pandas 運算建立自訂指標:

價量指標

from finlab import data

close = data.get('price:收盤價')
volume = data.get('price:成交股數')
rev = data.get('monthly_revenue:當月營收')

# 動能指標:N 日報酬率
momentum_20 = close / close.shift(20) - 1

# 均線乖離率
ma60 = close.average(60)
bias = (close - ma60) / ma60

# 量價背離:股價創高但成交量萎縮
price_high = close == close.rolling(60).max()
volume_low = volume < volume.average(20)
divergence = price_high & volume_low

# 月營收成長率
rev_yoy = rev / rev.shift(12) - 1       # 年增率
rev_mom = rev / rev.shift(1) - 1        # 月增率
rev_3m = rev.average(3) / rev.average(12) - 1  # 3 月均值 vs 12 月均值

搭配 .cs 做因子標準化

pe = data.get('price_earning_ratio:本益比')
roe = data.get('fundamental_features:股東權益報酬率')

# 多因子合成:先標準化再等權加總
score = roe.cs.zscore() + (-pe).cs.zscore()  # ROE 越高越好,PE 越低越好

# 選出綜合評分前 10%
position = score.cs.rank() > 0.9

搭配 .sector 做產業中性化

# 問題:直接用 ROE 選股會偏重高 ROE 產業(如半導體)
# 解法:產業內標準化,選出「在各自產業中表現突出」的股票

roe_neutral = roe.sector.zscore()       # 產業中性化
rev_neutral = rev_yoy.sector.zscore()   # 營收成長也做中性化

# 合成因子
score = roe_neutral + rev_neutral
position = score.cs.rank() > 0.8

# 也可以直接用產業內排名
position = roe.sector.rank() > 0.7      # 各產業 ROE 前 30%

搭配 .weight 建構權重

from finlab.backtest import sim

position = score.cs.rank() > 0.8

# 精細權重:反波動率 + 產業上限 + 換手率限制
weights = (
    position
    .weight.inverse_volatility(window=60)
    .weight.cap_industry(max_weight=0.3)
    .weight.limit_turnover(max_turnover=0.3)
)

report = sim(weights, resample='Q')

完整 accessor 文件

.cs.sector.weight 的所有方法詳見 finlab.dataframe 參考文件