Python
Finance

TA-Libでテクニカル分析

TA-Libでテクニカル分析

簡単にテクニカル分析ができるライブラリTA-Libを試しました.TA-LibにはPythonのラッパーがあり,かなり簡単にですが紹介します.

準備

はじめに,TA-Libをインストールする必要があります.Macの場合はHomebrewでインストールできます.

$ brew install ta-lib

Pythonで使えるようにします.

$ pip install TA-Lib

テクニカル分析

今回使用するライブラリをインポートします.

import numpy as np
import pandas as pd
import talib
import quandl

今回はquandlでデータを取得します.

df = quandl.get('NIKKEI/INDEX')  # quandlの場合

TA-LibはDataFrameを引数にできないので,numpyのndarray形式にします.

close = np.array(df['Close Price'])
close[:5]

とにかく,いろいろなテクニカル指標を試してみます.(今回は終値のみで,ローソク足を用いる指標は使っていません.)

output = close.copy()
cols = ['Original']
# 単純移動平均(SMA: Simple Moving Average)
output = np.c_[output, talib.SMA(close)]
cols += ['SMA']
# 加重移動平均(WMA: Weighted Moving Average)
output = np.c_[output, talib.WMA(close)]
cols += ['WMA']
# 指数移動平均(EMA: Exponential Moving Average)
output = np.c_[output, talib.EMA(close)]
cols += ['EMA']
# 2重指数移動平均(DEMA: Double Exponential Moving Average)
output = np.c_[output, talib.DEMA(close)]
cols += ['DEMA']
# 3重指数移動平均(TEMA: Triple Exponential Moving Average)
output = np.c_[output, talib.T3(close)]
cols += ['TEMA']
# 三角移動平均(TMA: Triangular Moving Average)
output = np.c_[output, talib.TRIMA(close)]
cols += ['TMA']
# Kaufmanの適応型移動平均(KAMA: Kaufman Adaptive Moving Average)
output = np.c_[output, talib.KAMA(close)]
cols += ['KAMA']
# MESAの適応型移動平均(MAMA: MESA Adaptive Moving Average)
for arr in talib.MAMA(close):
    output = np.c_[output, arr]
cols += ['MAMA', 'FAMA']
# トレンドライン(Hilbert Transform - Instantaneous Trendline)
output = np.c_[output, talib.HT_TRENDLINE(close)]
cols += ['HT_TRENDLINE']
# ボリンジャー・バンド(Bollinger Bands)
for arr in talib.BBANDS(close):
    output = np.c_[output, arr]
cols += ['BBANDS_upperband', 'BBANDS_middleband', 'BBANDS_lowerband']
# MidPoint over period
output = np.c_[output, talib.MIDPOINT(close)]
cols += ['MIDPOINT']

# 変化率(ROC: Rate of change Percentage)
output = np.c_[output, talib.ROCP(close)]
cols += ['ROC']
# モメンタム(Momentum)
output = np.c_[output, talib.MOM(close)]
cols += ['MOM']
# RSI: Relative Strength Index
output = np.c_[output, talib.RSI(close)]
cols += ['RSI']
# MACD: Moving Average Convergence/Divergence
for arr in talib.MACD(close):
    output = np.c_[output, arr]
cols += ['MACD', 'MACD_signal', 'MACD_hist']
# APO: Absolute Price Oscillator
output = np.c_[output, talib.APO(close)]
cols += ['APO']
# PPO: Percentage Price Oscillator
output = np.c_[output, talib.PPO(close)]
cols += ['PPO']
# CMO: Chande Momentum Oscillator
output = np.c_[output, talib.CMO(close)]
cols += ['CMO']

# ヒルベルト変換 - Dominant Cycle Period
output = np.c_[output, talib.HT_DCPERIOD(close)]
cols += ['HT_DCPERIOD']
# ヒルベルト変換 - Dominant Cycle Phase
output = np.c_[output, talib.HT_DCPHASE(close)]
cols += ['HT_DCPHASE']
# ヒルベルト変換 - Phasor Components
for arr in talib.HT_PHASOR(close):
    output = np.c_[output, arr]
cols += ['HT_PHASOR_inphase', 'HT_PHASOR_quadrature']
# ヒルベルト変換 - SineWave
for arr in talib.HT_SINE(close):
    output = np.c_[output, arr]
cols += ['HT_SINE_sine', 'HT_SINE_leadsine']    
# ヒルベルト変換 - Trend vs Cycle Mode
output = np.c_[output, talib.HT_TRENDMODE(close)]
cols += ['HT_TRENDMODE']
output.shape

# 60日単純移動平均
output = np.c_[output, talib.SMA(close, timeperiod=60)]
cols += ['SMA60']
# 15日ボリンジャー・バンド
for arr in talib.BBANDS(close, timeperiod=15, nbdevup=2, nbdevdn=2, matype=0):
    output = np.c_[output, arr]
cols += ['BBANDS15_upperband', 'BBANDS15_middleband', 'BBANDS15_lowerband']
# 21日RSI
output = np.c_[output, talib.RSI(close, timeperiod=21)]
cols += ['RSI21']

引数のtimeperiodを指定して,いろんな期間を計算できます.

DataFrame形式にして,日付と対応させます.

data = pd.DataFrame(output, index=df.index, columns=cols)
data.tail()
Original SMA WMA EMA DEMA TEMA TMA KAMA MAMA FAMA ... HT_PHASOR_inphase HT_PHASOR_quadrature HT_SINE_sine HT_SINE_leadsine HT_TRENDMODE SMA60 BBANDS15_upperband BBANDS15_middleband BBANDS15_lowerband RSI21
Date
2018-01-26 23631.88 23336.888333 23577.879333 23396.084808 23950.015680 23881.542216 23358.915125 23401.776887 23774.262642 23579.472022 ... 21.325892 -43.817842 -0.589713 -0.988059 1.0 22920.246667 24056.610766 23800.404000 23544.197234 58.287358
2018-01-29 23629.34 23362.327333 23596.747183 23411.133530 23943.404763 23819.197807 23416.499625 23410.021533 23701.801321 23610.054347 ... 9.146663 81.389471 -0.713710 -0.999956 1.0 22947.261500 24061.838563 23794.724667 23527.610770 58.232275
2018-01-30 23291.97 23380.124000 23592.208000 23403.445560 23894.184742 23717.474237 23468.224208 23407.458663 23681.309755 23611.835732 ... 139.081959 117.191239 -0.837169 -0.978716 1.0 22968.599833 24121.395394 23757.523333 23393.651273 51.451184
2018-01-31 23098.29 23393.585333 23574.025161 23383.758105 23824.419397 23575.717839 23512.524500 23402.617512 23652.158767 23612.843808 ... 165.813706 -406.110394 -0.942737 -0.902462 0.0 22986.711167 24200.998868 23711.529333 23222.059798 48.076476
2018-02-01 23486.11 23424.681667 23579.994495 23390.361453 23808.770310 23470.100518 23551.332833 23405.839309 23569.134384 23601.916452 ... -122.751421 -700.414139 -0.978461 -0.837845 0.0 23004.478333 24198.805592 23696.574667 23194.343742 54.369135

5 rows × 36 columns

とりあえず,CSVに書き出します.

data.to_csv('NIKKEI_ta.csv')

TA-Libは予測モデルの特徴量の作成にも便利です.