Anda di halaman 1dari 13

1

MODUL PERKULIAHAN

W542100001 –
Analisis Data
Analisis Data berbasis waktu
dengan statsmodels

Abstrak Sub-CPMK

Mengamati tren linier, Sub-CPMK 5.1.


logaritmik, distribusi data, Mampu melakukan analisa data yang
dekomposisi dan prediksi berubah terhadap waktu dengan
Pustaka Statsmodel.

Dalam modul ini kita akan memeriksa beberapa teknik umum yang digunakan
dalam analisis deret waktu dengan menerapkannya pada kumpulan data yang berisi nilai
penutupan harian untuk indeks pasar saham S&P 500 dari tahun 1950 hingga saat ini.
Tujuannya adalah untuk mengeksplorasi beberapa ide dan konsep dasar dari analisis
deret waktu, dan mengamati efeknya ketika diterapkan pada kumpulan data dunia nyata.
Meskipun tidak mungkin untuk benar-benar memprediksi perubahan dalam indeks
menggunakan teknik ini, ide-ide yang disajikan di sini secara teoritis dapat digunakan
sebagai bagian dari strategi yang lebih besar yang melibatkan banyak variabel tambahan
untuk melakukan upaya regresi atau pembelajaran mesin.
Analisis deret waktu adalah cabang statistik yang melibatkan penalaran tentang
urutan berurutan dari nilai-nilai terkait untuk mengekstrak statistik yang bermakna dan
karakteristik data lainnya. Ini digunakan dalam berbagai disiplin ilmu termasuk
ekonometrika, pemrosesan sinyal, prakiraan cuaca, dan pada dasarnya bidang lain yang
melibatkan data deret waktu. Teknik-teknik ini sering digunakan untuk mengembangkan
model yang dapat digunakan untuk mencoba meramalkan nilai masa depan dari suatu
deret, baik sendiri atau bersama dengan variabel lain.

13.1. Unduh Data


Untuk memulai, mari kita unduh datanya terlebih dahulu. Saya mendapatkan
kumpulan data historial dari Yahoo Finance , yang menyertakan tautan untuk
mengunduh semuanya sebagai file .csv. Sekarang kita dapat memuat kumpulan data dan
melihatnya. Saya akan menggunakan beberapa pustaka Python populer untuk analisis,
jadi semua kode ada di Python.
%matplotlib inline
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import seaborn as sb
sb.set_style('darkgrid')

path = os.getcwd() + '\data\stock_data.csv'


stock_data = pd.read_csv(path)
stock_data['Date'] =
stock_data['Date'].convert_objects(convert_dates='coerce')
stock_data = stock_data.sort_index(by='Date')
stock_data = stock_data.set_index('Date')

2021 Analisis Data


2 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
13.2. Tren linier dan variasi
Data dalam urutan kronologis terbalik jadi saya mengurutkannya berdasarkan
tanggal dan kemudian mengatur indeks bingkai data ke kolom tanggal. Jika Anda melihat
data ada beberapa bidang tetapi kami akan fokus pada harga penutupan saja. Mari kita
plot datanya dulu dan lihat seperti apa.
stock_data['Close'].plot(figsize=(16, 12))

Hal pertama yang jelas untuk diperhatikan, selain dari dua penurunan besar di ujung
ekor yang sesuai dengan kejatuhan pasar pada tahun 2002 dan 2008, adalah bahwa data
tersebut jelas tidak stasioner. Ini masuk akal untuk data pasar karena cenderung naik
dalam jangka panjang lebih banyak daripada turun. Ini adalah masalah untuk analisis
deret waktu meskipun karena data non-stasioner sulit untuk dijelaskan. Hal pertama yang
bisa kita coba adalah first difference dari seri tersebut. Dengan kata lain, kurangi nilai
sebelumnya t-1 dari nilai t saat ini untuk mendapatkan selisih d(t).
stock_data['First Difference'] = stock_data['Close'] -
stock_data['Close'].shift()
stock_data['First Difference'].plot(figsize=(16, 12))

2021 Analisis Data


