[PYTHON] Essayez d'utiliser scikit-learn (1) - Clustering K par méthode moyenne

La dernière fois a brièvement écrit la méthode d'apprentissage automatique implémentée dans scikit-learn, mais il semble qu'il y ait une certaine demande à partir d'aujourd'hui. Lors de l'écriture d'un exemple de code pour l'apprentissage automatique à l'aide de scikit-learn, j'aimerais aborder la compréhension et la pratique de la méthode.

Tout d'abord, je vais donner un exemple de clustering par la méthode de moyennage K, qui a également été fait dans Précédent.

La méthode de calcul de la moyenne K est l'une des méthodes de base du clustering, elle est simple et rapide, et elle est également idéale pour commencer. Je recommande d'expliquer l'opération à chaque fois, mais par ici est facile à comprendre.

Les données sur le cours des actions sont toujours utilisées comme cible pour le regroupement.

Données de cours de bourse

  1. Tout le monde peut l'obtenir gratuitement
  2. Données réelles qui sont un indicateur de la "performance" d'une entreprise
  3. Facile à analyser car il s'agit de données quantitatives Il est facile à manipuler car il possède de telles caractéristiques.

Il existe une relation étroite entre la performance des entreprises et le cours des actions. On dit qu'il y a en fait un écart d'environ six mois à trois ans entre les deux. C'est parce que les investisseurs investissent dans les performances futures.

En d'autres termes, les futurs résultats commerciaux ont déjà été pris en compte dans le cours de l'action. Par exemple, lors de la prévision de l'investissement informatique et de sa demande, vous pouvez penser à une stratégie de vente simple dans laquelle la demande informatique est également attendue dans les domaines où les performances de l'entreprise augmentent.

Cette fois, j'analyserai les données des entreprises suivantes. Les deux sont des entreprises proches de notre entreprise (DTS).

Marque Nom de la compagnie
9682 DTS
9742 Inès
9613 Données NTT
2327 Nippon Steel et Sumitomo Metal Solutions
9640 Systèmes d'information de saison
3626 Fonds informatiques
2317 Systema
4684 Obic
9739 NSW
4726 Technologie Softbank
4307 Institut de recherche Nomura
9719 SCSK
4793 Fujitsu BSC
4812 Service d'information international Dentsu
8056 Japon Unisys

Index de retour

Le rendement dans le monde financier se réfère généralement à une variation en pourcentage du prix des actifs à partir d'un jour. Un simple index de retour peut être trouvé à l'aide de pandas comme suit:

returns = pd.Series(close).pct_change() #Trouvez le taux d'augmentation / diminution
ret_index = (1 + returns).cumprod() #Trouvez le produit cumulatif
ret_index[0] = 1 #Première valeur 1.Mettre à 0

Lorsqu'on se concentre sur plusieurs sociétés, l'indice de rendement est utilisé pour mesurer l'évolution de la valeur de l'actif, 1 étant fixé en fonction du prix d'un jour.

Par exemple, regardons l'indice de retour pour les 30 derniers jours à compter de la date de rédaction de cet article.

#Lire les données de séries chronologiques à partir d'un fichier csv
df = pd.read_csv(csvfile,
                 index_col=0, parse_dates=True)
df = df[-30:] #Les 30 derniers jours
#Liste pour l'index de retour
indexes = get_ret_index(df)['ret_index'].values.tolist()
#Afficher DTS
if stock == "9682":
    ts = df.index.values
    for t, v in zip(ts, indexes):
        print(t,v)
#=>
# 2015-02-23 1.0
# 2015-02-24 1.010054844606947
# 2015-02-25 1.020109689213894
# 2015-02-26 1.0351919561243146
# 2015-02-27 1.0680987202925045
# ...
# 2015-04-01 1.0237659963436931
# 2015-04-02 1.0530164533820843
# 2015-04-03 1.040219378427788

Voilà pourquoi.

Cette fois, regroupons en utilisant les valeurs des 30 derniers jours comme premier. Autrement dit, ce qui précède devient un vecteur à 30 dimensions tel quel.

Clustering K-Means

Ici, soit k = 4.

kmeans_model = KMeans(n_clusters=4, random_state=30).fit(features)
labels = kmeans_model.labels_
for label, name, feature in zip(labels, names, data):
    print(label, name)
#=>
# 2 9742
# 1 9682
# 2 9613
# 1 2327
# 3 9640
# 1 3626
# 1 2317
# 2 4684
# 0 9739
# 0 4726
# 2 4307
# 1 9719
# 0 4793
# 0 4812
# 1 8056

Le numéro de cluster et le code de marque auquel vous appartenez sont affichés de cette manière.

Visualisation

Il est difficile de comprendre si ce n'est que cela, alors visualisons-le.

df = pd.DataFrame(df, index=ts)
plt.figure()
df.plot()
plt.subplots_adjust(bottom=0.20)
plt.legend(loc="best")
plt.savefig("cluster.png ")
plt.close()

Tout d'abord, il s'agit du cluster 0.

df0.png

Si vous le visualisez, vous pouvez voir que les actions qui ont connu une forte baisse en mars se sont solidifiées.

Vient ensuite le cluster numéro 1.

df1.png

Il s'agit d'un ensemble d'actions dont les prix ont été augmentés vers la fin de l'exercice, bien qu'il existe une certaine gamme de mouvements de prix.

Numéro de cluster 2.

df2.png

Les entreprises qui ont augmenté leur valeur se rassemblent. On peut dire que la performance de ces quatre sociétés a été favorable.

Le cluster 3 semble avoir été sélectionné parmi une entreprise qui s'est comportée de manière quelque peu irrégulière.

df3.png

Des grappes ont été formées pour chaque entreprise qui avait des mouvements de prix similaires. Voir le tableau ci-dessus pour la relation entre les actions et les noms de sociétés.

Cette fois, nous avons ciblé uniquement les actions SIer, mais si vous le souhaitez, vous pouvez dériver des actions similaires à partir des données de toutes les autres sociétés cotées.

Japan Exchange-Autres données statistiques http://www.jpx.co.jp/markets/statistics-equities/misc/01.html

Une liste de toutes les sociétés cotées peut être téléchargée à partir de ce qui précède. J'ai écrit sur l'acquisition de données boursières dans Précédent, donc je vais l'omettre.

Résumé

Que pouvons-nous apprendre d'une telle analyse?

Une idée consiste à extraire des entreprises qui affichent des indicateurs similaires à partir de données dans un large éventail d'industries, par exemple, pour colorer le cycle en cas de négociation, ou pour estimer la demande d'investissement informatique caché s'il s'agit d'une stratégie commerciale. Peut être fait. Si nous pouvons regrouper mécaniquement pour toutes les industries, nous pouvons éviter les problèmes de jugement humain et de reprise.

Alternativement, cette fois, nous avons simplement utilisé l'indice de retour comme indice, mais en principe, n'importe quel indice peut être utilisé. Par exemple, le cours moyen de l'action Nikkei est calculé à partir de la moyenne de 225 entreprises, mais si vous souhaitez créer un indice similaire à celui-ci à partir de seulement 20 entreprises, vous pouvez utiliser l'apprentissage automatique.

En tout cas, il n'y a rien de moins qu'une analyse qui s'appuie sur l'intuition et l'expérience. Les humains ont des distorsions cognitives et prennent des décisions émotionnelles. Cette zone est [Behavioral Economics](http://ja.wikipedia.org/wiki/%E8%A1%8C%E5%8B%95%E7%B5%8C%E6%B8%88%E5%AD% Comme vous pouvez le voir sur A6), les humains ne prennent pas toujours des décisions rationnelles. Le support d'analyse mécanique est essentiel pour éliminer les émotions humaines et prendre des décisions rationnelles dans l'analyse des données financières.

Recommended Posts

Essayez d'utiliser scikit-learn (1) - Clustering K par méthode moyenne
Essayez d'utiliser Tkinter
Essayez d'utiliser docker-py
Essayez d'utiliser Cookiecutter
Essayez d'utiliser PDFMiner
Essayez d'utiliser des géopandas
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Essayez l'analyse de cluster par K-means
Clustering avec scikit-learn (1)
Essayez d'utiliser pandas.DataFrame
Clustering avec scikit-learn (2)
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser tf.metrics
Essayez d'utiliser PyODE
kmeans ++ avec scikit-learn
Clustering avec scikit-learn + DBSCAN
Essayez d'utiliser virtualenv (virtualenvwrapper)
[En gros] Clustering par K Means
[Azure] Essayez d'utiliser Azure Functions
Essayez d'utiliser virtualenv maintenant
Essayez d'utiliser W & B
Essayez d'utiliser Django templates.html
[Kaggle] Essayez d'utiliser LGBM
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python
DBSCAN (clustering) avec scikit-learn
Essayez d'utiliser Tweepy [Python2.7]
Essayez d'utiliser collate_fn de Pytorch
(Suite) Essayez d'autres fonctions de distance avec kmeans dans Scikit-learn
Essayez d'utiliser PythonTex avec Texpad.
[Python] Essayez d'utiliser le canevas de Tkinter
Essayez d'utiliser l'image Docker de Jupyter
Essayez l'optimisation des fonctions à l'aide d'Hyperopt
Essayez d'utiliser matplotlib avec PyCharm
Essayez d'utiliser Azure Logic Apps
Essayez d'utiliser Kubernetes Client -Python-
[Kaggle] Essayez d'utiliser xg boost
Essayez d'utiliser l'API Twitter
Essayez d'utiliser OpenCV sur Windows
Essayez d'utiliser Jupyter Notebook de manière dynamique
python: principes de base de l'utilisation de scikit-learn ①
Essayez d'utiliser AWS SageMaker Studio
Essayez de tweeter automatiquement en utilisant Selenium.
Essayez d'utiliser SQLAlchemy + MySQL (partie 1)
Essayez d'utiliser l'API Twitter
Essayez d'utiliser SQLAlchemy + MySQL (partie 2)
Essayez d'utiliser la fonction de modèle de Django
Essayez d'utiliser l'API PeeringDB 2.0
Essayez d'utiliser la fonction de brouillon de Pelican
Essayez d'utiliser pytest-Overview and Samples-
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
Essayez d'utiliser le folium avec anaconda
Essayez d'utiliser l'API Admin de la passerelle Janus
[Statistiques] [R] Essayez d'utiliser la régression par points de division.
Essayez d'utiliser Spyder inclus dans Anaconda
Essayez d'utiliser des modèles de conception (édition exportateur)
Modèle de recherche de grille simple à l'aide de Scikit-learn
Essayez d'utiliser Pillow sur iPython (partie 2)
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage