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]]