[PYTHON] Erfolgreiche Investition: Handelswissenschaft

Einführung

Investieren Sie alle sofort? Wenn ja, welche Art von Investition tätigen Sie?

Es gibt verschiedene Anlageziele auf der Welt und es gibt verschiedene Anlagemethoden. Informationen über Investitionen sind weltweit reichlich vorhanden. Es ist vielleicht besser zu sagen, dass es überflutet. Am Beispiel von Büchern gibt es eine Reihe leichter Einführungsbücher, die Investitionen mit süßen Worten in spezialisierte Finanzbücher fördern. Blogs und SNS sind ebenfalls wichtige Informationsquellen, und es scheint, dass YouTube für Investitionen heutzutage ebenfalls an Beliebtheit gewinnt.

Trotz der Vielzahl von Informationsquellen kann nur eine Handvoll erfolgreich investieren. Es ist ein bisschen altmodisch, aber laut Nomura Securities 'Einzelinvestor-Research im Jahr 2015 beträgt der Prozentsatz der Einzelinvestoren, die einen Gesamtgewinn erzielen, 9,3%. Warum geraten Sie in eine solche Situation? Lassen Sie mich einige Beispiele für den Ansatz geben, den Anfänger im Investmentbereich verfolgen.

――Springen Sie zum steigenden Preis trendiger Themenaktien und holen Sie sich den hohen Preis

Einige Menschen können enttäuscht sein, den nicht realisierten Verlust jedes Mal zu sehen, wenn die Mittagspause der Arbeitszeit kommt, weil sie eine solche Methode schluckend handeln. Warum landen wir wieder in dieser Situation? Das liegt daran, dass ** Anfänger überhaupt nicht wissen, welche Handelsstile von Natur aus überlegen sind **.

Zweck dieses Artikels

In diesem Artikel habe ich bedacht, dass dies der Investitionssicht von Anfängern sowohl beim Kaninchen als auch in der Ecke ein völlig neues Bewusstsein verleihen wird. Handel ist Wissenschaft. Wissenschaftlicher Handel ist mit anderen Worten quantitativer und empirischer Handel.

In diesem Artikel zeigen wir Ihnen, welche Handelsstile auf der Grundlage statistischer Überlegungen dominieren. In dem Artikel habe ich Begriffe ausgewählt, die so einfach wie möglich zu verstehen sind, damit Anfänger sie leicht lesen können, und ich habe versucht, schwierige Formeln und technische Überlegungen so weit wie möglich wegzulassen.

Außerdem lernen Sie spezifische Techniken, um den wissenschaftlichen Handel in die Praxis umzusetzen. Die Programmierung ist für den quantitativen und empirischen Handel unerlässlich. In diesem Artikel habe ich ein Programm geschrieben, um die minimal erforderliche Überprüfung in der Sprache Python durchzuführen. Viele Leute werden es als Programmierung betrachten, aber es ist eine gute Idee, diese Gelegenheit zu nutzen, um mit dem Studium zu beginnen. Das Arbeiten mit Sinn ist der schnellste Weg, um sich zu verbessern.

Anlageperformance des Schriftstellers

Zu Beginn des Artikels möchte ich die bisherige Wertentwicklung meiner Investition vorstellen. Plötzlich denken Sie vielleicht, es sei hässlich, über das Geld zu sprechen, das Sie verdient haben, aber es ist nicht überzeugend, jemandem etwas zu sagen, der keine Ergebnisse erzielt hat. Eine Sache, die hinzugefügt werden muss, ist, dass das wichtigste beim Investieren das Prozessmanagement ist, nicht die Ergebnisse. Dies liegt daran, dass, wie wir später sehen werden, die Anlageperformance in hohem Maße vom Glück abhängt und Entscheidungen, die ausschließlich auf Ergebnissen beruhen, häufig zu falschen Schlussfolgerungen führen.

Ursprünglich habe ich neben einem professionellen Ingenieur investiert, aber 2014 habe ich mit dem umfassenden Asset Management begonnen. Der Startup-Fonds betrug zu dieser Zeit 50 Millionen Yen. Im Jahr 2016 haben wir das Betriebssystem entwickelt, das derzeit die Hauptstütze darstellt. Dieses Betriebssystem ist unser Flaggschiff, das seit Inbetriebnahme bis heute rund 140 Millionen Yen verdient hat. Die Investition zielt auf große Aktien ab, die als TOPIX500 japanischer Aktien bezeichnet werden, und die durchschnittliche Rendite der letzten vier Jahre lag bei rund 40%. 02.png

Problemdarstellung

Jetzt werde ich erklären, warum der eingangs erwähnte Anfängeransatz nicht erfolgreich sein kann und was das Problem ist. Erfolg bedeutet hier, die gewünschte Rendite kontinuierlich und stabil ohne Rückschläge während des Investitionszeitraums von mindestens 5 Jahren zu erzielen.

Lassen Sie uns zunächst überlegen, ob die Methode am Anfang einen Gewinn bringt oder nicht. Erwägen Sie beispielsweise, in eine Aktie zu investieren, die als billig und von hoher Qualität gilt. Bei der Auswahl einzelner Aktien werden Sie höchstwahrscheinlich Tools von Wertpapierfirmen verwenden, um nach Aktien zu suchen. Werfen wir einen Blick auf die Wertentwicklung, wenn Sie einen Monat lang in eine Aktie mit einem PER von 10 oder weniger und einem ROE von 10% oder mehr investieren.

Der Aggregationszeitraum reicht von April 2017 bis Oktober 2020, und der Gewinn wird erzielt, wenn die gescreenten Aktien zu Monatsbeginn gekauft werden (genauer gesagt zum Schlusskurs des Vormonats gekauft) und zum Schlusskurs des Monatsendes abgerechnet werden. Es ist eine Verbreitungskarte (Diaphragma). Zu diesem Zeitpunkt wird die Marktrendite von der Rendite der einzelnen Aktien abgezogen. Wenn Sie dies nicht tun, werden Sie vom starken Anstieg des Nikkei-Durchschnitts betroffen sein, und Sie können nicht unterscheiden, ob die von Ihnen erzielten Gewinne von Ihren Fähigkeiten zur Aktienauswahl abhängen oder ob Sie das Glück haben, vom Anstieg des Marktes zu profitieren. value_hist3.png

Ist diese Anlagemethode rentabel?

Zusammenfassend kann es rentabel sein oder nicht. Die Aktie, in die Sie investiert haben, befindet sich möglicherweise ganz rechts (dh in der Aktie, die einen Gewinn erzielt hat) in der oben gezeigten Ausschüttung. Es kann auch der am weitesten links stehende Teil der Verteilung sein (dh die Aktie, die Geld verloren hat). Alle in der oben gezeigten Verteilung enthaltenen Bestände sind nach Ihren Maßstäben "billige und qualitativ hochwertige" Bestände. Es ist nicht die Tatsache, dass "billig und von hoher Qualität" den endgültigen Gewinn oder Verlust daraus bestimmt, aber es kann gesagt werden, dass es Ihr sogenannter Fingersatz ist, der die Marke unter den vielen Zielmarken zu dieser Zeit aufgegriffen hat. Ich werde. Zum Beispiel mochte ich zufällig den Namen des Unternehmens, er erschien oben auf dem Screening, ich las eine Zeitschrift und dachte plötzlich daran, zu investieren, oder so etwas. Machen wir das.

