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.
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.
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.
Vous pouvez également le vérifier à partir des outils de développement, alors obtenez-le comme vous le souhaitez.
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.
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.
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 |
... | ... | ... | ... |
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.
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()
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()
df_diff = df.diff()
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()
É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
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()
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.
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()
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.
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
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.
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.)
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()
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.
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