Analisis Teknikal menggunakan TA-Lib – Technical Analysis Library

By | August 31, 2022
811 Views

Analisis Teknikal – Salah satu analisis harga saham/stok yang sering digunakan yaitu analisis teknikal berdasarkan sifat data time series yang berulang. Analisis teknikal biasanya melibatkan analisis grafik yang canggih. Saat ini banyak sekali tersedia secara default oleh para broker berbasis aplikasi web ataupun mobile application.

Analisis teknikal bisa kok kita buat sendiri, asalkan kita punya data yang lengkap transaksi saham harian. Kalian bisa kok download data transaksi harian saham di https://github.com/mulkan/data-stock/tree/main/dataset

Berbicara mengenai analisis teknikal, saya biasanya menggunakan broker stockbit/tradingview. Bila kalian mau otak-atik sendiri tentu mengolah data yang cukup untuk analisis teknikal tidak praktis menggunakan excel. Solusinya yaitu bisa menggunakan R/RStudio dengan package quantmod.

Analisis teknikal ada banyak jenisnya yaitu

Jenis Analisis Teknikal

Volume

  • Money Flow Index (MFI)
  • Accumulation/Distribution Index (ADI)
  • On-Balance Volume (OBV)
  • Chaikin Money Flow (CMF)
  • Force Index (FI)
  • Ease of Movement (EoM, EMV)
  • Volume-price Trend (VPT)
  • Negative Volume Index (NVI)
  • Volume Weighted Average Price (VWAP)

Volatility

  • Average True Range (ATR)
  • Bollinger Bands (BB)
  • Keltner Channel (KC)
  • Donchian Channel (DC)
  • Ulcer Index (UI)

Trend

  • Simple Moving Average (SMA)
  • Exponential Moving Average (EMA)
  • Weighted Moving Average (WMA)
  • Moving Average Convergence Divergence (MACD)
  • Average Directional Movement Index (ADX)
  • Vortex Indicator (VI)
  • Trix (TRIX)
  • Mass Index (MI)
  • Commodity Channel Index (CCI)
  • Detrended Price Oscillator (DPO)
  • KST Oscillator (KST)
  • Ichimoku Kinkō Hyō (Ichimoku)
  • Parabolic Stop And Reverse (Parabolic SAR)
  • Schaff Trend Cycle (STC)

Momentum

  • Relative Strength Index (RSI)
  • Stochastic RSI (SRSI)
  • True strength index (TSI)
  • Ultimate Oscillator (UO)
  • Stochastic Oscillator (SR)
  • Williams %R (WR)
  • Awesome Oscillator (AO)
  • Kaufman’s Adaptive Moving Average (KAMA)
  • Rate of Change (ROC)
  • Percentage Price Oscillator (PPO)
  • Percentage Volume Oscillator (PVO)
See also  Perhitungan Analisis Teknikal MACD

Others

  • Daily Return (DR)
  • Daily Log Return (DLR)
  • Cumulative Return (CR)

Library Analisis Teknikal

Nah pada pembahasan kali ini, saya akan lebih fokus menggunakan Python saja daripada R/RStudio sebagai alternatif saja. Terlebih dahulu kalian bisa merge file CSV Merge File CSV di Pandas menggunakan dataset https://github.com/mulkan/data-stock/tree/main/dataset

Library yang sudah saya pernah coba-coba seperti

  1. tradingview-ta https://pypi.org/project/tradingview-ta/
  2. https://github.com/bukosabino/ta
  3. https://github.com/twopirllc/pandas-ta
  4. https://github.com/peerchemist/finta
  5. https://github.com/mrjbq7/ta-lib

Ternyata lebih menarik dan lengkap point 3 karena merupakan wrapper dari TA-Lib : Technical Analysis Library yang banyak digunakan developer dan tersedia banyak untuk bahasa lainnya walaupun ditulis di C/C++. Menggunakan library SWIG untuk mengkoneksikan bahasa yang ditulis di C/C++ ke bahasa tingkat tinggi lain seperti java, perl, php, python, C#, go lang.

Install TA-Lib juga lumayan ribet, setelah saya download versi binary ta-lib-0.4.0-msvc.zip dan di extract di C:\ta-lib dan setting path nya agar dikenali oleh sistem windows  kemudian install via pip yang bisa kalian gunakan 2 cara yaitu

  • via pip installer : python3 -m pip install TA-Lib
  • ataupun download source code nya via git clone dan melakukan run file setup.py python setup.py install

hasilnya banyak error (ta-lib-0.4.0-msvc.zip ternyata versi 32 bit, cukup ribet kalau harus compile ke versi 64 bit menggunakan visual studio)

build\lib.win-amd64-3.8\talib\_ta_lib.pyd : fatal error LNK1120: 339 unresolved externals
error: command ‘C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\bin\\HostX86\\x64\\link.exe’ failed with exit code 1120

Ternyata yang paling gampang pakai whl saja yang bisa kalian download di https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib pilih sesuai versi, seperti Python 3.8 (64 bit) bisa menggunakan TA_Lib-0.4.24-cp38-cp38-win_amd64.whl. Setelah di download install via pip pip install TA_Lib-0.4.24-cp38-cp38-win_amd64.whl Ternyata bisa.

