[PYTHON] Investissement réussi: la science du trading

introduction

Immédiatement, investissez-vous tous? Si oui, quel type d'investissement faites-vous?

Il existe différents objectifs d'investissement dans le monde et différentes méthodes d'investissement. Les informations sur l'investissement sont abondantes dans le monde. Il vaut peut-être mieux dire qu’il s’agit d’inondations. Prenant les livres comme exemple, il existe une gamme de livres d'introduction légers qui encouragent l'investissement avec des mots doux dans des livres financiers spécialisés. Les blogs et les SNS sont également d'importantes sources d'informations, et il semble que YouTube pour l'investissement gagne également en popularité ces jours-ci.

Cependant, malgré l'existence de sources d'informations aussi diverses, seule une poignée d'investissements réussis peut être réalisée. C'est une recherche un peu ancienne, mais selon la recherche sur les investisseurs individuels de Nomura Securities en 2015, le pourcentage d'investisseurs individuels qui réalisent un profit total est de 9,3%. Pourquoi tombez-vous dans une telle situation? Permettez-moi de vous donner quelques exemples de l'approche adoptée par les débutants en investissement.

―― Sautez à la flambée des prix des actions à thème à la mode et saisissez le prix élevé --Imitez Buffett et sélectionnez un stock de croissance d'aubaine dans le rapport des quatre saisons

Certaines personnes peuvent être déçues de voir la perte non réalisée à chaque fois que survient la pause déjeuner des heures de travail, car elles échangent une telle méthode en avalant. Encore une fois, pourquoi nous retrouvons-nous dans cette situation? C'est parce que ** les débutants ne savent pas quels styles de trading sont intrinsèquement supérieurs ** en premier lieu.

Objectif de cet article

Dans cet article, j'ai gardé à l'esprit que cela donnera une prise de conscience complètement nouvelle aux perspectives d'investissement des débutants, à la fois dans le lapin et dans le coin. Le commerce est une science. Le trading scientifique est, en d'autres termes, un trading quantitatif et empirique.

Dans cet article, nous allons vous montrer quels styles de trading dominent, sur la base d'une réflexion statistique. Dans l'article, j'ai choisi des termes aussi faciles à comprendre que possible pour que les débutants puissent les lire facilement, et j'ai essayé d'omettre autant que possible les formules difficiles et les considérations techniques.

Il vous apprendra également des techniques spécifiques pour mettre en pratique le trading scientifique. La programmation est essentielle pour le trading quantitatif et empirique. Dans cet article, j'ai écrit un programme pour effectuer la vérification minimale requise en utilisant le langage Python. Beaucoup de gens y penseront comme de la programmation, mais c'est une bonne idée de saisir cette occasion pour commencer à étudier. Travailler avec un sens du but est le moyen le plus rapide de s'améliorer.

Performance d'investissement de l'écrivain

Au début de l'article, je voudrais vous présenter la performance de mon investissement jusqu'à présent. Tout à coup, vous pourriez penser que c'est moche de parler de l'argent que vous avez gagné, mais il n'est pas convaincant de dire quoi que ce soit à quelqu'un qui n'a pas produit de résultats. Une chose à ajouter est que la chose la plus importante dans l'investissement est la gestion des processus, pas les résultats. En effet, comme nous le verrons plus loin, la performance des investissements est fortement dépendante de la chance, et prendre des décisions basées uniquement sur les résultats conduit souvent à des conclusions erronées.

À l'origine, j'investis aux côtés d'un ingénieur professionnel, mais en 2014, j'ai commencé la gestion d'actifs à grande échelle. Le fonds de démarrage à ce moment-là était de 50 millions de yens. En 2016, nous avons développé le système d'exploitation qui est actuellement le pilier. Ce système d'exploitation est notre système phare qui a rapporté environ 140 millions de yens depuis le début de l'exploitation jusqu'à aujourd'hui. L'investissement est ciblé sur les grandes actions appelées TOPIX500 des actions japonaises, et le rendement moyen des quatre dernières années est d'environ 40%. 02.png

Présentation du problème

Maintenant, je vais vous expliquer pourquoi l'approche du débutant mentionnée au début ne peut pas réussir et quel est le problème. Le succès signifie ici l'obtention du rendement souhaité de manière continue et stable sans aucun revers pendant la période d'investissement d'au moins 5 ans.

Tout d'abord, examinons si la méthode au début fera un profit ou non. À titre d'exemple, envisagez d'investir dans une action considérée comme bon marché et de haute qualité. Lors de la sélection des actions individuelles, vous utiliserez très probablement les outils des sociétés de valeurs mobilières pour rechercher des actions. Jetons un coup d'œil à la performance en investissant dans une action avec un PER de 10 fois ou moins et un ROE de 10% ou plus pendant un mois.

La période d'agrégation va d'avril 2017 à octobre 2020, et le bénéfice réalisé lorsque l'action filtrée est achetée au début du mois (pour être exact, achetée au cours de clôture du mois précédent) et réglée au cours de clôture de la fin du mois. C'est une carte de distribution (diaphragme). À ce moment, le rendement du marché est soustrait du rendement de l'action individuelle. Si vous ne le faites pas, vous serez affecté par la forte hausse de la moyenne du Nikkei et vous ne pourrez pas distinguer si les bénéfices que vous avez réalisés dépendent de vos compétences en matière de sélection de titres, ou si vous avez la chance de bénéficier de la hausse du marché. value_hist3.png

Eh bien, cette méthode d'investissement est-elle rentable?

En conclusion, cela peut être rentable ou non. L'action dans laquelle vous avez investi peut être la plus à droite (c'est-à-dire l'action qui a réalisé un profit) dans la distribution indiquée ci-dessus. Il peut également s'agir de la partie la plus à gauche de la distribution (c'est-à-dire du stock qui a perdu de l'argent). Tous les stocks inclus dans la distribution ci-dessus sont des stocks «bon marché et de haute qualité» selon vos normes. Ce n'est pas le fait que «bon marché et de haute qualité» détermine le profit ou la perte final, mais on peut dire que c'est le soi-disant doigté qui a ramassé la marque parmi les nombreuses marques ciblées à cette époque. Je vais. Par exemple, j'ai aimé le nom de l'entreprise, il est apparu en haut de la projection, j'ai lu un magazine et j'ai soudain pensé à investir, ou quelque chose comme ça. Faisons le.

Investir c'est comme un gacha

Le résultat de votre investissement dépend de votre chance. Au contraire, c'est principalement déterminé par la chance. La chance ici signifie la distribution de probabilité comme indiqué dans la figure ci-dessus. Comme vous pouvez le voir dans l'exemple ci-dessus, si vous vous concentrez uniquement sur le résultat de l'investissement, vous ne pouvez jamais juger si l'investissement lui-même a réussi. Cela n'a aucun sens que le résultat de votre métier soit le produit de vos propres compétences ou une coïncidence.

L'incapacité de juger correctement les résultats de cette manière signifie que nous ne savons pas si nous pouvons nous fier à la méthode. En d'autres termes, il n'est pas possible de passer par le processus d'amélioration des affaires. Une approche comme celle du début n'a pas l'idée de renverser le processus d'amélioration. Afin d'exécuter le processus d'amélioration, nous avons besoin d'un mécanisme permettant de remonter les résultats quantitatifs dans un court laps de temps.

Si vous ne pouvez pas passer par le processus d'amélioration, vos compétences en matière d'investissement ne s'amélioreront jamais à l'avenir. C'est la même chose que de faire tourner un gacha dont le contenu est inconnu. Vous ne faites que répéter l'acte stérile de retirer plusieurs fois par an quelques gachas de la distribution des émissions ci-dessus, vous réjouissant si les résultats sont bons et décourageant si les résultats sont mauvais.

Solution

Alors, y a-t-il un moyen de capturer ce gacha? Naturellement, la réponse est "OUI".

La nature du stand de gacha

Il y a de bonnes et de mauvaises choses dans le stand de gacha. Une table avec beaucoup de succès à l'intérieur est une bonne table, et une table avec seulement des restes est une mauvaise table. À quoi cela ressemble-t-il lorsque vous regardez ces plates-formes en termes de distribution des émissions? Voici trois exemples: sample_hist.png

Tout d'abord, qu'en est-il du support le plus à gauche? Le centre de la distribution des émissions de cette plate-forme est presque 0. Autrement dit, la valeur attendue de ce support est de 0. Peu importe combien vous dessinez du gacha sur cette plate-forme, vos actifs ne croîtront pas. Même si vous faites un profit temporaire, il se trouve que vos performances sont supérieures. À long terme, le profit et la perte moyens gagnés approcheront toujours de zéro.

Alors que diriez-vous de la plate-forme intermédiaire? Si vous regardez de près la distribution des émissions de cette plate-forme, vous pouvez voir qu'elle s'est légèrement décalée vers la droite (côté plus). C'est l'état où la valeur attendue est positive. En trading, nous utilisons des expressions telles que "avoir un avantage" et "avoir un alpha (revenu excessif)". En continuant à tirer le gacha, vous pouvez développer vos actifs sur cette plate-forme. Cependant, les hauts et les bas des actifs en cours de route sont volatils et vous pouvez vous arrêter à mi-chemin.

Enfin, c'est le stand le plus à droite. La distribution des émissions de cette plate-forme est légèrement décalée vers la droite, similaire à la plate-forme au milieu. Et si vous regardez de plus près, vous pouvez voir que la variation (propagation à partir du centre) est dans une petite plage par rapport à la plate-forme au milieu. La valeur attendue est positive et la variation est faible, c'est-à-dire qu'il s'agit d'une plate-forme avec un «ratio net» élevé. Vous pouvez trouver un tel stand de gacha, et en continuant à le tirer, votre succès sera solide.

Quoi qu'il en soit, continuez à faire tourner le gacha plusieurs fois

Il n'est pas possible de saisir la tendance de ce à quoi ressemble le contenu du support de gacha en tirant sur le gacha une ou deux fois. Par conséquent, si vous voulez vraiment saisir la tendance du contenu, vous devez le retourner encore et encore. L'important ici est de ne tourner qu'un seul gacha sans se détourner. Vous ne pouvez pas saisir la tendance même si cela prend toute une vie en la tirant à mi-chemin et en passant à ce gacha car il semble que ce gacha n'obtienne pas beaucoup de succès.

En d'autres termes, dans le trading, vous devez continuer à négocier de manière cohérente en utilisant une seule méthode. Cela ne suffit pas 10 ou 100 fois. Cela doit être fait plusieurs fois, plus de 1000 fois. Ne passez pas de l'une à l'autre aux méthodes d'investissement telles que les magazines. La seule façon de lutter contre l'incertitude de l'investissement est de gagner des essais. La seule arme dont nous disposons est la loi de la majorité.

Par conséquent, ** une stratégie de trading dominante est une stratégie «gérable» **. Ceux qui ont une durée mensuelle ou plus ne sont pas adaptés à la négociation par des investisseurs individuels. Au moins, le trading doit être effectué quotidiennement. Le meilleur de ces derniers est le scalping. De plus, plus la période de négociation est courte, moins le mouvement des prix est incertain et plus il est facile de saisir la tendance (en particulier, l'incertitude sur l'investissement est proportionnelle à la racine carrée de la période d'investissement).

Si vous continuez à tirer le gacha, vous manquerez d'argent

Cependant, bien sûr, vous avez besoin d'argent pour dessiner une gacha. Plus vous tirez, plus l'argent disparaîtra de votre portefeuille. C'est la même chose pour le trading. En trading, une transaction coûte toujours de l'argent. S'il s'agit d'une action, vous paierez les frais et le taux d'intérêt de crédit lors de l'achat de l'action, et s'il s'agit de devises, vous paierez le spread au trader dans une transaction. Si vous négociez plusieurs fois, votre argent s'épuisera en un rien de temps.

Estimer la tendance du contenu du gacha en lançant des balles réelles ne vaut vraiment pas la peine. Plutôt que de faire cela, il existe un moyen de frapper un bon stand de gacha à l'avance.

Estimer le contenu du stand de gacha à l'avance à partir des données

Dans le monde de l'investissement, nous pouvons collecter certaines des données qui sont pré-utilisées sur le stand de gacha. Et vous pouvez utiliser ces données pour vérifier quel type de stand de gacha est bon, c'est-à-dire sur quel type de stratégie de trading vous devriez miser avant de dessiner du gacha. Il s'agit d'une méthode de trading dite quantitative et empirique. L'analyse des données est utilisée pour trouver la valeur attendue qui peut surmonter le coût de transaction.

Des recherches sur le trading quantitatif et empirique sont menées depuis de nombreuses années. Surtout récemment, il existe de nombreux cas où l'apprentissage automatique est utilisé à cette fin. L'apprentissage automatique est très utile non seulement pour confirmer la signification statistique des données, mais également pour extraire des caractéristiques de marché cachées que personne ne connaît. La bibliothèque de programmation est vaste et des API de téléchargement de données sont en cours de développement. Même les investisseurs individuels peuvent analyser pleinement les données.

Et à l'opération

En fonctionnement réel, il est nécessaire de fixer les conditions autant que possible en fonction du résultat de la vérification et d'effectuer le commerce mécaniquement. N'y mettez pas d'émotions humaines. Et si vous répétez mécaniquement beaucoup de transactions, il n'y a aucune raison de ne pas automatiser cela. Un tel style de négociation est également appelé collectivement «système de négociation».

Dans la pratique, une approche d'investissement réussie consiste à passer par le processus d'amélioration tout en comparant la pré-vérification (c'est-à-dire le backtesting) avec la performance opérationnelle réelle. Pour ceux qui n'ont jamais fait d'analyse de données, les chapitres suivants vous montreront comment analyser les données à l'aide de Python.

Préparation au trading quantitatif et empirique

Maintenant, collectons d'abord les données. Les données sont collectées à l'aide de l'API Yahoo Finance. À ce stade, une bibliothèque appelée yfinance est utilisée, alors installez-la d'abord. Pour plus d'informations sur yfinance, veuillez consulter ici.

pip install yfinance

(Ajout) À propos du bug de yfinance Il y a un bogue dans yfinance selon lequel vous ne pouvez pas obtenir de données financières par défaut. Vous pouvez l'obtenir en modifiant le fichier yfinance base.py comme suit.

# base.py Près de la ligne 353
# get fundamentals
# data = utils.get_json(url+'/financials', proxy)← Programme par défaut. Masque
url = "{}/{}/financials".format(self._scrape_url, self.ticker)   #ajouter à
data = utils.get_json(url, proxy)                                #ajouter à

Données historiques de prix

Commençons par télécharger les données de prix des actions du marché boursier japonais.

En exécutant le code suivant, vous pouvez obtenir les données historiques de 7203 Toyota Motor en un instant. Étant donné que le symbole boursier d'une action sur le marché japonais est représenté par le code boursier + ".T", vous pouvez facilement obtenir les données de presque toutes les actions sans rechercher le symbole de Yahoo Finance.

import yfinance as yf

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


Écran d'exécution

               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]

Compte de résultat

Ensuite, regardons les données financières. Tout d'abord, à partir du compte de résultat.

Vous pouvez obtenir le compte de résultat des 3 dernières années à partir du code ci-dessous. Parmi ceux-ci, les plus importants sont le revenu total (ventes), le bénéfice d'exploitation (bénéfice d'exploitation) et le bénéfice net (bénéfice net).

financials = ticker.financials
print(financials)


Écran d'exécution

                                         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

Bilan (bilan)

Vient ensuite le bilan.

Vous pouvez obtenir le bilan des 3 dernières années à partir du code ci-dessous. Parmi ceux-ci, les plus importants sont l'actif total, le passif total et l'avoir total des actionnaires.

balance_sheet = ticker.balance_sheet
print(balance_sheet)


Écran d'exécution

                                    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

Tableau des flux de trésorerie

À la fin des états financiers se trouve le tableau des flux de trésorerie.

Vous pouvez obtenir le tableau des flux de trésorerie des 3 dernières années à partir du code ci-dessous. Parmi ceux-ci, les plus importants sont les flux de trésorerie totaux des activités d'exploitation, les flux de trésorerie totaux des activités de financement et les flux de trésorerie totaux des activités d'investissement.

cashflow = ticker.cashflow
print(cashflow)


Écran d'exécution

                                             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

Résumé du stock

Enfin, comment obtenir un résumé des stocks.

Vous pouvez obtenir les informations de base du stock à partir du code ci-dessous. Parmi ceux-ci, les plus importants sont marketCap (valeur marchande), actions en cours (nombre d'actions émises), forwardPE (PER prévisionnelle), dividendYield (rendement du dividende), profitMargins (ratio de bénéfice net), etc.

info = ticker.info
print(info)


Écran d'exécution
Omis car il s'agit d'un type de dictionnaire

Acquisition de plusieurs actions

Si vous souhaitez obtenir plusieurs actions en même temps, utilisez la classe Tickers et séparez les arguments par un espace.

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


Écran d'exécution

              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

Acquisition de données autres que le cours des actions (échange)

Si vous êtes un ticker qui existe dans Yahoo Finance, vous pouvez obtenir des données même s'il ne s'agit pas d'une émission d'actions. Prenons les données d'échange à titre d'exemple.

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)


Résultat de l'exécution

              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]