3 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Data tampaknya tidak lagi menjadi tren dari waktu ke waktu dan malah berpusat di
sekitar 0. Namun ada masalah lain. Lihatlah variansnya. Ini sangat kecil sejak awal dan
terus meningkat seiring waktu. Ini adalah tanda bahwa data tidak hanya non-stasioner
tetapi juga meningkat secara eksponensial.

13.3. Tren logaritmik dan efeknya


Besarnya variasi hari ke hari pada hari ini benar-benar mengerdilkan besarnya
perubahan pada tahun 1950. Untuk mengatasinya, kita akan menerapkan transformasi
log ke deret aslinya.
stock_data['Natural Log'] = stock_data['Close'].apply(lambda x:
np.log(x))
stock_data['Natural Log'].plot(figsize=(16, 12))

Jadi itu memberi kita harga penutupan asli dengan transformasi log yang diterapkan
untuk "meratakan" data dari kurva eksponensial ke kurva linier. Salah satu cara untuk
melihat secara visual efek yang dimiliki transformasi log adalah dengan menganalisis
varians dari waktu ke waktu. Kita dapat menggunakan statistik varians bergulir dan
membandingkan seri asli dan seri yang dicatat.
stock_data['Original Variance'] = pd.rolling_var(stock_data['Close'], 30,
min_periods=None, freq=None, center=True)
stock_data['Log Variance'] = pd.rolling_var(stock_data['Natural Log'],
30, min_periods=None, freq=None, center=True)

fig, ax = plt.subplots(2, 1, figsize=(13, 12))


stock_data['Original Variance'].plot(ax=ax[0], title='Original Variance')
stock_data['Log Variance'].plot(ax=ax[1], title='Log Variance')
fig.tight_layout()

2021 Analisis Data


4 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Perhatikan bahwa di grafik atas, kita bahkan tidak dapat melihat variasi apa pun
hingga akhir tahun 80-an. Namun di grafik bawah ceritanya berbeda, perubahan nilai
terlihat jelas di seluruh kumpulan data. Dari pandangan ini, jelas bahwa transformasi kami
telah membuat varians relatif konstan.
Sekarang kita dapat melihat variasi sebelumnya dalam kumpulan data sedikit lebih baik
dari sebelumnya. Kita masih perlu mengambil perbedaan pertama, jadi mari kita hitung
dari seri yang dicatat.
stock_data['Logged First Difference'] = stock_data['Natural Log'] -
stock_data['Natural Log'].shift()
stock_data['Logged First Difference'].plot(figsize=(16, 12))

2021 Analisis Data


5 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Jauh lebih baik! Kami sekarang memiliki model deret waktu stasioner dari
perubahan harian pada indeks S&P 500. Sekarang mari kita buat beberapa variabel lag
y(t-1), y(t-2) dll. dan periksa hubungannya dengan y(t). Kita akan melihat kelambatan 1
dan 2 hari bersama dengan kelambatan mingguan dan bulanan untuk mencari efek
"musiman".
stock_data['Lag 1'] = stock_data['Logged First Difference'].shift()
stock_data['Lag 2'] = stock_data['Logged First Difference'].shift(2)
stock_data['Lag 5'] = stock_data['Logged First Difference'].shift(5)
stock_data['Lag 30'] = stock_data['Logged First Difference'].shift(30)

13.4. Mengamati distribusi


Salah satu cara visual yang menarik untuk mengevaluasi hubungan antara variabel
tertinggal adalah dengan melakukan sebar plot variabel asli vs variabel tertinggal dan
melihat di mana distribusi terletak. Kita bisa melakukan ini dengan plot bersama
menggunakan paket seaborn.
sb.jointplot('Logged First Difference', 'Lag 1', stock_data, kind='reg',
size=13)

2021 Analisis Data


6 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Perhatikan betapa padatnya massa di sekitar 0. Tampaknya juga terdistribusi cukup
merata - distribusi marjinal pada kedua sumbu kira-kira normal. Hal ini tampaknya
menunjukkan bahwa mengetahui nilai indeks suatu hari tidak memberi tahu kita banyak
tentang apa yang akan dilakukannya pada hari berikutnya.

13.5. Auto Correlation