>>> import talib
>>> import numpy
>>> c =  numpy.random.randn(100)
>>> k,d = talib.STOCHRSI(c)

Kalau bagi pengguna macbook M1 bisa menggunakan kode berikut untuk install

conda install -c conda-forge ta-lib

 

See also  Analisis Teknikal Bollinger Band

Analisis Teknikal

Sekarang kita coba yuk, dengan loading dataset terlebih dahulu (akan lebih baik kalian menggunakan jupyter notebook ya) karena grafiknya pakai plotly berbasis web app.

import pandas as pd
import glob
import os

joined_files = os.path.join("G:\\dataset", "*.csv")
joined_list = glob.glob(joined_files)
df = pd.concat(map(pd.read_csv, joined_list), ignore_index=True)

Jangan lupa untuk mengubah date format nya agar sesuai standar pandas

df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')

Kita bisa melihat ada sekali data yang kita pakai karena bersifat harian, kita harus melakukan teknik aggregasi. Bila pernah menggunakan R/RStudio urusan untuk pivot/aggregasi sangatlah dimudahkan dengan adanya package dplyr.

Tapi tenang saja, di Python bisa kok menggunakan pandas

R PYTHON
mutate assign
select filter
arrange sort_values
group_by groupby
summarise agg
filter query
rename rename
eval

Pilih emiten dan tahun yang digunakan, misalkan akan pilih emiten ACES dimulai dari tanggal 01 januari 2022 sampai saat ini.

stock_emiten = df.query("StockCode=='ACES' & Date>='2022-01-01'")
stock_emiten.sort_values(by='Date',ascending=True,inplace = True) #memastikan date nya urut

Kita akan plot Close dan RSI nya

from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(rows=2, cols=1, shared_xaxes=True)

fig.add_trace(
    go.Line(x=stock_emiten["Date"], y=stock_emiten["Close"]),
    row=1, col=1
)

fig.add_trace(
    go.Line(x=stock_emiten["Date"], y= stock_emiten["RSI"]),
    row=2, col=1
)

fig.update_layout(height=600, width=800, title_text="Saham Emiten ACES")
fig.show()

GroupBy

Untuk mempercepat perhitungan RSI pada semua emiten, kita bisa menggunakan GroupBy

def addRSI(grp):
    grp["RSI"] = talib.RSI(grp["Close"],9)
    return grp



df.sort_values(by='Date',ascending=True,inplace =  True)

stock = df.groupby('StockCode').apply(addRSI)


emiten = "'TOWR'"
stock_emiten = stock.query("StockCode=="+emiten+" & Date>='2022-01-01'")

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import warnings
warnings.filterwarnings('ignore')

fig = make_subplots(rows=2, cols=1, shared_xaxes=True)

fig.add_trace(
    go.Line(x=stock_emiten["Date"], y=stock_emiten["Close"]),
    row=1, col=1
)

fig.add_trace(
    go.Line(x=stock_emiten["Date"], y= stock_emiten["RSI"]),
    row=2, col=1
)

fig.update_layout(height=600, width=1000, title_text="Saham Emiten "+emiten)
fig.show()

Yuk kita lihat Analisis Teknikal diatas

Ternyata untuk emiten TOWR dengan RSI9 masih belum jenuh jual

Analisis Teknikal SMA

Analisis teknikal yang lainya untuk deteksi kapan beli yaitu ketika SMA periode rendah memotong keatas SMA periode tinggi. Seperti biasa kita buat function terlebih dahulu sekalian operasi groupby

def addSMA(grp):
    grp["SMA30"] = talib.SMA(grp["Close"],30)
    grp["SMA90"] = talib.SMA(grp["Close"],90)
    return grp

stock2 = df.groupby('StockCode').apply(addSMA)

dilanjut membuat grafik analisis teknikalnya

emiten = "'TOWR'"
stock_emiten2 = stock2.query("StockCode=="+emiten)

                             
fig = go.Figure()
fig.add_trace(go.Line(x=stock_emiten2["Date"], y=stock_emiten2["Close"],
                    mode='lines',
                    line=dict(color='black', width=1),
                    name='Close'))
fig.add_trace(go.Line(x=stock_emiten2["Date"], y=stock_emiten2["SMA30"],
                    mode='lines',
                    line=dict(color='green', width=1),
                    name='SMA30'))
fig.add_trace(go.Line(x=stock_emiten2["Date"], y=stock_emiten2["SMA90"],
                    mode='lines',
                    line=dict(color='red', width=1),
                    name='SMA90'))

fig.update_layout(height=600, width=1000, title_text="Saham Emiten "+emiten)
fig.show()

Yuk kita lihat hasilnya ternyata masih kondisi uptrend ditandai dengan SMA30 masih diatas SMA90

See also  Menguji Indikator Simple Moving Average

 

 

ref:

https://predictivehacks.com/dplyr-like-pipes-for-data-manipulation-in-python-using-pandas