Metodoloji hakkında detaylı bilgi için: [The must-have machine learning technique for financial market data analysis](https://pyquantnews.com/machine-learning-technique-financial-data-analysis/). Ben burada [isyatirimhisse](https://pypi.org/project/isyatirimhisse/) ile BIST'e uygulamak için aşağıdaki kodu kullandım. Kaç grup olmalı, dataframe'de neyi niye yapıyoruz üstteki sitede var.
Daha da detaylı bilgi ve değişkenler için [KMeans](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html). Eğer yüklü değilse scikit-learn kütüphanesi gerekli.
Kmeans ile ilgili güzel bir [Türkçe kaynak](https://medium.com/@ekrem.hatipoglu/machine-learning-clustering-k%C3%BCmeleme-k-means-algorithm-part-13-be33aeef4fc8), iris veriseti üzerinden Python örneği de var.
```python
from isyatirimhisse import fetch_data, fetch_financials, visualize_data
from math import sqrt
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
plt.rc("font", size=10)
# isyatirimhisse ile bazı hisseleri seçerek kapanış fiyatlarını günlük olarak aldım
symbol=['SISE','THYAO', 'EREGL', 'KRDMRD', 'SAHOL', 'KCHOL', 'ISCTR', 'BIMAS', 'VESBE', 'PETKM', 'AKBNK', 'ASELS', 'FROTO', 'TOASO', 'ALARK', 'MAVI']
start_date='03-06-2022'
frequency='1d'
observation='last'
dataNEW=fetch_data(
symbol=symbol,
start_date=start_date,
frequency=frequency,
observation=observation
)
# dataframe'de tarih kısmındaki fazla kısımları ve index sütununu attım
dataNEW['Date']=dataNEW['Date'].apply(lambda x: str(x).replace("T",""))
dataNEW = dataNEW.rename(columns={'Date': 'date'})
dataNEW.set_index("date", inplace = True)
# ardından fiyatlardaki yüzde değişimlerden sonuca doğru geçiş, oynaklık ve getiri
moments = (
dataNEW
.pct_change()
.describe()
.T[["mean", "std"]]
.rename(columns={"mean": "returns", "std": "vol"})
) * [252, sqrt(252)]
# elbow curve grup sayısını belirlemek açısından gösterge, tam kırılma noktasına yani dirseğe bakıyoruz
sse = []
for k in range(2, 15):
kmeans = KMeans(n_clusters=k, n_init=10)
kmeans.fit(moments)
sse.append(kmeans.inertia_)
plt.plot(range(2, 15), sse)
plt.title("Elbow Curve");
```
![[Pasted image 20230815131848.png]]
```python
# y ekseni oynaklık, x ekseni getiri, üstteki grafiğe göre 5 grup mantıklı gibi
kmeans = KMeans(n_clusters=5, n_init=10).fit(moments)
plt.scatter(
moments.returns,
moments.vol,
c=kmeans.labels_,
cmap="rainbow",
);
plt.title("BIST Getiri/Volatilite Grupları (K=5)")
for i in range(len(moments.index)):
txt = f"{moments.index[i]} ({kmeans.labels_[i]})"
xy = tuple(moments.iloc[i, :] + [0, 0.01])
plt.annotate(txt, xy)
```
![[Pasted image 20230815131822.png]]