Da die Aktie aufgrund des Einflusses des neuen Corona-Virus eingebrochen ist, habe ich versucht, die Performance meines Investment Trusts mit Python zu visualisieren.

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.

Datensammlung

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. スクリーンショット 2020-03-05 22.04.33.png

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.

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

Sie können es auch in den Entwicklertools überprüfen, damit Sie es nach Ihren Wünschen erhalten.

Überprüfen Sie die Daten mit Google Colaboratory

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. total_return.png

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. datas.png

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
... ... ... ...

Machen Sie diese Art der Visualisierung mit Plotly.

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.

Gesamtrendite

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()

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

Bewertung und reale Investition

Der Code ist fast derselbe, also reduzieren Sie (zum Vergrößern klicken)
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()

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

Differenz / Änderungsrate des Geschäftstages vor der Rückgabe

df_diff = df.diff()
Der Code ist fast derselbe, also reduzieren Sie (zum Vergrößern klicken)
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()

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

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
Der Code ist fast derselbe, also reduzieren Sie (zum Vergrößern klicken)
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()

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

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.

Änderungsratenhistogramm

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()

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

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.

Monatliche Rückkehr

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
Der Code ist fast derselbe, also reduzieren Sie (zum Vergrößern klicken)

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

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.

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

Monatliche Anlagerendite

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.)

Der Code ist fast derselbe, also reduzieren Sie (zum Vergrößern klicken)
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()

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

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.

Ende

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

Da die Aktie aufgrund des Einflusses des neuen Corona-Virus eingebrochen ist, habe ich versucht, die Performance meines Investment Trusts mit Python zu visualisieren.
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
[Python] Ich habe versucht, das Preisgeld von "ONE PIECE" über 100 Millionen Zeichen mit matplotlib zu visualisieren.
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Da es der 20. Jahrestag der Gründung ist, habe ich versucht, die Texte von Parfüm mit Word Cloud zu visualisieren
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
[Erste Datenwissenschaft ⑥] Ich habe versucht, den Marktpreis von Restaurants in Tokio zu visualisieren
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich habe versucht, die Anzahl der Todesfälle pro Kopf von COVID-19 (neues Koronavirus) nach Ländern zu tabellieren
Ich habe die Strategie des Aktiensystemhandels mit Python evaluiert.
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
[Python] Der Status jeder Präfektur des neuen Koronavirus wird nur als PDF veröffentlicht, aber ich habe versucht, ihn zu kratzen, ohne ihn herunterzuladen.
Ich habe versucht herauszufinden, wie ich den Arbeitsablauf mit Excel × Python, meiner Artikelzusammenfassung ★, optimieren kann
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services mit Python zu überprüfen. # 1
Aktienkurs mit "neuer Corona" gesunken? Ich habe versucht, den durchschnittlichen Aktienkurs von Nikkei durch Web-Scraping zu ermitteln
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services in Python zu überprüfen. # 2
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Ich habe versucht, die erste Frage der Mathematik-Aufnahmeprüfung 2019 der Universität Tokio mit Python Sympy zu lösen
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, Boeing die Geigenleistung durch Posenschätzung vorzustellen
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Ich habe versucht, die Liste der Drehzahlen des SSH-Anmeldeziels mit Python + openpyxl in einer Excel-Tabelle auszugeben.
Hat die Anzahl der Ladenschließungen aufgrund des Einflusses des neuen Koronavirus zugenommen?
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren