top of page
Gambar penulisCornellius Yudha Wijaya

Deteksi Anomali Pasar Keuangan dengan Machine Learning

Diperbarui: 16 Jul 2024

Pasar Keuangan Gambar Depan

Pasar keuangan mengacu pada tempat perdagangan untuk aktivitas jual-beli sekuritas apa pun, termasuk saham, obligasi, valas, dan derivatif — Pada dasarnya, saat orang membeli dan menjual instrumen keuangan. Ini adalah tempat penting bagi ekonomi kapitalis karena pasar menyediakan likuiditas bagi perusahaan.


Pasar keuangan adalah aspek dari pertumbuhan dan stabilitas ekonomi, sehingga setiap pelaku pasar perlu mengenali anomali yang ada. Meskipun sulit untuk memprediksi masa depan pasar, setidaknya kita dapat mencoba belajar dari anomali dalam data historis pasar keuangan.


Dalam ilmu data (data science), anomali didefinisikan sebagai data yang menyimpang secara signifikan dari pola reguler. Dalam data keuangan, ada teori yang menyatakan bahwa anomali pasar merupakan peristiwa yang tidak konsisten dengan teori harga aset.

Namun, artikel ini tidak serta merta membahas anomali dari teori data keuangan; melainkan, kita akan mendeteksi anomali dari data itu sendiri. Interpretasinya bisa berbeda dari teori, jadi kita perlu mengeksplorasi lebih jauh dari data tersebut.


Lalu, bagaimana kita bisa mendeteksi anomali dalam data pasar keuangan? Mari kita bahas.




Pengumpulan Data Pasar Keuangan


Saya akan menggunakan Financial Modeling Prep yang gratis untuk mengakses berbagai data keuangan. Kita menggunakan Financial Modeling Prep terutama karena API-nya memiliki akses melimpah ke data pasar keuangan, meliputi informasi saham, dividen, berita, dll. Anda dapat melihat semua data yang tersedia dalam dokumentasi.


Financial Modeling Prep Pasar Keuangan

Untuk menggunakan Financial Modeling Prep, Anda hanya perlu mengetahui cara meminta data dari API dengan Python, yang akan saya tunjukkan pada bagian di bawah ini.


Untuk deteksi pasar data keuangan, kami menggunakan berbagai contoh untuk menunjukkan bahwa kami dapat mendeteksi anomali melalui berbagai jenis data.


Deteksi Anomali Bursa NASDAQ

Pada bagian ini, kita akan menelusuri harga saham dan informasi perusahaan dari saham mana pun yang terdaftar di bursa NASDAQ. Dari data ini, kami akan mencoba mendeteksi setiap anomali yang muncul.


Pertama, kita akan mengambil data dengan kode berikut.

import pandas as pd
import numpy as np
import requests

url = "https://financialmodelingprep.com/api/v3/symbol/NASDAQ"
headers = {
    'apikey': 'YOUR API KEY',
}

response = requests.get(url, params=headers) 
    
data = response.json()
data = pd.DataFrame(data)

Untuk API Key, Anda bisa mendapatkannya setelah mendaftar di situs. Mari kita lihat seperti apa datanya.


Contoh data Pasar Keuangan NASDAQ

Data akan terlihat seperti di atas tetapi mungkin memiliki informasi yang berbeda untuk tiap nilainya, tergantung pada waktu Anda mengambil data. Saat ini, terdapat sekitar 11552 saham terdaftar di NASDAQ.


Selanjutnya, kita akan menganalisis data untuk menemukan anomali. Seperti yang disebutkan sebelumnya, deteksi anomali adalah upaya menemukan titik data yang menyimpang secara signifikan dari sebagian besar pola data. Ada banyak algoritma yang dapat digunakan untuk deteksi anomali, tetapi dalam contoh ini kita akan menggunakan Isolation Forest.


Isolation Forest biasanya digunakan untuk isolasi data yang efisien dengan dataset berdimensi tinggi. Cara kerjanya cukup berbeda dari algoritma deteksi anomali lainnya. Sementara algoritma lain mencoba melihat pola data dan data mana yang menyimpang, Isolation Forest secara eksplisit mencoba mengisolasi anomali. Asumsinya adalah anomali lebih mudah diisolasi karena jumlahnya selalu lebih sedikit dari data normal.


