Depuis que le stock a plongé en raison de l'influence du nouveau virus corona, j'ai essayé de visualiser les performances de ma fiducie d'investissement avec Python.

En mars 2020, les cours des actions ont chuté en raison de l'expansion mondiale du nouveau virus corona.

Comme c'est un gros problème, j'ai essayé de visualiser les résultats des fiducies d'investissement que j'ai accumulées régulièrement avec Python et j'ai étudié son impact. Veuillez jeter un œil aux résultats de ma fiducie de placement.

Collecte de données

J'achète une fiducie de placement chez Rakuten Securities. Si vous allez dans «Gestion de compte> Fiducies d’investissement> Fiducies d’investissement après» dans le menu supérieur, vous pouvez voir la transition de l’ensemble de la fiducie d’investissement, y compris toutes les émissions annulées. S'il ne s'agit que de la transition, vous pouvez la vérifier entièrement sur cet écran, mais nous acquérirons les données brutes pour une analyse plus approfondie. スクリーンショット 2020-03-05 22.04.33.png

Cliquez avec le bouton droit sur l'écran pour afficher la source de la page. Ensuite, en bas (à partir de la 1649ème ligne), il y a de tels tableaux data1, data2, data3, data4, donc copiez-les.

スクリーンショット 2020-03-05 22.10.39.png

Vous pouvez également le vérifier à partir des outils de développement, alors obtenez-le comme vous le souhaitez.

Vérifier les données avec Google Colaboratory

Démarrez Google Colaboratory et essayez de gérer le tableau à deux dimensions tel qu'il est pour le moment.

#C'est en fait plus long.
data1 = [[1520175600000,0.000000],[1520262000000,-2.000000],[1520348400000,-1.000000]]
data2 = [[1520175600000,3758.000000],[1520262000000,3756.000000],[1520348400000,3757.000000]]
data3 = [[1520175600000,3758.000000],[1520262000000,3758.000000],[1520348400000,3758.000000]]
data4 = [[1520175600000,0.000000],[1520262000000,0.000000],[1520348400000,0.000000]]

Toutes les longueurs étaient de 488. (Cela dépend de la personne.)

len(data1), len(data2), len(data3), len(data4)
# => (488, 488, 488, 488)

Faites-en une trame de données Pandas. À l'origine, c'était un tableau bidimensionnel de JavaScript, mais comme la forme du tableau est la même en Python, vous pouvez lire celui copié tel quel avec Pandas. De là, data1 est extraite et affichée.

import pandas as pd

df1 = pd.DataFrame(data1)
df1
0 1
0 1520175600000 0.0
1 1520262000000 -2.0
2 1520348400000 -1.0
3 1520434800000 -2.0
4 1520521200000 -2.0
... ... ...

La première colonne ressemble à un horodatage, mais elle ne semble pas avoir de point décimal. Divisez par 1000 pour aligner les chiffres, indexez puis convertissez en Datetime.

df1[0] = df1[0] // 1000
df1 = df1.set_index([0])
df1.index = pd.to_datetime(df1.index, unit='s')
df1
1
0
2018-03-04 15:00:00 0.0
2018-03-05 15:00:00 -2.0
2018-03-06 15:00:00 -1.0
2018-03-07 15:00:00 -2.0
2018-03-08 15:00:00 -2.0
... ...
2020-02-26 15:00:00 59802.0
2020-02-27 15:00:00 19223.0
2020-03-01 15:00:00 -245.0
2020-03-02 15:00:00 37929.0
2020-03-03 15:00:00 9971.0

Les données des deux dernières années sont affichées. Puisqu'il est expliqué comme «Transition de l'ensemble de la fiducie d'investissement, y compris toutes les actions annulées», la période d'acquisition peut varier selon la personne.

Pour le moment, visualisons ces données1 avec matplotlib.

import matplotlib.pyplot as plt
df1.plot()
plt.show()

Voici les résultats. total_return.png

Si vous le comparez à l'écran de l'Investment Trust Ashiato de Rakuten Securities, vous pouvez voir que data1 est le rendement total. Le bénéfice d'environ 140000 yens accumulé à partir de janvier 2019 a disparu en un instant en raison de l'influence du virus corona.

Essayez de tracer le reste des données2 ~ 3 de la même manière. datas.png