Indice boursier majeur mondial

Voici comment obtenir les principaux indices boursiers mondiaux. Il existe d'autres indicateurs qui peuvent être pris en dehors de ceux énumérés ici. Nous vous encourageons à le rechercher vous-même sur Yahoo Finance.

indices = ["^N225", "^DJI", "^GSPC", "^IXIC", "^GDAXI", "^FTSE", "^FCHI", "^HSI", "^SSEC", "^BVSP", "^KOSPI"]
#Omis ci-dessous

Exécution de trading quantitatif et empirique

Ensuite, à titre d'exemple, en nous basant sur le programme, nous expliquerons comment vérifier le rendement en investissant dans des actions considérées comme bon marché et de haute qualité (PER est 10 fois ou moins, ROE est 10% ou plus), ce qui a été mentionné dans le problème soulevé dans cet article. Je vais expliquer. La capacité de programmation de l'auteur est inférieure à celle des étudiants, donc je pense qu'il y a des descriptions disgracieuses. Si vous avez des suggestions concernant le codage, veuillez commenter.

Lire la liste de stock

Commencez par préparer la liste des marques TSE au format CSV. Vous pouvez obtenir une liste des actions cotées sur le TSE à partir de ici, veuillez donc récupérer les actions que vous souhaitez vérifier. Dans cet exemple, nous avons ciblé les constituants TOPIX 500, qui sont relativement grands dans TOPIX.

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)


Écran d'exécution

     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]

Paramètres du ticker

Définissez le ticker pour yfinance. La moyenne Nikkei, qui correspond aux données du marché, est ajoutée aux actions ci-dessus.

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

Création d'un cadre de données de prix de clôture

Ensuite, obtenez les données historiques de la série de prix avec yfinance et récapitulez les données de prix de clôture dans la base de données.

closes   = [] #le dernier prix

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

closes = pd.DataFrame(closes).T   #Conversion DataFrame
closes.columns = stocks           #Paramètre de nom de colonne
closes = closes.ffill()           #Achèvement des données manquantes

print(closes)


Écran d'exécution

            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]

Créer une base de données sur le revenu net

Ensuite, les données des états financiers sont résumées dans une base de données. Le premier est le revenu net pour le calcul du PER et du ROE. Il semble que la valeur NAN soit élevée car la fin de l'année fiscale de chaque marque n'est pas alignée, mais soyez assuré que les données sont correctement incluses dans les parties nécessaires.

earnings = [] #Revenu net

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)       #Insérer un mannequin lorsqu'une erreur se produit

earnings = pd.DataFrame(earnings).T  #Conversion DataFrame
earnings.columns = stocks            #Paramètre de nom de colonne

print(earnings)


Écran d'exécution

            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]

Créer une base de données capitale

Vient ensuite le capital pour le calcul du ROE.

equity   = [] #valeur nette

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)         #Insérer un mannequin lorsqu'une erreur se produit

equity = pd.DataFrame(equity).T      #Conversion DataFrame
equity.columns = stocks              #Paramètre de nom de colonne

print(equity)


Écran d'exécution

            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]

Création d'un certain nombre de trames de données d'actions émises

Le BPA (gain par action) est nécessaire pour calculer le PER. Créez un certain nombre de blocs de données d'actions émises pour calculer le BPA.

shares   = [] #Nombre d'actions émises

for i in range(len(tickers.tickers)):
    try:
        shares.append(tickers.tickers[i].info["sharesOutstanding"])
    except:
        shares.append(np.nan)        #Entrez la valeur NAN lorsqu'une erreur se produit

shares = pd.Series(shares)           #Séries
shares.index = stocks                #Réglage du nom de l'index

print(shares)


Écran d'exécution

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

Création de trames de données EPS et ROE

Créez des bases de données BPA et ROE à partir des données sur le revenu net, les capitaux propres et le nombre d'actions émises

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

eps = eps.ffill()                 #Achèvement des données manquantes
roe = roe.ffill()

eps = eps.drop(["^N225"], axis=1) # ^Supprimer la colonne N225
roe = roe.drop(["^N225"], axis=1)

print(eps)
print(roe)


Écran d'exécution

               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]

Formatage de la trame de données de prix de clôture et création de la trame de données de retour mensuel

À partir de là, nous formaterons les données en les poussant. Tout d'abord, formatez les données pour les données mensuelles, puis créez une base de données de retour mensuel (moins les rendements du marché).