Investition ist wie Gacha

Das Ergebnis Ihrer Investition hängt von Ihrem Glück ab. Vielmehr wird es hauptsächlich durch Glück bestimmt. Das Glück bedeutet hier die Wahrscheinlichkeitsverteilung wie in der obigen Abbildung gezeigt. Wie Sie dem obigen Beispiel entnehmen können, können Sie niemals beurteilen, ob die Investition selbst erfolgreich war, wenn Sie sich nur auf das Ergebnis der Investition konzentrieren. Es macht keinen Sinn, ob das Ergebnis Ihres Handels ein Produkt Ihrer eigenen Fähigkeiten oder ein Zufall ist.

Die Unfähigkeit, die Ergebnisse auf diese Weise richtig zu beurteilen, bedeutet, dass wir nicht wissen, ob wir uns auf die Methode verlassen können. Mit anderen Worten, es ist nicht möglich, den Prozess der Verbesserung des Geschäfts zu durchlaufen. Bei einem Ansatz wie dem am Anfang fehlt die Idee, den Verbesserungsprozess umzukehren. Um den Verbesserungsprozess durchführen zu können, benötigen wir einen Mechanismus, um quantitative Ergebnisse in kurzer Zeit zu erhalten.

Wenn Sie den Verbesserungsprozess nicht durchlaufen können, werden sich Ihre Anlagefähigkeiten in Zukunft nie verbessern. Dies ist dasselbe wie das Drehen einer Gacha, deren Inhalt unbekannt ist. Sie wiederholen nur den kargen Akt, mehrmals im Jahr ein paar Gachas aus der oben genannten Emissionsverteilung herauszuziehen, sich zu freuen, wenn die Ergebnisse gut sind, und zu entmutigen, wenn die Ergebnisse schlecht sind.

Lösung

Gibt es also eine Möglichkeit, diese Gacha einzufangen? Die Antwort lautet natürlich "JA".

Die Natur des Gacha-Standes

Es gibt gute und schlechte Dinge im Gacha-Stand. Ein Tisch mit vielen Treffern ist ein guter Tisch, und ein Tisch mit nur Schrott ist ein schlechter Tisch. Wie sieht es aus, wenn man diese Plattformen im Hinblick auf die Emissionsverteilung betrachtet? Hier sind drei Beispiele: sample_hist.png

Wie wäre es zunächst mit dem Stand ganz links? Das Zentrum der Emissionsverteilung dieser Plattform ist fast 0. Das heißt, der erwartete Wert dieses Standes ist 0. Egal wie viel Sie Gacha auf dieser Plattform zeichnen, Ihr Vermögen wird nicht wachsen. Selbst wenn Sie einen vorübergehenden Gewinn erzielen, kommt es nur vor, dass Ihre Leistung eine Outperformance erzielt. Auf lange Sicht wird der durchschnittliche Gewinn und Verlust immer gegen Null gehen.

Wie wäre es dann mit der mittleren Plattform? Wenn Sie sich die Emissionsverteilung dieser Plattform genau ansehen, können Sie feststellen, dass sie sich leicht nach rechts verschoben hat (Plus-Seite). Dies ist der Zustand, in dem der erwartete Wert positiv ist. Im Handel verwenden wir Ausdrücke wie "einen Vorteil haben" und "Alpha haben (übermäßiges Einkommen)". Indem Sie die Gacha weiter ziehen, können Sie Ihr Vermögen auf dieser Plattform erweitern. Das Auf und Ab der Vermögenswerte auf dem Weg ist jedoch volatil, und Sie können auf halbem Weg anhalten.

Schließlich ist es der am weitesten rechts stehende Stand. Die Emissionsverteilung dieser Plattform ist ähnlich wie bei der Plattform in der Mitte leicht nach rechts verschoben. Und wenn Sie genauer hinschauen, können Sie sehen, dass die Variation (Ausbreitung von der Mitte) im Vergleich zur Plattform in der Mitte in einem kleinen Bereich liegt. Der erwartete Wert ist positiv und die Abweichung ist gering, dh es handelt sich um eine Plattform mit einem hohen "scharfen Verhältnis". Sie können einen solchen Gacha-Ständer finden, und wenn Sie ihn weiter ziehen, wird Ihr Erfolg solide sein.

Wie auch immer, drehen Sie die Gacha viele Male weiter

Es ist nicht möglich, die Tendenz zu erfassen, wie der Inhalt des Gacha-Ständers aussieht, indem man ein- oder zweimal an der Gacha zieht. Wenn Sie also die Tendenz des Inhalts wirklich erfassen möchten, müssen Sie ihn immer wieder umdrehen. Das Wichtigste dabei ist, immer nur eine Gacha zu drehen, ohne sich zur Seite zu drehen. Sie können die Tendenz nicht erfassen, selbst wenn es ein Leben lang dauert, indem Sie sie zur Hälfte ziehen und zu dieser Gacha wechseln, da diese Gacha anscheinend nicht viele Treffer erhält.

Mit anderen Worten, beim Handel müssen Sie den Handel konsequent fortsetzen, basierend auf nur einer Methode. Das reicht 10 mal oder 100 mal nicht aus. Es muss viele Male gemacht werden, mehr als 1000 Mal. Wechseln Sie nicht von einer zur nächsten zu Anlagemethoden wie Zeitschriften. Der einzige Weg, um die Unsicherheit von Investitionen zu bekämpfen, besteht darin, Versuche zu verdienen. Die einzige Waffe, die wir haben, ist das Gesetz der Mehrheit.

Daher ist ** eine dominante Handelsstrategie eine „überschaubare“ Strategie **. Diejenigen mit einer monatlichen Spanne oder mehr sind nicht für den Handel mit einzelnen Anlegern geeignet. Zumindest sollte der Handel täglich erfolgen. Das Beste davon ist Scalping. Je kürzer die Handelsperiode ist, desto weniger unsicher ist die Preisbewegung und desto leichter ist es, den Trend zu erfassen (insbesondere ist die Investitionsunsicherheit proportional zur Quadratwurzel der Investitionsperiode).

Wenn Sie weiter an der Gacha ziehen, wird Ihnen das Geld ausgehen

Selbstverständlich benötigen Sie jedoch Geld, um eine Gacha zu zeichnen. Je mehr Sie ziehen, desto mehr Geld verschwindet aus Ihrer Brieftasche. Dies gilt auch für den Handel. Im Handel kostet eine Transaktion immer Geld. Wenn es sich um eine Aktie handelt, zahlen Sie beim Kauf der Aktie die Gebühr und den Kreditzinssatz. Wenn es sich um FX handelt, zahlen Sie den Spread in einem Trade an den Händler. Wenn Sie viele Male handeln, wird Ihr Geld in kürzester Zeit ausgehen.

Es lohnt sich ehrlich gesagt überhaupt nicht, die Tendenz des Inhalts der Gacha beim Werfen von lebenden Kugeln abzuschätzen. Anstatt dies zu tun, gibt es eine Möglichkeit, einen guten Gacha-Stand im Voraus zu erreichen.

