Gestion de portefeuille en R

Il existe de nombreux programmes d'analyse et de gestion des portefeuilles d'options. Ils se trouvent dans des terminaux de trading, sous forme de produits ou services commerciaux distincts sur des sites. Ces programmes ont un certain nombre de restrictions: les portefeuilles sont liés à une plateforme de trading, les cotations sont pompées à partir d'une certaine source et les paramètres ou scénarios ne peuvent être calculés que par le logiciel.


J'ai résolu la tâche de gérer des portefeuilles dans différents marchés en utilisant R. Le moteur open source offre de nombreuses possibilités: les portefeuilles sont stockés dans n'importe quel SGBD ou Excel, ou téléchargés à partir du terminal (QUIK, TWS, tout autre avec une API); les devis sont pompés à partir de leur source (terminal, base de données ou site Web) et toute analyse de portefeuille est disponible!


Description générale


Les données de marché et le portefeuille sont chargés dans les objets des OptPort et OptMarket . Le portefeuille est réévalué en fonction du marché, sur la base de ces données, le bénéfice courant et les "Grecs" sont calculés, ainsi que son profil. Le profil du portefeuille (dépendance du profit ou «Grecs» sur le prix de l'actif sous-jacent) est calculé et stocké dans un objet de classe OptProfile . Les fonctions intégrées dessinent un graphique de profil et vous permettent de comparer les profils de plusieurs portefeuilles.


Par le lien (1) à la fin de l'article - la possibilité de gérer le portefeuille d'options de Mosbirzhy avec connexion à QUIK et Access.


OptMarket Market Quotes


Un objet de la classe OptMarket nécessaire pour stocker les cotations d'options sur actions, les informations sur l'actif sous-jacent et la date du jour.


Sans prix du marché, un portefeuille est réévalué à sa valeur intrinsèque.


 #    ( )  Access brd = GetBoard_fortsdb(ul) #    OptMarket mrkt = OptMarket(ul = 'SiZ9', #    ul_price = brd$ul_price, #    board = as.tbl(brd$board), #   now = as.Date('2019-11-12')) #   

Portefeuille OptPort


Un portefeuille peut être composé d'options et d'un actif sous-jacent. Constructeur
crée un portefeuille basé sur une table de transactions pour une base donnée
atout. Les transactions sont résumées dans une position commune.


 #    Access (      QUIK) trades = GetTrades_fortsdb() # ..     ,       trades = TickerToParams_fortsboard(trades, mrkt$board) 

Sur la base des transactions, nous créons un objet de la classe OptPort :


 port = OptPort(ul = 'SiZ9', trades = trades, name = 'Spread') 

Analyse de portefeuille


Évaluation du portefeuille


PortPricing réévalue le portefeuille aux prix actuels - sélectionne les prix des options d' OptMarket et les ajoute au portefeuille OptPort . Pour les options de Moscow Exchanges, le plus simple est de les réévaluer au prix théorique que la bourse elle-même diffuse et est toujours connu ( price_at = 'theor' ).


 port = PortPricing(port, mrkt, price_at = 'theor') 

Le profit et les «Grecs»


La fonction PortValuation calcule les paramètres du portefeuille - gains non réalisés et «Grecs». Les résultats sont stockés dans le champ total_value de l'objet OptPort .


 port = PortValuation(port) port$total_value 

Profil de portefeuille - OptProfile


L'objet OptProfile stocke le profil de portefeuille dans la fourchette de prix de l'actif sous-jacent.


La fonction PlotProfile crée un graphique de profil basé sur ggplot2 .


 myprofile = OptProfile(optport = port, params = c('pl', 'delta', 'theta', 'vega'), ul_range = 0.05 #         ) PlotProfile(myprofile) 


Composition du portefeuille


Pour modifier la composition du portefeuille, il existe une fonction AddTrades . Elle ajoute une opération au portefeuille et calcule une nouvelle position de portefeuille.



 #   -      newtrade = data.frame(ul='SiZ9', ticker='Si63500BX9', xtype='p', strike=63500, expdate=as.Date('2019-12-19'), tradeprice=500, q=-1 ) #    port2 = AddTrades(port = port, trades = newtrade) port2$name = 'Changed' 

Le profil du nouveau portefeuille peut être comparé à l'ancien. Fonction JoinProfiles
Combine les données de profil pour créer un graphique commun.


 #       port2 = port2 %>% PortPricing(., mrkt, price_at = 'theor') %>% PortValuation(.) #    myprofile2 = OptProfile(optport = port2, params = c('pl', 'delta','theta', 'vega'), ul_range = 0.05) #   profiles = JoinProfiles(list(myprofile, myprofile2)) PlotProfile(profiles) 


Total


Les fonctions de base résolvent les problèmes de base. Ma solution a été développée dans un but précis - analyse de nombreux portefeuilles et modélisation des changements dans ces portefeuilles. Vous pouvez trouver le code source sur le lien ci-dessous. Bonus - une base pour importer des données depuis QUIK et configurer QUIK lui-même pour l'exportation.


Références:
(1) Code source sur GitHub .

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


All Articles