Ab März 2020 sind die Aktienkurse aufgrund der weltweiten Expansion des neuen Koronavirus gesunken.
Da es eine große Sache ist, habe ich versucht, die Ergebnisse der Investment Trusts zu visualisieren, die ich kontinuierlich mit Python gesammelt habe, und untersucht, wie viel Einfluss es hatte. Bitte werfen Sie einen Blick auf die Ergebnisse meines Investment Trusts.
Ich kaufe einen Investment Trust bei Rakuten Securities. Wenn Sie im oberen Menü zu "Account Management> Investment Trusts> Investment Trusts After" gehen, können Sie den Übergang des gesamten Investment Trust einschließlich aller stornierten Emissionen sehen. Wenn es sich nur um den Übergang handelt, können Sie ihn auf diesem Bildschirm vollständig überprüfen. Wir erfassen die Rohdaten jedoch zur weiteren Analyse.
Klicken Sie mit der rechten Maustaste auf den Bildschirm, um die Seitenquelle anzuzeigen. Dann gibt es unten (ab der 1649. Zeile) solche Arrays "Daten1, Daten2, Daten3, Daten4", also kopieren Sie sie.
Sie können es auch in den Entwicklertools überprüfen, damit Sie es nach Ihren Wünschen erhalten.
Starten Sie Google Colaboratory und versuchen Sie, das zweidimensionale Array vorerst so zu behandeln, wie es ist.
#Es ist eigentlich länger.
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]]
Alle Längen waren 488. (Es kommt auf die Person an.)
len(data1), len(data2), len(data3), len(data4)
# => (488, 488, 488, 488)
Machen Sie es zu einem Pandas Dataframe. Ursprünglich war es ein zweidimensionales Array von JavaScript, aber da die Form des Arrays in Python dieselbe ist, können Sie das kopierte Array wie bei "Pandas" lesen. Von hier aus werden Daten1 extrahiert und angezeigt.
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 |
... | ... | ... |
Die erste Spalte sieht aus wie ein Zeitstempel, scheint jedoch keinen Dezimalpunkt zu haben. Teilen Sie durch 1000, um die Ziffern auszurichten, zu indizieren und dann in Datetime zu konvertieren.
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 |
Die Daten der letzten zwei Jahre werden angezeigt. Da es sich um einen "Übergang des gesamten Investment Trusts einschließlich aller annullierten Aktien" handelt, kann der Erwerbszeitraum von Person zu Person variieren.
Lassen Sie uns diese Daten1 vorerst mit matplotlib
visualisieren.
import matplotlib.pyplot as plt
df1.plot()
plt.show()
Hier sind die Ergebnisse.
Wenn Sie es mit dem Bildschirm von Rakuten Securities '' Investment Trust Ashiato '' vergleichen, können Sie sehen, dass data1 die Gesamtrendite ist. Der seit Januar 2019 angesammelte Gewinn von rund 140.000 Yen ist aufgrund des Einflusses des Koronavirus augenblicklich verschwunden.
Versuchen Sie, den Rest von data2 ~ 3 auf die gleiche Weise zu zeichnen.
Anscheinend entsprechen die von der Quelle der Rakuten Securities-Seite erhaltenen Daten1 ~ 4 den folgenden Elementen in der angegebenen Reihenfolge.
Danach wurde es zur Vereinfachung der Handhabung in einem Datenrahmen zusammengefasst, und die Spaltennamen wurden geändert, um dem Inhalt zu entsprechen. (Diesmal ausgeschlossen, da ich keine Investment Trusts mit Ausschüttungen gekauft habe.) Ich habe auch die ersten sechs Monate ausgeschlossen, die größtenteils ruhten.
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 |
... | ... | ... | ... |
Ich persönlich mag die Atmosphäre wie die Farbe von Plotly, deshalb werde ich versuchen, sie mit Plotly zu visualisieren.
pip install plotly
Lassen Sie uns zunächst den Bildschirm von Rakuten Securities reproduzieren.
import plotly.graph_objects as go
data = [
go.Scatter(x=df.index, y=df['return'], name='Gesamtrendite'),
]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title='Zeit',
type='date',
tickformat="%Y-%m",
dtick='M1',
tickangle=90,
showgrid=False
),
yaxis = dict(
title = 'Geldbetrag'
),
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='Bewertung'),
go.Scatter(x=df.index, y=df['invest'], name='Anlagebetrag')
]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title='Zeit',
type='date',
tickformat="%Y-%m",
dtick='M1',
tickangle=90,
showgrid=False
),
yaxis = dict(
title = 'Geldbetrag'
),
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='Werktagesunterschied vor Rückgabe', line = dict(color='purple'))
]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title='Zeit',
type='date',
tickformat="%Y-%m",
dtick='M1',
tickangle=90,
showgrid=False
),
yaxis = dict(
title = 'Geldbetrag',
),
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()
Wenn sich der Investitionsbetrag im Vergleich zum absoluten Wert erhöht, steigt natürlich auch die Änderung der Rendite. Schauen wir uns also das Verhältnis zum Bewertungsbetrag zu diesem Zeitpunkt an.
df['return_change_ratio'] = df['return'].diff() / df['value']
df
data = [
go.Scatter(x=df.index, y=df['return_change_ratio'], name='Änderungsrate an Werktagen vor der Rücksendung', line = dict(color='purple'))
]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title='Zeit',
type='date',
tickformat="%Y-%m",
dtick='M1',
tickangle=90,
showgrid=False
),
yaxis = dict(
title = 'Änderungsrate',
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()
Wenn Sie sich das ansehen, können Sie sehen, dass der Tag, an dem die Vermögenswerte an einem Tag um ± 5% schwanken, regelmäßig kommt.
Ich habe die Daten in absteigender Reihenfolge der Abnahmerate angeordnet.
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 |
Es wird angenommen, dass der 1., 2., 4., 7. und 9. von oben auf den Koronaschock zurückzuführen ist, der die Hälfte der 10 Tage ausmachte.
Im Gegenteil, ich habe sie in absteigender Reihenfolge der Zunahme angeordnet.
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 |
Der erste und dritte sind wahrscheinlich die Auswirkungen des Koronaschocks. Es scheint, dass die Steigerungsrate pro Tag auch den höchsten Stand in meiner Investitionsgeschichte erreicht hat.
data = [go.Histogram(x=df['return_change_ratio'], xbins=dict(size=0.001))]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title="Änderungsrate",
dtick=0.01,
range=[-0.06, 0.06],
tickformat='%'
),
yaxis = dict(
title="Frequenz"
)
)
fig = go.Figure(
data=data,
layout=layout
)
fig.show()
Zwei der drei Ausreißer der Frequenz 1 am rechten Saum und die erste, zweite, vierte, siebte und neunte der zehn aufeinanderfolgenden Frequenzen 1 am linken Saum stammen vom Koronaschock.
Ich habe monatlich mit OHLC ein Resampling durchgeführt, die Differenz zwischen Öffnen und Schließen ermittelt und die Änderung der monatlichen Rendite untersucht. (Gibt es einen einfacheren Weg, dies zu tun?)
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='Monatliche Rückkehr', marker_color ='orange')
]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title='Zeit',
tickformat="%Y-%m",
dtick='M1',
tickangle=90,
showgrid=False
),
yaxis = dict(
title = 'Geldbetrag',
),
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()
Als ich erneut mit Pandas abgetastet habe, wurde das letzte Datum in diesem Zeitraum zu einem Index, und es stimmte nicht mit der Plotbezeichnung überein, sodass ich daraus eine Zeichenkette machte.
Zusätzlich zu den täglichen Einsparungen kaufen und verkaufen wir unregelmäßig. Wenn Sie also die monatliche Rendite streng berechnen möchten, müssen Sie berücksichtigen, wie viel Sie an welchem Tag des Monats gekauft und verkauft haben. Hier habe ich jedoch einfach die Renditequote basierend auf dem Durchschnittswert des Investitionsbetrags für den Monat berechnet.
Die meisten von ihnen sind jedoch festverzinsliche Reserveinvestitionen, daher sollte es keinen großen Unterschied zu diesem einfachen Ergebnis geben. (Es ist möglich, nur mit den diesmal vorbereiteten Daten genau zu berechnen.)
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 |
(Die Differenz der monatlichen Renditen kann mit der Agg-Funktion ohne OHLC berechnet werden.)
data = [
go.Bar(x=df_month.index.strftime('%Y-%m'), y=df_month['interest'], name='Monatlicher Ertrag', marker_color ='pink')
]
layout = go.Layout(
width=800,
height=450,
xaxis = dict(
title='Zeit',
tickformat="%Y-%m",
dtick='M1',
tickangle=90,
showgrid=False
),
yaxis = dict(
title='Ausbeute',
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()
Im Februar 2020, als sich das Koronavirus weltweit zu verbreiten begann, lag die Anlagerendite bei -7,78%. Es gibt immer noch keine Anzeichen für eine Konvergenz, und es wird erwartet, dass die Auswirkungen auf die Wirtschaft ernsthaft beginnen. Daher achten wir genau auf zukünftige Trends.
Die schlechteste monatliche Anlagerendite lag im Dezember 2018 bei -10,45%. Ende des Jahres gab es übrigens einen Absturz.
Da es ad hoc visualisiert wurde, kann es sich um eine fehlgeleitete Ansicht oder einen Fehler handeln. In diesem Fall würde ich mich freuen, wenn Sie uns einen kurzen Kommentar geben könnten.
Wenn Sie über diese Daten verfügen, schlagen Sie bitte Meinungen oder Ratschläge vor, die für eine solche Analyse interessant wären. Vielen Dank. Danke, dass du bis zum Ende zugesehen hast.
Recommended Posts