Python pour aider à tester les produits structurels

Inspiré par la publicité des produits structurels sur Habré , a adapté le script python pour leurs tests indépendants. L'idée principale est que ces produits offrent une protection du capital à 100%. Et compte tenu de 10 ans de marché haussier, la performance historique de ces produits est stupéfiante avec un paradis sans risque.

Cet article sera intéressant pour les programmeurs débutants en python qui souhaitent gérer leur argent. Eh bien, pour certains, cet outil peut être utile pour construire de telles stratégies par vous-même. Mais attention, les courtiers écrivent que ce n'est pas pour tout le monde.

Le code est publié sur GitHub en tant que bloc-notes Jupyter. C'est parti!

Quelques mots pour vous présenter


Je testerai sur les actions américaines et là le rendement sera inférieur à celui des roubles. Le marché russe en termes absolus sur les graphiques est plus intéressant, mais il comporte plus de risques. L'essence des tests ne change pas.

Nous prenons les données des avantages Alpha gratuits, où vous devez d'abord obtenir la clé en partageant l'adresse e-mail. Brève instruction dans un cahier. Vous pouvez prendre des cotations de titres russes chez Finam.

Charisme produit structurel


En bref, votre capital est en sécurité et le rendement est supérieur au dépôt bancaire (obligations d'État). Voici quelques éléments de l'équation manquants:

  • Il y a toujours un revenu sur un dépôt bancaire, mais il y a un risque de jouer à zéro;
  • Vous ferez un profit, mais le courtier réclame une part importante du gâteau;
  • Il y a une restriction sur l'utilisation de l'argent investi;
  • Le courtier ne supporte pratiquement aucun risque et ne participe qu'aux bénéfices.

La stratégie


Considérez la stratégie la plus simple:

  • Nous achetons 90% du capital des bons du Trésor à court terme;
  • Pour le reste, nous achetons un actif à haut risque;
  • Nous avons mis un terme à 10% du prix en début de période.

Au cœur de la stratégie: les bons du Trésor donnent 1 à 3% par an, pratiquement sans tirage (s'il y a un rendement). 10% du tirage d'un actif acheté avec 10% du capital sera le risque même que couvriront les obligations. Pendant les périodes de marché haussier, certains titres peuvent croître plusieurs fois, ce qui nous fera le bonheur.

Pour répéter manuellement cette stratégie, vous devez effectuer les étapes suivantes:

  • Achetez des obligations. Par exemple, sous la forme d'ETF.
  • Achetez des actions.
  • Mettez un ordre d'arrêt.

Comment tester


Je décrirai brièvement quelques solutions avec des extraits de code qui ont rendu les tests assez flexibles et pratiques.

Horaire


Vous pouvez rééquilibrer les périodes suivantes: semaine, mois, année. Et aussi n'importe quel jour de la période: le premier, le Nième, le dernier. La classe `Schedule ()` est responsable de ceci:

#         df = pd.DataFrame([], index=pd.date_range(start, end, freq='B')) # ... #      ,   df = df[df.index.isin(dates)].copy() # ... #    # ... elif freq == 'week': groupby = ['year', 'week'] elif freq == 'month': groupby = ['year', 'month'] elif freq == 'year': groupby = ['year'] #      grouped = df.groupby(groupby) for idx, grp in grouped: if len(grp) >= abs(day): df.loc[grp.iloc[day].name, 'allow'] = True 

Cycle de données


 StructuredProductMill().run() 

Comme décrit dans l'un des articles , nous pouvons contourner uniquement les dates de rééquilibrage dans un cycle et ignorer tous les autres jours. Mais ensuite, nous perdons des statistiques sur les changements d'actifs au cours de la période, nous ne verrons pas la rentabilité et les prélèvements pour chaque jour. Ce script, au détriment de la vitesse, contourne chaque jour, ce qui vous permet de voir la valeur de marché des positions ouvertes et d'appliquer un contrôle d'ordre stop.

Rééquilibrage


 StructuredProductMill().rebalance() 

Ici, les actifs pouvant être ouverts sont alloués au capital disponible. Après avoir comparé le calcul avec les positions ouvertes, les transactions sont exécutées pour le nombre requis:

 #  :       balance = self._cash + self.position_balance(day) #         df = day.merge(self._positions[['quantity']], how='left', left_index=True, right_index=True) # ... #              day.loc[is_allow, 'size_order'] = day[is_allow]['size'] / day[is_allow]['size'].sum() #        day['position_to'] = (balance * day['size_order']) // day['open'] #     day['order'] = day['position_to'] - day['position'] # ... #   for symbol, row in day[fltr].iterrows(): self.trade(row['dt'], symbol, row.order, row.open, 'O' if row.order > 0 else 'C') 

Offres


 StructuredProductMill().trade() 

Et ici, pour la vitesse, vous pouvez sacrifier les détails et contrôler uniquement le changement de rentabilité de chaque position. Mais le script prend en compte les commissions et la valeur des actifs, et conserve également un historique des transactions, ce qui vous permet de calculer les transactions et d'exécuter un ordre d'arrêt n'importe quel jour du test. Cette méthode met à jour la position et la taille du cache gratuit.

Lancement


Pour exécuter, vous devez spécifier un ensemble d'actifs avec des partages et des paramètres de test. Nous testerons les produits structurels pour l'année civile:

 #   portfolio = {'MINT': 0.9, 'AAPL': 0.1,} #   SYMBOLS = list(portfolio.keys()) df = prices(SYMBOLS) params = { 'benchmark': 'SPY', #     'balance': 100_000, #   'portfolio': portfolio, 'rebalance_day': -1, #      'freq': 'year', #    'stop_loss': 0.1, # -  10% #          'reset_position_prices': True, 'allow_method': allow_default, 'start': pd.to_datetime('2011-01-01'), #   } #  ,      pm = StructuredProductMill(params, prices=prices(SYMBOLS + [params['benchmark']]), show_progress=True) pm.check_params().prepare() #   pm.run() #   pm.print_results(); #   pm.charts() 

Au bas du cahier se trouvent des graphiques de rentabilité et de tirages à la date de rééquilibrage (en fin d'année), ce qui confirme les prélèvements extrêmement faibles de capitaux au moment du rapport et la rentabilité en constante augmentation. Bien que cette rentabilité perd au large indice des sociétés américaines S&P 500.

Résultats


Les tests portaient sur des instruments américains librement négociés depuis 2011:

  • BIL - ETF pour les bons du Trésor à court terme avec un rendement de 2% par an au moment de la rédaction. N'oubliez pas que de 2009 à 2017, les taux étaient proches de zéro. Une alternative consiste à utiliser MINT (un fonds pour les instruments à revenu fixe à court terme).
  • AAPL - Actions Apple.
  • MSFT - stock Microsoft.
  • TSLA - actions Tesla.

Aapl


Cette conception a rapporté en 8 ans un chiffre d'affaires de 24% (2,6% annuel moyen) avec un tirage entre rééquilibrages de -6%. Mais au tournant des années, le rabattement est à peu près nul. L'arrêt n'a pas été touché, le marché avec 180% du chiffre d'affaires en perte de commande.

Rentabilité et prélèvement pour chaque jour

Rentabilité et tirage pour chaque jour (rentabilité à gauche, tirage à droite).

Rentabilité et prélèvement au tournant des années

Rentabilité et tirage à la jonction des années (profitabilité à gauche, tirage à droite).

Msft


Cette conception a rapporté en 8 ans un revenu de 26% (moyenne annuelle de 2,75%) avec un prélèvement entre rééquilibrages de -2%. À la jonction des années, il n'y a pas de retrait.

Rentabilité et prélèvement pour chaque jour

Rentabilité et prélèvement au tournant des années

TSLA


Cette conception a rapporté en 8 ans un chiffre d'affaires de 45% (moyenne annuelle de 4,6%) avec un rabattement entre les rééquilibrages jusqu'à -15%. Mais tout cela en 2013, lorsque Tesla a grandi presque 5 fois. En fin d'année, le tirage est en hausse à -2%. Le passager le plus agité, mais aussi le plus rentable.

Rentabilité et prélèvement pour chaque jour

Rentabilité et prélèvement au tournant des années

Conclusion


Le bloc-notes vous permet de tester toutes les compositions de portefeuille. Il peut s'agir de fonds huméraux ou de plusieurs sociétés. Bien que généralement sans actif protecteur.

Dépôt GitHub .

Source: https://habr.com/ru/post/fr461583/


All Articles