Analisa Data Saham dengan yfinance dan Python
Sumber data saham gratis untuk algoritmik trading
Analisa Data Saham dengan yfinance dan Python
Sumber data saham gratis untuk algoritmik trading
Photo by Logan Voss on Unsplash
Yahoo Finance, adalah layanan dari Yahoo yang menyediakan data finansial, seperti saham dan crypto.
Awalnya Yahoo menyediakan API gratis, tapi sejak 2017 layanan API tersebut dihentikan. Saat ini Yahoo Finance hanya tersedia dalam bentuk web saja.
Pengambilan data historis masih bisa dilakukan, tapi dengan cara browsing download dan save. File yang di download dalam bentuk CSV.
Ran Arrousi, seorang developer open source, membuat library yfinance untuk bisa melakukan akses data-data yang tersedia di Yahoo Finance, secara gratis.
yfinance adalah proyek library python open source untuk mengambil data-data historis dari Yahoo Finance, yang mudah digunakan dan mempunyai granularitas data yang cukup baik. Data pasar bisa didapatkan dengan periode 1 menit, hingga 3 bulan.
yFinance sesuai untuk digunakan keperluan riset pribadi skala kecil atau untuk belajar trading algoritmik dan analisa finansial.
yfinance API
yfinance banyak dipakai dalam finansial kuantitatif, algoritmik trading, dan riset-riset finansial lain, karena selain gratis, data-data keuangan seperti harga saham, kripto, etf, index, fundamental perusahaan dapat dengan mudah diambil untuk kemudian diolah dengan librari Python.
Python menjadi bahasa pemrograman yang sangat populer untuk analisa finansial, dan yfinance dapat dengan mudah diintegrasikan library python seperti pandas, numpy, matplotlib, scikit-learn.
Penggunaan
Sama seperti library python lain, yfinance perlu di install menggunakan paket manager, setelah itu, modul library perlu di import untuk dipakai.
pip install yfinance
import yfinance as yf
Ticker
Ticker adalah kode pendek, atau simbol yang digunakan untuk identifikasi aset. yfinance menggunakan ticker untuk identifikasi aset yang akan diambil datanya.
Contoh ticker seperti TSLA AAPL MSFT, sedangkan untuk saham-saham IHSG, diakhiri oleh tanda .JK, seperti BBCA.JK, BMRI.JK, BBRI.JK.
data = yf.Ticker("BBCA.JK")
Untuk mengambil data beberapa saham sekaligus, digunakan Tickers.
data = yf.Ticker("BBCA.JK BMRI.JK BBRI.JK")
Data finansial
yfinance menyediakan class yang akan menampilkan data-data finansial umum. Penamaan class cukup jelas, dan mewakili fungsinya.
data = yf.Ticker("BBCA.JK")
#info emiten
data.info
# data dividends, splits
data.actions
# data dividen
data.dividends
# data finansial
data.financials
data.quarterly_financials
# data neraca
data.balance_sheet
data.quarterly_balance_sheet
Berita
Yahoo Finance menyediakan berita-berita terkait emiten saham. Walaupun mungkin untuk saham-saham Indonesia, berita ini sangat terbatas, tapi mungkin bisa dimanfaatkan.
data=yf.Ticker("BMRI.JK")
news=data.news
for item in news:
title = item.get('content')['title']
print(title)
Ini hanya akan menampilkan judul berita saja, nantinya bisa langsung dicari di Yahoo Finance.
Target
Yahoo Finance menyediakan informasi target harga dan rekomendasi dari analis untuk saham tertentu.
import yfinance as yf
data=yf.Ticker("BBCA.JK")
target = data.analyst_price_targets
high_target = target['high']
low_target = target['low']
mean_target = target['mean']
print("High target: ", high_target)
print("Mean target: ", mean_target)
print("Low target: ", low_target)
Untuk rekomendasi analis :
ratings = data.recommendations
strong_buy = ratings['strongBuy'].iloc[0]
buy = ratings['buy'].iloc[0]
hold = ratings['hold'].iloc[0]
sell = ratings['sell'].iloc[0]
strong_sell = ratings['strongSell'].iloc[0]
print("Strong Buy :", strong_buy)
print("Buy: ", buy)
print("Hold: ", hold)
print("Sell: ", sell)
yfinance dapat dengan mudah diintegrasikan dengan library yang lain. Misalkan, rekomendasi analis akan di visualisasikan dalam bentuk stacked bar chart.
import matplotlib.pyplot as plt
data=yf.Ticker("BBCA.JK")
ratings = data.recommendations
period = ratings.iloc[0][['strongBuy', 'buy', 'hold', 'sell', 'strongSell']]
labels = period.index
values = period.values.astype(int)
colors = ['skyblue', 'lightgreen', 'orange', 'salmon', 'darkred']
plt.figure(figsize=(8, 6))
bottom = 0
for i in range(len(labels)):
plt.bar('Period 0', values[i], bottom=bottom, color=colors[i], label=labels[i])
bottom += values[i]
plt.title('Rekomendasi Analis')
plt.xlabel('Periode')
plt.ylabel('Jumlah Rekomendasi')
plt.xticks(rotation=0)
plt.legend(title='Rekomendasi')
plt.tight_layout()
plt.show()

Stacked Chart untuk rekomendasi analis
Download
Ini adalah class utama dari yfinance, mengambil data harga CHLOV (Close High Low Open Volume).
Untuk pengambilan data, disediakan beberapa pilihan, mode periode, mode interval dan range waktu.
Mode periode, tersedia dalam 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max. ytd adalah year to date, artinya diambil mulai awal tahun sampai tanggal pengambilan data, dan max adalah data maksimal yang tersedia pada yahoo finance.
Interval adalah jarak data atau granulasi, tersedia dalam interval 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
data=yf.download("BBCA.JK",period="1y")
print(data)

Data periode 1 tahun
dengan interval :
data=yf.download("BBCA.JK",period="1y", interval="1wk")
print(data)

Data periode 1 tahun interval 1 minggu
Range
Mode range adalah pengambilan data dari periode tertentu sesuai dengan kebutuhan. Mode ini ditentukan dengan parameter start dan end.
data=yf.download("BBCA.JK",start="2025-01-01",end="2025-02-01")

Data dengan menggunakan start end
Parameter interval juga bisa digunakan untuk dalam mode range.
data=yf.download("BBCA.JK",start="2025-01-01",end="2025-02-01", interval="1wk")

Data start end dengan interval
Pengolahan lanjutan
yfinance menghasilkan keluaran array, masing-masing elemen, Close, High, Low, Open dan Volume bisa kita manfaatkan dengan fleksibel.
print(data['Close'])

Data Close
Begitu juga jika diambil beberapa saham sekaligus.
data=yf.download("BBCA.JK BBRI.JK BMRI.JK",start="2025-01-01",end="2025-02-01")
Untuk mendapatkan harga salah satu saham :
print(data['Close']['BBCA.JK'])
Visualisasi
Data yang didapat dari yfinance, dapat dengan mudah di visualisasikan dengan menggunakan matplotlib
Misalkan akan dibuat visualisasi harga close BBCA.JK dalam satu tahun.
import matplotlib.pyplot as plt
data=yf.download("BBCA.JK",start="2025-01-01",end="2025-12-31")
close_prices = data['Close']
plt.figure(figsize=(12, 6))
plt.plot(close_prices)
plt.title('Close BBCA.JK')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.grid(True)
plt.tight_layout()
plt.show()