Schätzen Sie den Inhalt des Gacha-Standes im Voraus anhand der Daten

In der Investmentwelt können wir einige der Daten sammeln, die auf dem Gacha-Stand vorverwendet werden. Und Sie können diese Daten verwenden, um zu überprüfen, welche Art von Gacha-Stand gut ist, dh auf welche Art von Handelsstrategie Sie setzen sollten, bevor Sie Gacha ziehen. Dies ist eine Handelsmethode, die als quantitativ und empirisch bezeichnet wird. Die Datenanalyse wird verwendet, um den erwarteten Wert zu ermitteln, mit dem die Transaktionskosten überwunden werden können.

Die Forschung zum quantitativen und empirischen Handel wird seit vielen Jahren durchgeführt. Besonders in jüngster Zeit gibt es viele Fälle, in denen maschinelles Lernen dafür eingesetzt wird. Maschinelles Lernen ist nicht nur sehr nützlich, um die statistische Signifikanz von Daten zu bestätigen, sondern auch, um verborgene Marktmerkmale zu extrahieren, die niemand kennt. Die Programmierbibliothek ist umfangreich und APIs zum Herunterladen von Daten werden entwickelt. Auch einzelne Anleger können die Daten vollständig analysieren.

Und zum Betrieb

Im tatsächlichen Betrieb ist es notwendig, die Bedingungen so weit wie möglich auf der Grundlage des Überprüfungsergebnisses festzulegen und den Handel mechanisch durchzuführen. Setzen Sie keine menschlichen Gefühle ein. Und wenn Sie viele Trades mechanisch wiederholen, gibt es keinen Grund, dies nicht zu automatisieren. Ein solcher Handelsstil wird auch kollektiv als "Systemhandel" bezeichnet.

In der Praxis besteht ein erfolgreicher Investitionsansatz darin, den Verbesserungsprozess zu durchlaufen und gleichzeitig die Vorverifizierung (dh das Backtesting) mit der tatsächlichen Betriebsleistung zu vergleichen. Für diejenigen, die noch nie eine Datenanalyse durchgeführt haben, zeigen die folgenden Kapitel, wie Sie Daten mit Python analysieren.

Vorbereitung auf den quantitativen und empirischen Handel

Lassen Sie uns nun zuerst die Daten sammeln. Die Daten werden mithilfe der Yahoo Finance-API erfasst. Zu diesem Zeitpunkt wird eine Bibliothek namens yfinance verwendet. Installieren Sie sie daher zuerst. Weitere Informationen zu yfinance finden Sie unter hier.

pip install yfinance

(Ergänzung) Über den Fehler von yfinance Es gibt einen Fehler in yfinance, dass Sie standardmäßig keine Finanzdaten abrufen können. Sie können es erhalten, indem Sie die Datei yfinance base.py wie folgt ändern.

# base.py In der Nähe der Linie 353
# get fundamentals
# data = utils.get_json(url+'/financials', proxy)← Standardprogramm. Maske
url = "{}/{}/financials".format(self._scrape_url, self.ticker)   #hinzufügen
data = utils.get_json(url, proxy)                                #hinzufügen

Preishistorische Daten

Laden wir zunächst die Kursdaten für die Aktien an der japanischen Börse herunter.

Durch Ausführen des folgenden Codes können Sie die historischen Daten des 7203 Toyota Motor sofort abrufen. Da das Tickersymbol einer Aktie auf dem japanischen Markt durch den Wertpapiercode + ".T" dargestellt wird, können Sie die Daten fast aller Aktien problemlos abrufen, ohne das Symbol von Yahoo Finance nachschlagen zu müssen.

import yfinance as yf

ticker = yf.Ticker("7203.T")
hist = ticker.history(period="max")
print(hist)


Ausführungsbildschirm

               Open     High      Low    Close    Volume  Dividends  Stock Splits
Date
1999-05-06  2259.74  2337.44  2233.84  2337.44   3115000        0.0             0
1999-05-07  2324.49  2330.96  2233.84  2253.27   3033000        0.0             0
1999-05-10  2253.27  2279.16  2233.84  2246.79   1261000        0.0             0
1999-05-11  2266.22  2279.17  2227.37  2227.37   1686000        0.0             0
1999-05-12  2227.37  2266.21  2227.37  2266.21   2596000        0.0             0
...             ...      ...      ...      ...       ...        ...           ...
2020-11-02  6866.00  7016.00  6850.00  6949.00   5721200        0.0             0
2020-11-04  7024.00  7054.00  6976.00  6976.00   6278100        0.0             0
2020-11-05  6955.00  7032.00  6923.00  6984.00   5643400        0.0             0
2020-11-06  7070.00  7152.00  7015.00  7019.00  11092900        0.0             0
2020-11-09  7159.00  7242.00  7119.00  7173.00   7838600        0.0             0

[5324 rows x 7 columns]

Gewinn-und Verlustrechnung

Schauen wir uns als nächstes die Finanzdaten an. Zunächst aus der Gewinn- und Verlustrechnung.

Die Gewinn- und Verlustrechnung der letzten 3 Jahre können Sie dem folgenden Code entnehmen. Die wichtigsten davon sind der Gesamtumsatz (Umsatz), das Betriebsergebnis (Betriebsergebnis) und das Nettoergebnis (Nettoergebnis).

financials = ticker.financials
print(financials)


Ausführungsbildschirm

                                         2020-03-31   2019-03-31   2018-03-31   2017-03-31
Research Development                           None         None         None         None
Effect Of Accounting Charges                   None         None         None         None
Income Before Tax                       2.82576e+12  2.64553e+12  3.09051e+12  2.55588e+12
Minority Interest                       6.77064e+11  7.18985e+11   6.9412e+11  6.68264e+11
Net Income                              2.07618e+12  1.88287e+12  2.49398e+12  1.83111e+12
Selling General Administrative          2.97317e+12   2.9867e+12   3.0905e+12  2.86848e+12
Gross Profit                            5.40763e+12   5.4439e+12  5.49036e+12  4.86286e+12
Ebit                                    2.43446e+12   2.4572e+12  2.39986e+12  1.99437e+12
Operating Income                        2.43446e+12   2.4572e+12  2.39986e+12  1.99437e+12
Other Operating Expenses                       None         None         None         None
Interest Expense                        -3.2217e+10  -2.8078e+10  -2.7586e+10  -2.9353e+10
Extraordinary Items                            None         None         None         None
Non Recurring                                  None         None         None         None
Other Items                                    None         None         None         None
Income Tax Expense                       6.8343e+11  6.59944e+11  5.04406e+11    6.289e+11
Total Revenue                             2.993e+13  3.02257e+13  2.93795e+13  2.75972e+13
Total Operating Expenses                2.74955e+13  2.77685e+13  2.69796e+13  2.56028e+13
Cost Of Revenue                         2.45224e+13  2.47818e+13  2.38892e+13  2.27343e+13
Total Other Income Expense Net          3.91297e+11   1.8833e+11   6.9065e+11  5.61513e+11
Discontinued Operations                        None         None         None         None
Net Income From Continuing Ops          2.14233e+12  1.98559e+12  2.58611e+12  1.92698e+12
Net Income Applicable To Common Shares   2.0589e+12  1.86808e+12  2.48169e+12  1.82131e+12