Mungkin tidak mengherankan bahwa hanya ada sedikit korelasi antara perubahan
nilai dari satu hari ke hari berikutnya. Meskipun saya tidak memplotnya di sini, variabel
tertinggal lainnya yang kami buat di atas menunjukkan hasil yang serupa. Mungkin ada
hubungan dengan langkah lag lain yang belum kami coba, tetapi tidak praktis untuk
menguji setiap kemungkinan nilai lag secara manual. Untungnya ada kelas fungsi yang
secara sistematis dapat melakukan ini untuk kita.
from statsmodels.tsa.stattools import acf
from statsmodels.tsa.stattools import pacf

2021 Analisis Data


7 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
lag_correlations = acf(stock_data['Logged First Difference'].iloc[1:])
lag_partial_correlations = pacf(stock_data['Logged First
Difference'].iloc[1:])
Fungsi auto-correlation menghitung korelasi antara variabel dan dirinya sendiri pada
setiap langkah lag hingga batas tertentu (dalam hal ini 40). Fungsi korelasi otomatis
parsial menghitung korelasi pada setiap langkah lag yang TIDAK dijelaskan oleh langkah
lag orde bawah sebelumnya. Kita dapat memplot hasilnya untuk melihat apakah ada
korelasi yang signifikan.
fig, ax = plt.subplots(figsize=(16,12))
ax.plot(lag_correlations, marker='o', linestyle='--')

Hasil autokorelasi dan autokorelasi parsial sangat dekat satu sama lain (saya hanya
memplot hasil autokorelasi di atas). Hal ini menunjukkan bahwa tidak ada korelasi yang
signifikan (> 0,2) antara nilai pada waktu t dan setiap saat sebelum t hingga 40 langkah di
belakang. Dengan kata lain, seri ini adalah jalan acak.

13.6. Dekomposisi
Teknik menarik lainnya yang bisa kita coba adalah dekomposisi. Ini adalah teknik
yang mencoba memecah deret waktu menjadi faktor tren, musiman, dan residual.
Statsmodels hadir dengan fungsi dekomposisi di luar kotak.
from statsmodels.tsa.seasonal import seasonal_decompose

decomposition = seasonal_decompose(stock_data['Natural Log'],


model='additive', freq=30)
fig = plt.figure()
fig = decomposition.plot()

2021 Analisis Data


8 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Karena kami tidak melihat siklus nyata dalam data, visualisasi tidak begitu efektif dalam
kasus ini. Untuk data di mana ini adalah pola musiman yang kuat meskipun itu bisa
sangat berguna. Contoh berikut, misalnya, adalah contoh dari dokumentasi statsmodels
yang menunjukkan data emisi CO2 dari waktu ke waktu.
co2_data = sm.datasets.co2.load_pandas().data
co2_data.co2.interpolate(inplace=True)
result = sm.tsa.seasonal_decompose(co2_data.co2)
fig = plt.figure()
fig = result.plot()

2021 Analisis Data


9 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Dekomposisi jauh lebih berguna dalam kasus ini. Ada tiga komponen yang jelas berbeda
pada deret waktu - garis tren, penyesuaian musiman, dan nilai sisa. Masing-masing akan
perlu dipertanggungjawabkan dan dimodelkan dengan tepat.
Kembali ke data stok kami, kami telah mengamati bahwa ini adalah perjalanan acak dan
bahwa variabel tertinggal kami tampaknya tidak memiliki banyak dampak, tetapi kami
masih dapat mencoba menyesuaikan beberapa model ARIMA dan melihat apa yang kami
dapatkan. Mari kita mulai dengan model rata-rata bergerak sederhana.
model = sm.tsa.ARIMA(stock_data['Natural Log'].iloc[1:], order=(1, 0, 0))
results = model.fit(disp=-1)
stock_data['Forecast'] = results.fittedvalues
stock_data[['Natural Log', 'Forecast']].plot(figsize=(16, 12))

2021 Analisis Data


10 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Jadi sekilas sepertinya model ini cukup baik. Tetapi meskipun tampaknya ramalannya
benar-benar dekat (garisnya hampir tidak dapat dibedakan), ingatlah bahwa kami
menggunakan seri un-differenced! Indeks hanya berfluktuasi dalam persentase kecil dari
hari ke hari relatif terhadap nilai absolut total.

13.7. Upaya memprediksi info yad


Yang benar-benar kita inginkan adalah memprediksi perbedaan pertama, atau
pergerakan sehari-hari. Kita dapat menjalankan kembali model menggunakan deret yang
berbeda, atau menambahkan istilah "I" ke model ARIMA (menghasilkan model (1, 1, 0))
yang seharusnya melakukan hal yang sama. Mari kita coba menggunakan seri yang
berbeda.
model = sm.tsa.ARIMA(stock_data['Logged First Difference'].iloc[1:],
order=(1, 0, 0))
results = model.fit(disp=-1)
stock_data['Forecast'] = results.fittedvalues
stock_data[['Logged First Difference', 'Forecast']].plot(figsize=(16,
12))

Agak sulit untuk mengatakannya, tetapi tampaknya perubahan yang kami perkirakan
umumnya jauh lebih kecil daripada perubahan yang sebenarnya. Mungkin ada baiknya
melihat lebih dekat pada subset data untuk melihat apa yang sebenarnya terjadi.

2021 Analisis Data


11 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
stock_data[['Logged First Difference',
'Forecast']].iloc[1200:1600, :].plot(figsize=(16, 12))

Jadi sekarang cukup jelas bahwa ramalan itu jauh. Kami memprediksi variasi kecil kecil
relatif terhadap apa yang sebenarnya terjadi sehari-hari. Sekali lagi, ini kurang diharapkan
dengan model rata-rata bergerak sederhana dari rangkaian waktu berjalan acak. Tidak
ada informasi yang cukup dari hari-hari sebelumnya untuk memperkirakan secara akurat
apa yang akan terjadi pada hari berikutnya.
Model rata-rata bergerak tampaknya tidak berjalan dengan baik. Bagaimana dengan
model pemulusan eksponensial? Pemulusan eksponensial menyebarkan dampak dari
nilai-nilai sebelumnya menggunakan pembobotan eksponensial, sehingga hal-hal yang
terjadi baru-baru ini lebih berdampak daripada hal-hal yang terjadi di masa lalu.
Mungkinkah bentuk rata-rata yang "lebih cerdas" ini akan lebih akurat?
model = sm.tsa.ARIMA(stock_data['Logged First Difference'].iloc[1:],
order=(0, 0, 1))
results = model.fit(disp=-1)
stock_data['Forecast'] = results.fittedvalues
stock_data[['Logged First Difference', 'Forecast']].plot(figsize=(16,
12))

2021 Analisis Data


12 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/
Anda mungkin bisa menebak jawabannya. jika memprediksi pasar saham semudah
ini, semua orang akan melakukannya! Seperti yang saya sebutkan di atas, inti dari
analisis ini bukan untuk mengklaim bahwa Anda dapat memprediksi pasar dengan teknik
ini, melainkan untuk menunjukkan jenis analisis yang mungkin digunakan saat memecah
data deret waktu. Analisis deret waktu adalah bidang yang sangat kaya dengan lebih
banyak analisis teknis daripada yang saya bahas di sini (sebagian besar masih saya
pelajari). Jika Anda tertarik untuk menyelam lebih dalam, saya merekomendasikan
catatan ini dari seorang profesor di Duke . Banyak hal yang saya pelajari tentang
bidang yang saya ambil dari membaca sumber daya online seperti ini. Akhirnya, kode
sumber asli dari posting ini di-host di GitHub di sini, bersama dengan berbagai buku
catatan lainnya. Jangan ragu untuk memeriksanya!

13.8. Daftar Pustaka


https://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/
https://www.statsmodels.org/dev/examples/index.html
https://github.com/justmarkham/DAT4/blob/master/notebooks/08_linear_regression.ipynb

2021 Analisis Data


13 Eko Ihsanto, Dr, Ir, M.Eng
Biro Bahan Ajar E-learning dan MKCU
http://pbael.mercubuana.ac.id/

Anda mungkin juga menyukai