Chart dengan data Close
Untuk beberapa saham, dapat dengan mudah ditampilkan dalam satu chart yang sama, misalkan digunakan untuk memperbandingkan.
import matplotlib.pyplot as plt
data=yf.download("BBCA.JK BMRI.JK BBRI.JK BBTN.JK",start="2025-01-01",end="2025-12-31")
close_data = data['Close']
plt.figure(figsize=(14, 8))
close_data.plot(ax=plt.gca())
plt.title('Closing Prices for Multiple Tickers')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.grid(True)
plt.legend(title='Ticker')
plt.tight_layout()
plt.show()

Chart Close beberapa saham
Pandas
Berikutnya, data dari yfinance akan diolah dengan menggunakan pandas dataframe.
Dalam contoh akan dihitung moving average dari saham, dan akan di visualisasikan.
Untuk menghitung moving average digunakan fasilitas dari pandas, yaitu meotde rolling(), dan diikuti dengan mean(). Pandas akan secara otomatis melakukan perhitungan rata-rata pada periode tertentu dengan data point yang berpindah atau rolling pada data.
data["MA20"] = data["Close"].rolling(window=20).mean()
Dalam contoh digunakan rolling window 20, artinya moving average atau rata rata dihitung setiap pada periode 20 hari.
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
data = yf.download("BMRI.JK", start="2023-01-01", end="2026-01-01")
data["MA20"] = data["Close"].rolling(window=20).mean()
plt.figure(figsize=(10,5))
plt.plot(data["Close"], label="Close Price")
plt.plot(data["MA20"], label="MA 20", linestyle="--")
plt.title("BMRI - 20-day Moving Average")
plt.legend()
plt.show()

Chart Close saham dengan MA 20
Keterbatasan yfinance
yfinance adalah proyek opensource dan bukan merupakan API resmi dari Yahoo. Sehingga tidak cocok digunakan untuk keperluan profesional.
yfinance sebenarnya adalah sebuah web scrapper yang mengambil data dari website Yahoo Finance, data yang dihasilkan bisa jadi bukan data real time.
Jika ada perubahan sewaktu-waktu pada website Yahoo, akan memungkinkan terjadi kesalahan, dan untuk perbaikannya biasanya menunggu maintainer.
Selain itu penggunaan yfinance juga ada resiko request kita terblocking, jika request dilakukan frekuensi cukup tinggi dan volume yang besar. Ini biasanya karena ada rate limit yang dilakukan oleh server Yahoo.
Yang paling penting adalah, yfinance tidak mendapatkan support resmi dari Yahoo, jadi ketika terjadi kesalahan data, error dan masalah lain, kita tidak bisa komplain ke Yahoo.
Untuk keperluan profesional, disarankan menggunakan API berbayar.
Penutup
yfinance adalah library python yang sangat berguna untuk mendapatkan data keuangan suatu saham secara otomatis.
Untuk menggunakannya diperlukan pengetahuan tentang programming python, terutama untuk menangani data tabel dua dimensi.
yfinance dapat dengan mudah diintegrasikan dengan library yang lain, sehingga jika dibuat sebuah pipeline trading algoritmik seperti :
Data saham — indikator — signal — backtest — strategi — visualisasi.
Dapat dengan mudah diimplementasikan dengan yfinance, pandas, numpy, matplotlib
Untuk penggunaan machine learning bisa ditambahkan scikit-learn pada pipeline, atau alur kerja.
yfinance sesuai untuk keperluan prototipe dan personal saja. Kelengkapan dan akurasi data tidak ada yang menjamin.
Untuk produksi profesional, disarankan tetap menggunakan sumber data berbayar yang resmi.
메타데이터
- post_id
- 937829d1ca4d
- slug
- analisa-data-saham-dengan-yfinance-dan-python-937829d1ca4d
- url
- https://medium.com/@wimasy/analisa-data-saham-dengan-yfinance-dan-python-937829d1ca4d
- canonical_url
- https://medium.com/@wimasy/analisa-data-saham-dengan-yfinance-dan-python-937829d1ca4d
- author_url
- https://medium.com/@wimasy
- status
- ok
- fetched_at
- 2026-07-11 05:10:20