Mari kita lihat kode di bawah ini untuk mendeteksi anomali dalam data keuangan. Pertama, kita harus memutuskan data apa yang akan digunakan untuk mendeteksi anomali. Dalam contoh kita, kita akan menggunakan fitur-fitur berikut untuk menggambarkan situasi keuangan saham perusahaan pada hari itu.


features = ['price', 'volume', 'dayLow', 'dayHigh', 'yearHigh', 'yearLow']
data = data[features]

Selanjutnya, saya akan menghapus data yang hilang dari dataset kita untuk mempermudah proses.

data = data.dropna()

Dengan data yang sudah siap, kita akan melatih model Isolation Forest dengan kode berikut.

from sklearn.ensemble import IsolationForest
model = IsolationForest(n_estimators=1000, contamination='auto') 
model.fit(data)

Dalam kode di atas, saya menggunakan 1000 pohon (trees) dengan parameter contamination diatur ke "Auto". Parameter contamination mengontrol jumlah dataset yang dianggap sebagai outlier (data pencilan). 


Mengatur nilainya ke "Auto" memungkinkan model menemukan ambang batas optimal secara otomatis dari data. Kita dapat mengatur parameter contamination ke angka desimal (float) hingga 1 untuk menentukan jumlah anomali yang diharapkan.


Kita akan menggunakan model yang telah dilatih sebelumnya untuk memprediksi data dan mendapatkan titik-titik anomali.


# Detect anomalies
data['anomaly'] = model.predict(data)

# The anomaly is labeled as -1

data[data['anomaly'] == -1]
Data anomali Pasar Keuangan

Hasilnya, sekitar 1000 saham dianggap sebagai anomali. Hasil Anda mungkin berbeda karena adanya proses randomisasi selama pembentukan pohon keputusan (tree), tetapi seharusnya masih dalam kisaran yang mirip.


Dari data anomali di atas, kita dapat menganalisis mengapa saham-saham tersebut dianggap tidak biasa. Volumenya mungkin terlalu besar, atau harganya mungkin terlalu rendah. Bagaimanapun, saham yang teridentifikasi anomali menunjukkan penyimpangan dari pola normal. Bagaimana informasi ini digunakan sepenuhnya terserah Anda.



Deteksi Anomali Harga Saham

Pada contoh sebelumnya, kita mencoba menentukan saham mana yang menjadi anomali dibandingkan dengan data saham lainnya. Untuk kasus ini, kita akan mencari anomali dalam data historis harga saham tertentu.


Untuk mendapatkan harga saham spesifik, kita akan menggunakan kode berikut. Dalam contoh ini, saya akan mengambil saham AAPL.


url = "https://financialmodelingprep.com/api/v3/historical-price-full/AAPL"
headers = {
    'apikey': 'YOUR API KEY',
}

response = requests.get(url, params=headers) 
    
aapl_stock = response.json()
aapl_stock = pd.DataFrame(aapl_stock['historical'])
Contoh data Pasar Keuangan Saham

Kita akan mendapatkan data historis harga saham selama lima tahun menggunakan API. Sekarang, mari kita cari tahu apakah ada anomali dalam data ini. Untuk fitur-fiturnya, kita akan mencoba menggunakan yang berikut ini:


features = ['open', 'high', 'low', 'close', 'adjClose', 'unadjustedVolume', 'change', 'changePercent']
data = aapl_stock[features]

data = data.dropna()

Untuk mendeteksi anomali, kita akan menggunakan Isolation Forest sekali lagi.

from sklearn.ensemble import IsolationForest
model = IsolationForest(n_estimators=1000, contamination='auto')
model.fit(data)

data['anomaly'] = model.predict(data)
data['date'] = aapl_stock['date']
data[data['anomaly'] == -1]
Contoh data Pasar Keuangan anomali

Dengan parameter contamination diatur ke "Auto", kita melihat sekitar 25% data ditandai sebagai anomali. Mari kita visualisasikan data tersebut untuk memahami anomali-anomali ini dengan lebih baik.


import matplotlib.pyplot as plt
data['date'] = pd.to_datetime(data['date'])

anomalies = data[data['anomaly'] == -1]

plt.figure(figsize=(14, 7))
plt.plot(data['date'], data['close'], label='Close Price', color='blue', marker='o', linestyle='-', markersize=4, alpha=0.6)
plt.scatter(anomalies['date'], anomalies['close'], color='red', label='Anomaly', s=100, edgecolor='black', zorder=5)

plt.title('AAPL Close Price with Anomalies')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()

plt.show()
Visualization Pasar Keuangan Anomali Saham

