Я пытаюсь нарисовать линии поддержки / сопротивления для финансовых активов, используя алгоритм k-средних в Python (используя метод Elbow для определения оптимального количества кластеров):
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
def get_optimum_clusters(df):
'''
:param df: dataframe
:param saturation_point: The amount of difference we are willing to detect
:return: clusters with optimum K centers
This method uses elbow method to find the optimum number of K clusters
We initialize different K-means with 1..30 centers and compare the inertias
If the difference is no more than saturation_point, we choose that as K and move on
'''
wcss = []
k_models = []
size = min(30, len(df.index))
for i in range(1, size):
kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=500, n_init=30, random_state=0)
kmeans.fit(df)
wcss.append(kmeans.inertia_)
k_models.append(kmeans)
# Compare differences in inertias until it's no more than saturation_point
optimum_k = len(wcss)-1
for i in range(0, len(wcss)-1):
diff = abs(wcss[i+1] - wcss[i])
if diff < saturation_point:
optimum_k = i
break
print("Optimum K is " + str(optimum_k + 1))
optimum_clusters = k_models[optimum_k]
return optimum_clusters
#data here is the DataFrame containing info on Date, Open,High,Low,Close,Volume
lows = pd.DataFrame(data=data, index=data.index, columns=["Low"])
highs = pd.DataFrame(data=data, index=data.index, columns=["High"])
saturation_point=data['Adj Close'].mean()/2
low_clusters = get_optimum_clusters(lows)
low_centers = low_clusters.cluster_centers_
low_centers = np.sort(low_centers, axis=0)
high_clusters = get_optimum_clusters(highs)
high_centers = high_clusters.cluster_centers_
high_centers = np.sort(high_centers, axis=0)
По сути, я встаю до 30 кластеров (линий) для сопротивления (high_centers) и поддержки (low_centers). Я хочу ранжировать их по следующим критериям:
1) Количество точек в кластере> = 3
2) Минимально возможная сумма расстояний от центра до точек.
Идея состоит в том, чтобы оставить лучшие линии сопротивления / поддержки. Есть ли способ получить количество точек и вариации отдельного кластера в библиотеке Sklearn Kmeans? Я не смог найти в документации.