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
Contents
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)
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
- tradingview-ta https://pypi.org/project/tradingview-ta/
- https://github.com/bukosabino/ta
- https://github.com/twopirllc/pandas-ta
- https://github.com/peerchemist/finta
- 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
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
ref:
https://predictivehacks.com/dplyr-like-pipes-for-data-manipulation-in-python-using-pandas