Dalam contoh ini, kita mencoba memvisualisasikan harga "Close" dan titik-titik anomali. Seperti yang Anda lihat, banyak anomali yang muncul—terutama pada tanggal yang lebih lama dan lebih baru. Ini bisa berarti bahwa algoritme menangkap anomali dari rentang yang terlalu jauh.


Mari kita kurangi jumlah anomali untuk mendapatkan informasi yang lebih mendalam (insightful). Untuk itu, kita akan mencoba mengurangi parameter contamination menjadi 2%.

model = IsolationForest(n_estimators=1000, contamination=0.02)
model.fit(data)
data['anomaly'] = model.predict(data)

Dengan perubahan tersebut, mari kita visualisasikan kembali data anomali.

Visualization Pasar Keuangan Anomali Saham Pembetulan

Dari gambar di atas, kita bisa lebih jelas menentukan di mana anomali sering terjadi. Ada juga beberapa anomali tunggal, dan Anda dapat mencoba menganalisis peristiwa apa yang mungkin menyebabkannya.



Deteksi Anomali Berita Keuangan

Berbicara tentang berita, kita juga dapat mendeteksi berita mana yang dianggap anomali. Menemukan berita yang berbeda dari biasanya dapat membantu kita menentukan berita mana yang harus menjadi fokus perhatian.


Untuk contoh ini, kita akan menggunakan kumpulan berita saham. Dengan Financial Modeling Prep, kita bisa mendapatkan berita terbaru menggunakan kode berikut.

import requests
url = "https://financialmodelingprep.com/api/v3/stock_news"
headers = {
    'page':0,
    'apikey': 'YOUR API KEY',
}

response = requests.get(url, params=headers) 
    
stock_news = response.json()
stock_news = pd.DataFrame(stock_news)
Data News Pasar Keuangan

Karena data berita merupakan data bahasa alami (natural language data), kita perlu mengubahnya menjadi nilai numerik. Selain itu, kita akan menambahkan informasi sentimen untuk memperkaya data. Dalam hal ini, saya akan menggunakan HuggingFace Transformers untuk mendapatkan data sentimen.


from transformers import pipeline

sentiment_pipeline = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")

def get_sentiment_score(text):
    result = sentiment_pipeline(text)[0]
    return result['score'] if result['label'] == 'POSITIVE' else -result['score']

stock_news['sentiment_score'] = stock_news['text'].apply(get_sentiment_score)

Setelah analisis sentimen, kita akan mengubah data menjadi nilai numerik. Untuk kasus ini, kita dapat menggunakan metode TF-IDF untuk kolom teks.

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=100)  
tfidf_matrix = vectorizer.fit_transform(stock_news['text'])

tfidf_df = pd.DataFrame(tfidf_matrix.toarray(), columns=vectorizer.get_feature_names_out())

combined_features = pd.concat([tfidf_df, stock_news['sentiment_score']], axis=1)

Dengan fitur-fitur untuk mendeteksi anomali sudah siap, sekarang kita proses data untuk langkah selanjutnya.

model = IsolationForest(n_estimators=100, contamination=0.01)
model.fit(combined_features)
stock_news['anomaly'] = model.predict(combined_features)

anomalies = stock_news[stock_news['anomaly'] == -1]
anomalies

Selanjutnya, kita akan mendapatkan berita-berita anomali dengan kode berikut.


Data News Pasar Keuangan Anomali

Data ini memungkinkan Anda untuk menganalisis berita mana yang tidak biasa (uncommon) selama periode waktu tersebut. Anda dapat mencoba jenis berita lain atau metodologi berbeda untuk mengubah teks menjadi nilai numerik, misalnya dengan menggunakan embedding.


Kesimpulan


Deteksi anomali adalah proses menemukan titik data yang berbeda dari pola mayoritas dalam suatu dataset. Ini adalah aktivitas penting, terutama di pasar keuangan di mana anomali dapat menyebabkan perbedaan antara hasil yang menguntungkan atau tidak.


Dalam artikel ini, kita telah belajar cara menemukan anomali dalam data pasar keuangan menggunakan Financial Modeling Prep dan Isolation Forest. Kita mempelajari deteksi anomali pada tiga jenis data, yaitu:

  • Data Perusahaan Terdaftar di NASDAQ

  • Data Historis Saham

  • Data Berita Keuangan


Semoga ini membantu!



105 tampilan0 komentar

Postingan Terkait

Lihat Semua

Comments


bottom of page