Bilanz (Bilanz)

Als nächstes kommt die Bilanz.

Sie können die Bilanz der letzten 3 Jahre aus dem folgenden Code abrufen. Von diesen sind die wichtigsten Vermögenswerte das Gesamtvermögen, das Gesamtvermögen und das gesamte Eigenkapital.

balance_sheet = ticker.balance_sheet
print(balance_sheet)


Ausführungsbildschirm

                                    2020-03-31    2019-03-31    2018-03-31    2017-03-31
Capital Surplus                   4.893340e+11  4.871620e+11  4.875020e+11  4.840130e+11
Total Liab                        3.194275e+13  3.186981e+13  3.087815e+13  3.056711e+13
Total Stockholder Equity          2.006062e+13  1.934815e+13  1.873598e+13  1.751481e+13
Minority Interest                 6.770640e+11  7.189850e+11  6.941200e+11  6.682640e+11
Other Current Liab                4.102642e+12  4.479344e+12  4.399669e+12  3.979935e+12
Total Assets                      5.268044e+13  5.193695e+13  5.030825e+13  4.875019e+13
Common Stock                      3.970500e+11  3.970500e+11  3.970500e+11  3.970500e+11
Other Current Assets              2.469880e+11  1.425310e+11  2.022920e+11  1.235700e+10
Retained Earnings                 2.342761e+13  2.198752e+13  1.947346e+13  1.760107e+13
Other Liab                        2.746823e+12  2.887743e+12  2.902003e+12  3.163780e+12
Treasury Stock                   -4.253379e+12 -3.523575e+12 -1.622034e+12 -9.673210e+11
Other Assets                      8.905140e+11  1.182809e+12  1.067759e+12  1.012639e+12
Cash                              2.774498e+12  2.790212e+12  2.390524e+12  2.257064e+12
Total Current Liabilities         1.790238e+13  1.822694e+13  1.779689e+13  1.731896e+13
Deferred Long Term Asset Charges  3.547850e+11  5.018720e+11  4.941200e+11  5.039850e+11
Short Long Term Debt              1.418710e+11  1.560380e+11  1.674550e+11  2.285990e+11
Other Stockholder Equity         -1.166273e+12 -9.166500e+11  4.356990e+11  6.409220e+11
Property Plant Equipment          1.087864e+13  1.068549e+13  1.026767e+13  1.019711e+13
Total Current Assets              1.864253e+13  1.887924e+13  1.815266e+13  1.783370e+13
Long Term Investments             1.184489e+13  1.090829e+13  1.133854e+13  1.069452e+13
Net Tangible Assets               2.006062e+13  1.934815e+13  1.873598e+13  1.751481e+13
Short Term Investments            1.477202e+12  2.234892e+12  2.447703e+12  2.522598e+12
Net Receivables                   2.659748e+12  2.940890e+12  2.708900e+12  2.552805e+12
Long Term Debt                    1.029678e+12  7.655860e+11  5.910860e+11  5.784750e+11
Inventory                         2.434918e+12  2.656396e+12  2.539789e+12  2.388617e+12
Accounts Payable                  2.434180e+12  2.645984e+12  2.586657e+12  2.566382e+12

Geldflussrechnung

Am Ende des Abschlusses steht die Kapitalflussrechnung.

Die Kapitalflussrechnung der letzten 3 Jahre können Sie dem folgenden Code entnehmen. Von diesen sind die wichtigsten Cashflows aus betrieblicher Tätigkeit, die gesamten Cashflows aus Finanzierungstätigkeiten und die gesamten Cashflows aus Investitionstätigkeit am wichtigsten.

cashflow = ticker.cashflow
print(cashflow)


Ausführungsbildschirm

                                             2020-03-31    2019-03-31    2018-03-31    2017-03-31
Investments                                2.334300e+11  6.166420e+11 -3.322730e+11  6.950000e+08
Change To Liabilities                     -7.641000e+10  9.488700e+10  4.664800e+10  1.459570e+11
Total Cashflows From Investing Activities -3.150861e+12 -2.697241e+12 -3.660092e+12 -2.969939e+12
Net Borrowings                             1.558199e+12  7.229710e+11  6.893390e+11  1.030929e+12
Total Cash From Financing Activities       3.971380e+11 -5.408390e+11 -4.491350e+11 -3.751650e+11
Change To Operating Activities            -2.703900e+11  4.084000e+11  4.857250e+11  7.724320e+11
Net Income                                 2.076183e+12  1.882873e+12  2.493983e+12  1.831109e+12
Change In Cash                             7.056750e+11  4.868760e+11  7.031300e+10  2.098980e+11
Repurchase Of Stock                       -4.761290e+11 -5.496370e+11 -4.478180e+11 -7.039860e+11
Effect Of Exchange Rate                   -1.312450e+11 -4.164100e+10 -4.358800e+10 -1.348600e+10
Total Cash From Operating Activities       3.590643e+12  3.766597e+12  4.223128e+12  3.568488e+12
Depreciation                               1.605383e+12  1.792375e+12  1.734033e+12  1.610950e+12
Dividends Paid                            -6.299870e+11 -6.448060e+11 -6.268920e+11 -6.381720e+11
Change To Inventory                       -1.140960e+11 -1.669020e+11 -1.711480e+11 -2.463260e+11
Change To Account Receivables              2.488950e+11 -2.468450e+11 -1.054350e+11 -2.647840e+11
Other Cashflows From Financing Activities -5.494500e+10 -6.936700e+10 -6.376400e+10 -6.393600e+10
Change To Netincome                        2.228170e+11  1.431380e+11 -4.994310e+11 -1.598180e+11
Capital Expenditures                      -3.595131e+12 -3.738887e+12 -3.598707e+12 -3.541437e+12

Bestandsübersicht

Schließlich, wie man eine Zusammenfassung der Bestände erhält.

Die grundlegenden Informationen zum Bestand erhalten Sie aus dem folgenden Code. Die wichtigsten davon sind MarketCap (Marktwert), SharingOutstanding (Anzahl der ausgegebenen Aktien), ForwardPE (Prognose PER), Dividendenrendite (Dividendenrendite), ProfitMargins (Nettogewinnquote) und mehr.

info = ticker.info
print(info)


Ausführungsbildschirm
Wird weggelassen, da es sich um einen Wörterbuchtyp handelt

Erwerb mehrerer Aktien

Wenn Sie mehrere Bestände gleichzeitig erhalten möchten, verwenden Sie die Tickers-Klasse und trennen Sie die Argumente durch ein Leerzeichen.

tickers = yf.Tickers("7203.T 9984.T 6861.T")
hists = []

for i in range(len(tickers.tickers)):
    hists.append(tickers.tickers[i].history())

print(hists[0])


Ausführungsbildschirm

              Open    High     Low   Close    Volume  Dividends  Stock Splits
Date
2020-10-09  7026.0  7029.0  6947.0  6967.0   3395900          0             0
2020-10-12  6932.0  6945.0  6900.0  6911.0   2638200          0             0
2020-10-13  6977.0  7030.0  6946.0  7030.0   3667700          0             0
2020-10-14  6962.0  6970.0  6919.0  6935.0   3065400          0             0
2020-10-15  6898.0  6933.0  6895.0  6915.0   2844800          0             0
2020-10-16  6940.0  6944.0  6825.0  6829.0   3770200          0             0
2020-10-19  6874.0  6948.0  6870.0  6945.0   3047000          0             0
2020-10-20  6926.0  6945.0  6889.0  6897.0   2342400          0             0
2020-10-21  6962.0  7052.0  6956.0  7009.0   4795000          0             0
2020-10-22  6967.0  6984.0  6941.0  6966.0   3207500          0             0
2020-10-23  7009.0  7010.0  6944.0  6973.0   3963300          0             0
2020-10-26  6970.0  7003.0  6955.0  6990.0   2675000          0             0
2020-10-27  6970.0  6993.0  6924.0  6961.0   3234300          0             0
2020-10-28  6888.0  6927.0  6845.0  6895.0   3760200          0             0
2020-10-29  6795.0  6924.0  6780.0  6893.0   4099900          0             0
2020-10-30  6848.0  6878.0  6803.0  6803.0   5207800          0             0
2020-11-02  6866.0  7016.0  6850.0  6949.0   5721200          0             0
2020-11-04  7024.0  7054.0  6976.0  6976.0   6278100          0             0
2020-11-05  6955.0  7032.0  6923.0  6984.0   5643400          0             0
2020-11-06  7070.0  7152.0  7015.0  7019.0  11092900          0             0
2020-11-09  7159.0  7242.0  7119.0  7173.0   7838600          0             0

Erfassung anderer Daten als des Aktienkurses (Börse)

Wenn Sie ein Ticker sind, der in Yahoo Finance vorhanden ist, können Sie Daten abrufen, auch wenn es sich nicht um eine Aktienemission handelt. Lassen Sie uns die Austauschdaten als Beispiel nehmen.

import pandas as pd

fxs = ["JPY=X", "EURUSD=X", "GBPUSD=X"]
tickers = yf.Tickers(" ".join(fxs))

closes = []
for i in range(len(tickers.tickers)):
    closes.append(tickers.tickers[i].history(period="max").Close)

df = pd.DataFrame(closes).T
df.columns = fxs

print(df)


Ausführungsergebnis

              JPY=X  EURUSD=X  GBPUSD=X
Date
1996-10-30  114.180       NaN       NaN
1996-11-01  113.500       NaN       NaN
1996-11-04  113.880       NaN       NaN
1996-11-05  114.250       NaN       NaN
1996-11-06  113.950       NaN       NaN
...             ...       ...       ...
2020-11-03  104.725    1.1643    1.2924
2020-11-04  104.546    1.1762    1.3122
2020-11-05  104.438    1.1733    1.2967
2020-11-06  103.603    1.1818    1.3139
2020-11-09  104.871    1.1910    1.3193

[6243 rows x 3 columns]

World Major Stock Index

Im Folgenden erfahren Sie, wie Sie die wichtigsten Aktienindizes der Welt erhalten. Es gibt andere Indikatoren als die hier aufgeführten. Wir empfehlen Ihnen, selbst bei Yahoo Finance danach zu suchen.

indices = ["^N225", "^DJI", "^GSPC", "^IXIC", "^GDAXI", "^FTSE", "^FCHI", "^HSI", "^SSEC", "^BVSP", "^KOSPI"]
#Unten weggelassen

Durchführung des quantitativen und empirischen Handels

Anschließend werden wir anhand des Programms erläutern, wie Sie die Rendite überprüfen können, wenn Sie in Aktien investieren, die als billig und von hoher Qualität angesehen werden (PER beträgt das 10-fache oder weniger, der ROE beträgt 10% oder mehr). Dies wurde in dem in diesem Artikel angesprochenen Problem erwähnt. Ich werde erklären. Die Programmierfähigkeit des Autors ist geringer als die der Schüler, daher denke ich, dass es einige unschöne Beschreibungen gibt. Wenn Sie Vorschläge zur Codierung haben, kommentieren Sie diese bitte.

Aktienliste lesen

Bereiten Sie zunächst die TSE-Markenliste im CSV-Format vor. Eine Liste der an der TSE gelisteten Aktien erhalten Sie unter hier. Wählen Sie daher die Aktien aus, die Sie überprüfen möchten. In diesem Beispiel haben wir TOPIX 500-Bestandteile ausgewählt, die in TOPIX relativ groß sind.

import datetime
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt

data = pd.read_csv("topix500.csv")
print(data)


Ausführungsbildschirm

     code
0    1332
1    1333
2    1414
3    1605
4    1721
..    ...
494  9962
495  9983
496  9984
497  9987
498  9989

[499 rows x 1 columns]

Ticker-Einstellungen

Stellen Sie den Ticker für yfinance ein. Der Nikkei-Durchschnitt, bei dem es sich um die Marktdaten handelt, wird zu den oben genannten Aktien addiert.

stocks = [str(s)+".T" for s in data.code]
stocks.append("^N225")
tickers = yf.Tickers(" ".join(stocks))

Erstellen eines Schlusspreisdatenrahmens

Holen Sie sich als Nächstes die historischen Daten der Preisreihen mit yfinance und fassen Sie die Schlusskursdaten im Datenrahmen zusammen.

closes   = [] #Schlusskurs

for i in range(len(tickers.tickers)):
    closes.append(tickers.tickers[i].history(period="max").Close)

closes = pd.DataFrame(closes).T   #DataFrame-Konvertierung
closes.columns = stocks           #Einstellung des Spaltennamens
closes = closes.ffill()           #Vervollständigung fehlender Daten

print(closes)


Ausführungsbildschirm

            1332.T  1333.T  1414.T  1605.T  1721.T  1801.T  ...  9962.T   9983.T  9984.T  9987.T  9989.T     ^N225
Date                                                        ...
1965-01-05     NaN     NaN     NaN     NaN     NaN     NaN  ...     NaN      NaN     NaN     NaN     NaN   1257.72
1965-01-06     NaN     NaN     NaN     NaN     NaN     NaN  ...     NaN      NaN     NaN     NaN     NaN   1263.99
1965-01-07     NaN     NaN     NaN     NaN     NaN     NaN  ...     NaN      NaN     NaN     NaN     NaN   1274.27
1965-01-08     NaN     NaN     NaN     NaN     NaN     NaN  ...     NaN      NaN     NaN     NaN     NaN   1286.43
1965-01-12     NaN     NaN     NaN     NaN     NaN     NaN  ...     NaN      NaN     NaN     NaN     NaN   1288.54
...            ...     ...     ...     ...     ...     ...  ...     ...      ...     ...     ...     ...       ...
2020-11-04   417.0  2240.0  5200.0   526.0  2789.0  3325.0  ...  3135.0  74380.0  6535.0  3865.0  3945.0  23695.23
2020-11-05   417.0  2211.0  5220.0   506.0  2782.0  3335.0  ...  3200.0  74400.0  6870.0  3965.0  4020.0  24105.28
2020-11-06   421.0  2219.0  5270.0   507.0  2826.0  3385.0  ...  3245.0  75480.0  6722.0  3785.0  4155.0  24325.23
2020-11-09   423.0  2252.0  5360.0   500.0  3010.0  3440.0  ...  3360.0  78310.0  7083.0  3770.0  4185.0  24839.84
2020-11-10   437.0  2319.0  5410.0   541.0  3040.0  3535.0  ...  3455.0  77910.0  6860.0  3865.0  4145.0  25108.21

[13862 rows x 500 columns]

Erstellen eines Nettoeinkommensdatenrahmens

Als nächstes werden die Abschlussdaten in einem Datenrahmen zusammengefasst. Erstens ist das Nettoeinkommen für die Berechnung von PER und ROE. Es scheint, dass der NAN-Wert hoch ist, da der Abrechnungszeitraum jeder Marke nicht aufeinander abgestimmt ist. Bitte seien Sie jedoch versichert, dass die Daten ordnungsgemäß in den erforderlichen Teilen enthalten sind.

earnings = [] #Nettoeinkommen

dummy = tickers.tickers[0].financials.T["Net Income"]
dummy[:] = np.nan

for i in range(len(tickers.tickers)):
    try:
        earnings.append(tickers.tickers[i].financials.T["Net Income"])
    except:
        earnings.append(dummy)       #Fügen Sie einen Dummy ein, wenn ein Fehler auftritt

earnings = pd.DataFrame(earnings).T  #DataFrame-Konvertierung
earnings.columns = stocks            #Einstellung des Spaltennamens

print(earnings)


Ausführungsbildschirm

            1332.T  1333.T        1414.T  1605.T  1721.T  1801.T  ...  9962.T        9983.T  9984.T  9987.T  9989.T  ^N225
                                                                  ...
2006-08-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2007-08-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2009-03-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2010-03-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2011-03-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
...            ...     ...           ...     ...     ...     ...  ...     ...           ...     ...     ...     ...    ...
2020-05-20     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2020-05-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2020-06-30     NaN     NaN  9.005000e+09     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2020-08-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN  9.035700e+10     NaN     NaN     NaN    NaN
2020-09-30     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN

[69 rows x 500 columns]

Erstellen eines Kapitaldatenrahmens

Als nächstes folgt das Kapital für die Berechnung des ROE.

equity   = [] #Reinvermögen

dummy = tickers.tickers[0].balance_sheet.T["Total Stockholder Equity"]
dummy[:] = np.nan

for i in range(len(tickers.tickers)):
    try:
        equity.append(tickers.tickers[i].balance_sheet.T["Total Stockholder Equity"])
    except:
        equity.append(dummy)         #Fügen Sie einen Dummy ein, wenn ein Fehler auftritt

equity = pd.DataFrame(equity).T      #DataFrame-Konvertierung
equity.columns = stocks              #Einstellung des Spaltennamens

print(equity)


Ausführungsbildschirm

            1332.T  1333.T        1414.T  1605.T  1721.T  1801.T  ...  9962.T        9983.T  9984.T  9987.T  9989.T  ^N225
                                                                  ...
2006-08-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2007-08-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2009-03-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2010-03-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2011-03-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
...            ...     ...           ...     ...     ...     ...  ...     ...           ...     ...     ...     ...    ...
2020-05-20     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2020-05-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2020-06-30     NaN     NaN  8.359900e+10     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN
2020-08-31     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN  9.565620e+11     NaN     NaN     NaN    NaN
2020-09-30     NaN     NaN           NaN     NaN     NaN     NaN  ...     NaN           NaN     NaN     NaN     NaN    NaN

[69 rows x 500 columns]

Erstellen eines Datenrahmens für ausgegebene Freigaben

Für die Berechnung des PER ist ein EPS (Gewinn pro Aktie) erforderlich. Erstellen Sie einen Datenrahmen für ausgegebene Aktien, um das EPS zu berechnen.

shares   = [] #Anzahl der ausgegebenen Aktien

for i in range(len(tickers.tickers)):
    try:
        shares.append(tickers.tickers[i].info["sharesOutstanding"])
    except:
        shares.append(np.nan)        #Geben Sie den NAN-Wert ein, wenn ein Fehler auftritt

shares = pd.Series(shares)           #Serie
shares.index = stocks                #Indexnameneinstellung

print(shares)


Ausführungsbildschirm

1332.T    3.111410e+08
1333.T    5.262460e+07
1414.T    5.382810e+07
1605.T    1.460200e+09
1721.T    1.260270e+08
              ...
9983.T    1.020820e+08
9984.T             NaN
9987.T    8.917480e+07
9989.T    1.169000e+08
^N225              NaN
Length: 500, dtype: float64

Erstellen von EPS- und ROE-Datenrahmen

Erstellen Sie EPS- und ROE-Datenrahmen aus Daten zu Nettogewinn, Eigenkapital und Anzahl der ausgegebenen Aktien.

eps = earnings/shares.values      # EPS
roe = earnings/equity             # ROE

eps = eps.ffill()                 #Vervollständigung fehlender Daten
roe = roe.ffill()

eps = eps.drop(["^N225"], axis=1) # ^Löschen Sie die Spalte N225
roe = roe.drop(["^N225"], axis=1)

print(eps)
print(roe)


Ausführungsbildschirm

               1332.T     1333.T      1414.T      1605.T  ...       9983.T  9984.T      9987.T      9989.T
                                                          ...
2006-08-31        NaN        NaN         NaN         NaN  ...          NaN     NaN         NaN         NaN
2007-08-31        NaN        NaN         NaN         NaN  ...          NaN     NaN         NaN         NaN
2009-03-31        NaN        NaN         NaN         NaN  ...          NaN     NaN         NaN         NaN
2010-03-31        NaN        NaN         NaN         NaN  ...          NaN     NaN         NaN         NaN
2011-03-31        NaN        NaN         NaN         NaN  ...          NaN     NaN         NaN         NaN
...               ...        ...         ...         ...  ...          ...     ...         ...         ...
2020-05-20  47.464013  238.23459  150.107472  107.557873  ...  1592.621618     NaN  316.378618  202.668948
2020-05-31  47.464013  238.23459  150.107472  107.557873  ...  1592.621618     NaN  316.378618  202.668948
2020-06-30  47.464013  238.23459  167.291805  107.557873  ...  1592.621618     NaN  316.378618  202.668948
2020-08-31  47.464013  238.23459  167.291805  107.557873  ...   885.141357     NaN  316.378618  202.668948
2020-09-30  47.464013  238.23459  167.291805  107.557873  ...   885.141357     NaN  316.378618  202.668948

[69 rows x 499 columns]

              1332.T    1333.T    1414.T   1605.T   1721.T  ...    9962.T    9983.T  9984.T    9987.T    9989.T
                                                            ...
2006-08-31       NaN       NaN       NaN      NaN      NaN  ...       NaN       NaN     NaN       NaN       NaN
2007-08-31       NaN       NaN       NaN      NaN      NaN  ...       NaN       NaN     NaN       NaN       NaN
2009-03-31       NaN       NaN       NaN      NaN      NaN  ...       NaN       NaN     NaN       NaN       NaN
2010-03-31       NaN       NaN       NaN      NaN      NaN  ...       NaN       NaN     NaN       NaN       NaN
2011-03-31       NaN       NaN       NaN      NaN      NaN  ...       NaN       NaN     NaN       NaN       NaN
...              ...       ...       ...      ...      ...  ...       ...       ...     ...       ...       ...
2020-05-20  0.096428  0.094528  0.103502  0.05165  0.08434  ...  0.078191  0.173209     NaN  0.068505  0.126817
2020-05-31  0.096428  0.094528  0.103502  0.05165  0.08434  ...  0.078191  0.173209     NaN  0.068505  0.126817
2020-06-30  0.096428  0.094528  0.107717  0.05165  0.08434  ...  0.078191  0.173209     NaN  0.068505  0.126817
2020-08-31  0.096428  0.094528  0.107717  0.05165  0.08434  ...  0.078191  0.094460     NaN  0.068505  0.126817
2020-09-30  0.096428  0.094528  0.107717  0.05165  0.08434  ...  0.078191  0.094460     NaN  0.068505  0.126817

[69 rows x 499 columns]

Formatieren des Schlusspreisdatenrahmens und Erstellen des monatlichen Rückgabedatenrahmens

Von hier aus werden wir die Daten durch Drücken formatieren. Formatieren Sie zuerst die Daten für monatliche Daten und erstellen Sie dann einen Datenrahmen für die monatliche Rendite (abzüglich Marktrenditen).

closes["month"] = closes.index.month                                      #Erstellen einer Monatsspalte
closes["end_of_month"] = closes.month.diff().shift(-1)                    #Erstellen einer Flaggenspalte zum Monatsende
closes = closes[closes.end_of_month != 0]                                 #Nur am Monatsende extrahiert

monthly_rt = closes.pct_change().shift(-1)                                #Monatliche Renditen erstellen(Mit Verzögerung)
monthly_rt = monthly_rt.sub(monthly_rt["^N225"], axis=0)                  #Abzug der Marktrendite

closes = closes[closes.index > datetime.datetime(2017, 4, 1)]             #Nach April 2017
monthly_rt = monthly_rt[monthly_rt.index > datetime.datetime(2017, 4, 1)]

closes = closes.drop(["^N225", "month", "end_of_month"], axis=1)          #Löschen Sie nicht benötigte Spalten
monthly_rt = monthly_rt.drop(["^N225", "month", "end_of_month"], axis=1)

print(closes)
print(monthly_rt)


Ausführungsbildschirm

            1332.T   1333.T   1414.T   1605.T   1721.T   1801.T  ...   9861.T   9962.T    9983.T   9984.T   9987.T   9989.T
Date                                                             ...
2017-04-28  511.60  3064.04  2390.82   994.50  1964.87  3873.35  ...  1758.93  2063.02  35232.05  4138.08  3573.51  3686.69
2017-05-31  550.67  3049.61  2498.64   947.96  2172.28  4310.81  ...  1730.92  2443.18  35949.09  4413.07  3529.87  4063.84
2017-06-30  625.93  2855.29  2687.68  1006.13  2141.72  4675.36  ...  1810.12  2507.68  36259.17  4459.15  3617.15  3950.69
2017-07-31  613.54  2895.69  2763.53   998.68  2094.50  4812.06  ...  1801.43  2673.82  32092.56  4391.01  3573.51  3875.26
2017-08-31  589.73  3068.85  2886.77   978.21  2188.95  5026.24  ...  1818.65  2756.89  30664.60  4373.37  3883.83  4294.85

2020-07-31  435.19  2021.00  4530.00   599.10  3058.94  3557.00  ...  1791.22  2489.70  55837.62  6595.00  3713.65  3580.46
2020-08-31  471.87  2398.00  5010.00   673.80  2922.77  3601.22  ...  2098.00  2777.20  63280.00  6598.00  3907.01  3912.72
2020-09-30  447.00  2412.00  5220.00   563.50  2921.00  3550.00  ...  1970.00  2935.00  65860.00  6469.00  4005.00  3965.00
2020-10-30  401.00  2182.00  5020.00   492.00  2646.00  3245.00  ...  1915.00  3090.00  72710.00  6793.00  3765.00  3875.00
2020-11-10  437.00  2319.00  5410.00   541.00  3040.00  3535.00  ...  1998.00  3455.00  77910.00  6860.00  3865.00  4145.00

[44 rows x 499 columns]

              1332.T    1333.T    1414.T    1605.T    1721.T  ...    9962.T    9983.T    9984.T    9987.T    9989.T
Date                                                          ...
2017-04-28  0.052727 -0.028350  0.021457 -0.070438  0.081918  ...  0.160633 -0.003289  0.042813 -0.035853  0.078659
2017-05-31  0.117186 -0.083203  0.056174  0.041880 -0.033552  ...  0.006917 -0.010858 -0.009042  0.005243 -0.047327
2017-06-30 -0.014391  0.019553  0.033625 -0.002001 -0.016644  ...  0.071656 -0.109508 -0.009877 -0.006661 -0.013689
2017-07-31 -0.024808  0.073799  0.058595 -0.006498  0.059094  ...  0.045067 -0.030496  0.009982  0.100838  0.122273
2017-08-31 -0.013368  0.001479  0.016405  0.109973  0.112144  ...  0.018384  0.018514 -0.015500 -0.030392 -0.007134

2020-07-31  0.018428  0.120684  0.040103  0.058830 -0.110373  ...  0.049619  0.067429 -0.065402 -0.013790  0.026941
2020-08-31 -0.054665  0.003878  0.039956 -0.165659 -0.002566  ...  0.054860  0.038811 -0.021512  0.023120  0.011401
2020-09-30 -0.093937 -0.086386 -0.029343 -0.117915 -0.085175  ...  0.061782  0.112979  0.059056 -0.050954 -0.013728
2020-10-30  0.013155 -0.025898 -0.022349  0.013459  0.066692  ...  0.021076 -0.026613 -0.090432 -0.056213 -0.031199
2020-11-10       NaN       NaN       NaN       NaN       NaN  ...       NaN       NaN       NaN       NaN       NaN

[44 rows x 499 columns]

Erstellung von PER- und ROE-Datenrahmen (gleiche Dimension wie monatliche Renditen)

Erstellen Sie abschließend einen PER- und einen ROE-Datenrahmen, damit die monatlichen Renditen auf dem gleichen Niveau liegen.

eps_df = pd.DataFrame(index=monthly_rt.index, columns=monthly_rt.columns) #DF-Erstellung mit der gleichen Dimension wie die monatliche Rendite
roe_df = pd.DataFrame(index=monthly_rt.index, columns=monthly_rt.columns)

for i in range(len(eps_df)):                                              #Ersetzung jeder Zeile
    eps_df.iloc[i] = eps[eps.index < eps_df.index[i]].iloc[-1]

for i in range(len(roe_df)):
    roe_df.iloc[i] = roe[roe.index < roe_df.index[i]].iloc[-1]

per_df = closes/eps_df                                                    #Erstellen eines PER-Datenrahmens

print(per_df)
print(roe_df)


Ausführungsbildschirm

             1332.T   1333.T   1414.T   1605.T   1721.T 1801.T  ...   9861.T   9962.T   9983.T 9984.T   9987.T   9989.T