Apparemment, les données 1 ~ 4 obtenues à partir de la source de la page Rakuten Securities correspondent aux éléments suivants dans l'ordre.

--Retour total

Après cela, il a été rassemblé dans un Dataframe pour faciliter la manipulation, et les noms de colonne ont été modifiés pour correspondre au contenu. (Exclus cette fois parce que je n'ai pas acheté de fiducie de placement avec distributions) J'ai également exclu les six premiers mois, qui étaient pour la plupart dormants.

return value invest
time
2018-11-01 15:00:00 -1.0 1629.0 1630.0
2018-11-04 15:00:00 -1.0 0.0 1.0
2018-11-05 15:00:00 0.0 20000.0 20000.0
2018-11-06 15:00:00 67.0 20067.0 20000.0
2018-11-07 15:00:00 439.0 20439.0 20000.0
... ... ... ...

Faites ce genre de visualisation avec Plotly.

Personnellement, j'aime l'ambiance telle que la couleur de Plotly, alors je vais essayer de la visualiser avec Plotly.

pip install plotly

Tout d'abord, reproduisons l'écran de Rakuten Securities.

Retour total

import plotly.graph_objects as go

data = [
    go.Scatter(x=df.index, y=df['return'], name='Retour total'),
]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title='temps',
        type='date',
        tickformat="%Y-%m",
        dtick='M1',
        tickangle=90,
        showgrid=False
    ),  
    yaxis = dict(
        title = 'Somme d'argent'
    ),
    showlegend=True,
    legend=dict(
        x=0.025,
        y=0.95,
        font=dict(
            size=15
        ),
        borderwidth=2
    ),
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

スクリーンショット 2020-03-07 16.30.34.png

Valorisation et investissement réel

Le code est presque le même, donc réduisez (cliquez pour développer)
data = [
    go.Scatter(x=df.index, y=df['value'], name='Évaluation'),
    go.Scatter(x=df.index, y=df['invest'], name='Coût d'investissement')
]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title='temps',
        type='date',
        tickformat="%Y-%m",
        dtick='M1',
        tickangle=90,
        showgrid=False
    ),  
    yaxis = dict(
        title = 'Somme d'argent'
    ),
    legend=dict(
        x=0.025,
        y=0.95,
        font=dict(
            size=15
        ),
        borderwidth=2
    ),
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

スクリーンショット 2020-03-07 16.05.42.png

Différence du jour ouvrable avant retour / taux de variation

df_diff = df.diff()
Le code est presque le même, donc réduisez (cliquez pour développer)
data = [
    go.Scatter(x=df_diff.index, y=df_diff['return'], name='Différence de jour ouvrable avant le retour', line = dict(color='purple'))
]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title='temps',
        type='date',
        tickformat="%Y-%m",
        dtick='M1',
        tickangle=90,
        showgrid=False
    ),  
    yaxis = dict(
        title = 'Somme d'argent',
    ),
    showlegend=True,
    legend=dict(
        x=0.025,
        y=0.95,
        font=dict(
            size=15
        ),
        borderwidth=2
    ),
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

スクリーンショット 2020-03-07 17.16.08.png

Évidemment, à mesure que le montant de l'investissement augmente par rapport à la valeur absolue, la variation du rendement augmente également, alors regardons le rapport au montant de l'évaluation à ce moment-là.

df['return_change_ratio'] = df['return'].diff() / df['value']
df
Le code est presque le même, donc réduisez (cliquez pour développer)
data = [
    go.Scatter(x=df.index, y=df['return_change_ratio'], name='Taux de variation les jours ouvrables avant le retour', line = dict(color='purple'))
]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title='temps',
        type='date',
        tickformat="%Y-%m",
        dtick='M1',
        tickangle=90,
        showgrid=False
    ),  
    yaxis = dict(
        title = 'Taux de changement',
        tickformat='%'
    ),
    showlegend=True,
    legend=dict(
        x=0.025,
        y=0.05,
        font=dict(
            size=15
        ),
        borderwidth=2
    ),
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

スクリーンショット 2020-03-08 12.04.52.png

Si vous regardez cela, vous pouvez voir que le jour où les actifs fluctuent de ± 5% en une journée arrive régulièrement.

J'ai arrangé les données par ordre décroissant du taux de déclin.