closes["month"] = closes.index.month                                      #Créer une colonne mensuelle
closes["end_of_month"] = closes.month.diff().shift(-1)                    #Créer une colonne d'indicateur de fin de mois
closes = closes[closes.end_of_month != 0]                                 #Extrait uniquement à la fin du mois

monthly_rt = closes.pct_change().shift(-1)                                #Créer des retours mensuels(Avec décalage)
monthly_rt = monthly_rt.sub(monthly_rt["^N225"], axis=0)                  #Déduction du rendement du marché

closes = closes[closes.index > datetime.datetime(2017, 4, 1)]             #Après avril 2017
monthly_rt = monthly_rt[monthly_rt.index > datetime.datetime(2017, 4, 1)]

closes = closes.drop(["^N225", "month", "end_of_month"], axis=1)          #Supprimer les colonnes inutiles
monthly_rt = monthly_rt.drop(["^N225", "month", "end_of_month"], axis=1)

print(closes)
print(monthly_rt)


Écran d'exécution

            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]

Création de bases de données PER et ROE (même dimension que les retours mensuels)

Enfin, créez une base de données PER et ROE afin que les rendements mensuels soient au même niveau.

eps_df = pd.DataFrame(index=monthly_rt.index, columns=monthly_rt.columns) #Création DF de même dimension que la déclaration mensuelle
roe_df = pd.DataFrame(index=monthly_rt.index, columns=monthly_rt.columns)

for i in range(len(eps_df)):                                              #Substitution à chaque ligne
    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                                                    #Création d'une trame de données PER

print(per_df)
print(roe_df)


Écran d'exécution

             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]

Combiner des données

Enfin, combinons ces trames de données en une seule.

stack_monthly_rt = monthly_rt.stack()                                  #Empilé dans une dimension
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) #Joindre
df.columns = ["rt", "per", "roe"]                                      #Paramètre de nom de colonne

df["rt"][df.rt > 1.0] = np.nan                                         #Suppression des valeurs aberrantes

print(df)


Écran d'exécution

                         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]

Extraction et tracé des stocks cibles

Maintenant, extrayons les actions (PER <10, ROE> 0,1) considérées comme bon marché et de haute qualité, et observons la carte de distribution des rendements et les rendements cumulés lors de l'achat et de la vente de ceux-ci.

En analysant les données de cette manière, il est clair que la sélection de titres individuels à l'aide d'outils tels que ceux introduits dans les magazines n'est pas du tout fiable. Cette vérification n'est qu'une déduction des rendements du marché, vous pouvez donc obtenir des rendements lorsque le marché est en plein essor.

value_df = df[(df.per < 10) & (df.roe > 0.1)]       #Extraire des marques bon marché et de haute qualité

plt.hist(value_df["rt"])                            #Dessiner un histogramme
plt.show()

balance = value_df.groupby(level=0).mean().cumsum() #Créer des retours cumulatifs

plt.clf()
plt.plot(balance["rt"])                             #Dessiner une courbe d'équilibre
plt.show()


Résultat de l'exécution
balance.png

finalement

La vérification présentée dans cet article n'est encore que le début du trading quantitatif et empirique. Bien que cet article soit intitulé «Investissement réussi», peu de gens liront cet article et réussiront à investir. C'est parce que la grande majorité des personnes qui lisent l'article n'agissent pas. L'action ici n'est pas seulement de lire cet article et d'échanger la lame brûlante, mais de vérifier le trading quantitatif et empirique par l'ingéniosité basée sur l'inspiration reçue de cet article. Cela signifie atteindre.

Cet article est organisé aussi clairement que possible, mais néanmoins, le lecteur ne peut jamais comprendre les informations détaillées et utiles qui ont surgi dans le processus en lisant simplement l'article. La seule façon de vous l'approprier est de bouger vos mains.

J'ai écrit mes propres connaissances sur le trading sur des blogs et des notes. Si vous avez lu cet article et que vous êtes sérieux au sujet du trading quantitatif et empirique, les références suivantes ne manqueront pas de vous guider.

Encore une fois, la plupart des échanges sont déterminés par la chance. La raison pour laquelle j'ai bien réussi jusqu'à présent, c'est parce que j'ai de la chance que la performance ne soit pas tombée. Puissiez-vous aussi avoir de la chance.

Article de référence

Recommended Posts

Investissement réussi: la science du trading
Commerce système à partir de Python3: investissement à long terme