Date                                                            ...
2017-04-28  11.1972  10.4392      NaN   31.454  17.0954    NaN  ...  91.0625  31.8555      NaN    NaN  14.9553  18.4872
2017-05-31  12.0523    10.39      NaN   29.982     18.9    NaN  ...  89.6124  37.7256      NaN    NaN  14.7726  20.3785
2017-06-30  13.6995  9.72799      NaN  31.8218  18.6341    NaN  ...  93.7127  38.7215      NaN    NaN  15.1379  19.8111
2017-07-31  13.4284  9.86563  21.2599  31.5862  18.2232    NaN  ...  93.2628  41.2869      NaN    NaN  14.9553  19.4328
2017-08-31  12.9072  10.4556   22.208  30.9388   19.045    NaN  ...  94.1543  42.5696      NaN    NaN   16.254  21.5369

2020-07-31  9.16884  8.48323  27.0784  5.57002  14.8307    NaN  ...  162.317  42.8301  35.0602    NaN   11.738  17.6665
2020-08-31  9.94164  10.0657  29.9477  6.26453  14.1705    NaN  ...  190.117  47.7759  39.7332    NaN  12.3492   19.306
2020-09-30  9.41766  10.1245   31.203  5.23904  14.1619    NaN  ...  178.518  50.4906  74.4062    NaN  12.6589  19.5639
2020-10-30  8.44851  9.15904  30.0074  4.57428  12.8286    NaN  ...  173.534   53.157  82.1451    NaN  11.9003  19.1199
2020-11-10  9.20698   9.7341  32.3387  5.02985  14.7389    NaN  ...  181.056  59.4361  88.0198    NaN  12.2164  20.4521

[44 rows x 499 columns]

               1332.T     1333.T     1414.T     1605.T     1721.T  ...     9962.T     9983.T 9984.T     9987.T    9989.T
Date                                                               ...
2017-04-28   0.117515   0.153443        NaN  0.0156865   0.071603  ...    0.11847        NaN    NaN  0.0538158  0.170991
2017-05-31   0.117515   0.153443        NaN  0.0156865   0.071603  ...    0.11847        NaN    NaN  0.0538158  0.170991
2017-06-30   0.117515   0.153443        NaN  0.0156865   0.071603  ...    0.11847        NaN    NaN  0.0538158  0.170991
2017-07-31   0.117515   0.153443   0.101048  0.0156865   0.071603  ...    0.11847        NaN    NaN  0.0538158  0.170991
2017-08-31   0.117515   0.153443   0.101048  0.0156865   0.071603  ...    0.11847        NaN    NaN  0.0538158  0.170991

2020-07-31  0.0964277  0.0945276   0.107717    0.05165  0.0843397  ...  0.0781906   0.173209    NaN  0.0685051  0.126817
2020-08-31  0.0964277  0.0945276   0.107717    0.05165  0.0843397  ...  0.0781906   0.173209    NaN  0.0685051  0.126817
2020-09-30  0.0964277  0.0945276   0.107717    0.05165  0.0843397  ...  0.0781906  0.0944602    NaN  0.0685051  0.126817
2020-10-30  0.0964277  0.0945276   0.107717    0.05165  0.0843397  ...  0.0781906  0.0944602    NaN  0.0685051  0.126817
2020-11-10  0.0964277  0.0945276   0.107717    0.05165  0.0843397  ...  0.0781906  0.0944602    NaN  0.0685051  0.126817

[44 rows x 499 columns]

Daten kombinieren

Lassen Sie uns abschließend diese Datenrahmen zu einem kombinieren.

stack_monthly_rt = monthly_rt.stack()                                  #In einer Dimension gestapelt
stack_per_df = per_df.stack()
stack_roe_df = roe_df.stack()

df = pd.concat([stack_monthly_rt, stack_per_df, stack_roe_df], axis=1) #Beitreten
df.columns = ["rt", "per", "roe"]                                      #Einstellung des Spaltennamens

df["rt"][df.rt > 1.0] = np.nan                                         #Entfernung von Ausreißern

print(df)


Ausführungsbildschirm

                         rt      per        roe
Date
2017-04-28 1332.T -0.047638  11.1972   0.117515
           1333.T -0.070101  10.4392   0.153443
           1414.T  0.026680      NaN        NaN
           1605.T -0.038959   31.454  0.0156865
           1721.T  0.051664  17.0954   0.071603
...                     ...      ...        ...
2020-11-10 9962.T  0.025375  59.4361  0.0781906
           9983.T -0.021231  88.0198  0.0944602
           9984.T -0.082885      NaN        NaN
           9987.T -0.066187  12.2164  0.0685051
           9989.T -0.023070  20.4521   0.126817

[21892 rows x 3 columns]

Extraktion und Darstellung der Zielbestände

Lassen Sie uns nun die Aktien (PER <10, ROE> 0,1) extrahieren, die als billig und von hoher Qualität angesehen werden, und die Verteilungskarte der Renditen und die kumulierten Renditen beim Kauf und Verkauf dieser Aktien beobachten.

Durch die Analyse der Daten auf diese Weise wird deutlich, dass die individuelle Aktienauswahl mit Tools wie den in Magazinen eingeführten völlig unzuverlässig ist. Diese Überprüfung ist nur ein Abzug der Marktrenditen, sodass Sie möglicherweise einige Renditen erzielen, wenn der Markt boomt.

value_df = df[(df.per < 10) & (df.roe > 0.1)]       #Extrahieren Sie billige und hochwertige Marken

plt.hist(value_df["rt"])                            #Zeichnen eines Histogramms
plt.show()

balance = value_df.groupby(level=0).mean().cumsum() #Erstellen Sie kumulative Renditen

plt.clf()
plt.plot(balance["rt"])                             #Eine Ausgleichskurve zeichnen
plt.show()


Ausführungsergebnis
balance.png

Schließlich

Die in diesem Artikel vorgestellte Überprüfung ist nur der Anfang des quantitativen und empirischen Handels. Obwohl dieser Artikel als "Erfolgreiche Investition" bezeichnet wird, werden nur wenige Personen diesen Artikel tatsächlich lesen und erfolgreich investieren. Das liegt daran, dass die Mehrheit der Leute, die den Artikel lesen, keine Maßnahmen ergreift. Die Aktion hier besteht nicht nur darin, diesen Artikel zu lesen und die brennende Klinge zu handeln, sondern den quantitativen und empirischen Handel anhand des Einfallsreichtums anhand der Inspiration aus diesem Artikel zu überprüfen. Es bedeutet zu erreichen.

Dieser Artikel ist so übersichtlich wie möglich organisiert, dennoch kann der Leser die detaillierten und nützlichen Erkenntnisse, die sich dabei ergeben haben, niemals verstehen, indem er einfach den Artikel liest. Die einzige Möglichkeit, dies zu Ihrem eigenen zu machen, besteht darin, Ihre Hände zu bewegen.

Ich habe mein eigenes Wissen über den Handel in Blogs und Notizen geschrieben. Wenn Sie diesen Artikel gelesen haben und sich ernsthaft mit quantitativem und empirischem Handel beschäftigen, werden Sie die folgenden Referenzen sicher leiten.

Auch hier wird der größte Teil des Handels vom Glück bestimmt. Der Grund, warum ich mich bisher gut geschlagen habe, ist, dass ich das Glück habe, dass die Leistung nicht gesunken ist. Mögest du auch viel Glück haben.

Referenzartikel

Recommended Posts

Erfolgreiche Investition: Handelswissenschaft
Systemhandel ab Python3: langfristige Investition