df.sort_values('return_change_ratio', ascending=True).head(10)
return_change_ratio
time
2020-02-24 15:00:00 -0.055890
2020-02-27 15:00:00 -0.051792
2018-12-24 15:00:00 -0.049762
2020-03-05 15:00:00 -0.043918
2019-08-25 15:00:00 -0.039766
2019-01-03 15:00:00 -0.037813
2020-02-25 15:00:00 -0.035507
2018-12-04 15:00:00 -0.034236
2020-03-03 15:00:00 -0.033716
2019-08-14 15:00:00 -0.031938

Les 1er, 2ème, 4ème, 7ème et 9ème à partir du haut seraient dus au choc corona, qui a représenté 5 jours sur 10, soit la moitié.

Au contraire, je les ai classés par ordre décroissant d'augmentation.

df.sort_values('return_change_ratio', ascending=False).head(10)
return_change_ratio
time
2020-03-02 15:00:00 0.044621
2018-12-26 15:00:00 0.040878
2020-03-04 15:00:00 0.038827
2019-01-06 15:00:00 0.026219
2019-08-13 15:00:00 0.022233
2020-02-04 15:00:00 0.021108
2019-11-04 15:00:00 0.019685
2019-06-04 15:00:00 0.018888
2018-11-07 15:00:00 0.018200
2019-09-05 15:00:00 0.017959

Le premier et le troisième sont probablement les effets du choc corona. Il semble que le taux d'augmentation par jour ait également atteint le niveau le plus élevé de mon historique d'investissement.

Modifier l'histogramme des taux

data = [go.Histogram(x=df['return_change_ratio'], xbins=dict(size=0.001))]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title="Taux de changement", 
        dtick=0.01,
        range=[-0.06, 0.06],
        tickformat='%'
    ),
    yaxis = dict(
        title="la fréquence"
    )
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

スクリーンショット 2020-03-08 12.34.47.png

Deux des trois valeurs aberrantes de fréquence 1 sur l'ourlet droit et les première, deuxième, quatrième, septième et neuvième des dix fréquences 1 consécutives sur l'ourlet gauche sont pour les chocs corona.

Retour mensuel

J'ai rééchantillonné mensuellement avec OHLC, pris la différence entre Open et Close, et examiné le changement de rendement mensuel. (Existe-t-il un moyen plus simple de le faire?)

df_month = df['return'].resample('M').ohlc()
df_month['diff'] = df_month['close'] - df_month['open']
df_month
Le code est presque le même, donc réduisez (cliquez pour développer)

スクリーンショット 2020-03-07 23.18.06.png

data = [
    go.Bar(x=df_month.index.strftime('%Y-%m'), y=df_month['diff'], name='Retour mensuel', marker_color ='orange')
]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title='temps',
        tickformat="%Y-%m",
        dtick='M1',
        tickangle=90,
        showgrid=False
    ),  
    yaxis = dict(
        title = 'Somme d'argent',
    ),
    showlegend=True,
    legend=dict(
        x=0.025,
        y=0.05,
        font=dict(
            size=15
        ),
        borderwidth=2
    ),
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

Quand j'ai rééchantillonné avec Pandas, la dernière date de la période est devenue un index et elle n'était pas alignée avec l'étiquette de l'intrigue, alors j'en ai fait une chaîne de caractères.

スクリーンショット 2020-03-07 23.29.31.png

Rendement mensuel de l'investissement

En plus des économies quotidiennes, nous achetons plus et vendons de façon irrégulière, donc si vous voulez calculer strictement le rendement mensuel, vous devez tenir compte du montant que vous avez acheté ou vendu le jour du mois. Cependant, ici, j'ai simplement calculé le ratio de rendement en fonction de la valeur moyenne du montant de l'investissement pour le mois.

Cela dit, la plupart d'entre eux sont des investissements de réserve à montant fixe, il ne devrait donc pas y avoir beaucoup de différence avec ce simple résultat. (Il est possible de calculer exactement avec seulement les données préparées cette fois.)

import numpy as np

df_month = df.resample('M').agg({'return' : lambda x: x[-1] - x[0], 'invest': np.mean})
df_month['interest'] = df_month['return'] / df_month['invest']
df_month
return invest interest
time
2018-11-30 -113.0 25081.550000 -0.004505
2018-12-31 -4160.0 39805.473684 -0.104508
2019-01-31 6285.0 85135.350000 0.073824
2019-02-28 8414.0 174170.210526 0.048309
2019-03-31 1161.0 238031.650000 0.004878
2019-04-30 5696.0 243301.684211 0.023411
2019-05-31 -16022.0 284249.052632 -0.056366
2019-06-30 20011.0 320820.857143 0.062374
2019-07-31 3929.0 352307.818182 0.011152
2019-08-31 -4843.0 399468.000000 -0.012124
2019-09-30 17063.0 460678.400000 0.037039
2019-10-31 19022.0 517172.190476 0.036781
2019-11-30 20319.0 571007.684211 0.035584
2019-12-31 21238.0 645114.238095 0.032921
2020-01-31 15858.0 688004.947368 0.023049
2020-02-29 -56921.0 732071.222222 -0.077753
2020-03-31 7343.0 817248.000000 0.008985

(La différence des rendements mensuels pourrait être calculée à l'aide de la fonction agrégée sans utiliser OHLC.)

Le code est presque le même, donc réduisez (cliquez pour développer)
data = [
    go.Bar(x=df_month.index.strftime('%Y-%m'), y=df_month['interest'], name='Rendement mensuel', marker_color ='pink')
]

layout = go.Layout(
    width=800,
    height=450,
    xaxis = dict(
        title='temps',
        tickformat="%Y-%m",
        dtick='M1',
        tickangle=90,
        showgrid=False
    ),  
    yaxis = dict(
        title='rendement',
        range = [-0.15, 0.15],
        tickformat='%'
    ),
    showlegend=True,
    legend=dict(
        x=0.025,
        y=0.95,
        font=dict(
            size=15
        ),
        borderwidth=2
    ),
)

fig = go.Figure(
    data=data,
    layout=layout
)
fig.show()

スクリーンショット 2020-03-08 22.18.04.png

En février 2020, lorsque le virus corona a commencé à se propager dans le monde entier, le rendement de l'investissement était d'environ «-7,78%». Il n'y a toujours aucun signe de convergence et l'impact sur l'économie devrait commencer sérieusement, nous prêtons donc une attention particulière aux tendances futures.

Le pire rendement mensuel des investissements était de «-10,45%» en décembre 2018. Au fait, il y a eu un crash à la fin de l'année.

fin

Puisqu'il a été visualisé sur une base ad hoc, il peut s'agir d'une vue erronée ou d'une erreur. Dans ce cas, je vous serais reconnaissant de bien vouloir nous faire un bref commentaire.

De plus, si vous disposez de ces données, veuillez suggérer des opinions ou des conseils selon lesquels une telle analyse serait intéressante. Je vous remercie. Merci d'avoir regardé jusqu'à la fin.

Recommended Posts

Depuis que le stock a plongé en raison de l'influence du nouveau virus corona, j'ai essayé de visualiser les performances de ma fiducie d'investissement avec Python.
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé de trouver l'entropie de l'image avec python
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
[Python] J'ai essayé de visualiser le prix en argent de "ONE PIECE" plus de 100 millions de caractères avec matplotlib.
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
Comme c'est le 20e anniversaire de la formation, j'ai essayé de visualiser les paroles de Parfum avec Word Cloud
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de résumer les opérations de chaîne de Python
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
[First data science ⑥] J'ai essayé de visualiser le prix du marché des restaurants à Tokyo
J'ai essayé de visualiser les données de course du jeu de course (Assetto Corsa) avec Plotly
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
J'ai évalué la stratégie de négociation du système boursier avec Python.
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
[Python] Le statut de chaque préfecture du nouveau virus corona n'est publié qu'en PDF, mais j'ai essayé de le gratter sans le télécharger.
J'ai essayé de savoir comment rationaliser le flux de travail avec Excel × Python, mon résumé d'article ★
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 1
Le cours de l'action a chuté avec "nouvelle Corona"? J'ai essayé d'obtenir le cours moyen de l'action Nikkei par grattage Web
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de résoudre la première question de l'examen d'entrée en mathématiques 2019 de l'Université de Tokyo avec python sympy
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
Je veux sortir le début du mois prochain avec Python
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de visualiser Boeing de la performance du violon par estimation de pose
Je veux vérifier la position de mon visage avec OpenCV!
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
J'ai essayé de sortir la liste rpm de la destination de connexion SSH sur une feuille Excel avec Python + openpyxl.
Le nombre de fermetures de magasins a-t-il augmenté en raison de l'influence du nouveau virus corona?
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder