Portfoliomanagement in R

Es gibt viele Programme zur Analyse und Verwaltung von Optionsportfolios. Sie befinden sich in Handelsterminals in Form von separaten kommerziellen Produkten oder Dienstleistungen auf Websites. Solche Programme unterliegen einer Reihe von Einschränkungen: Portfolios sind an eine Handelsplattform gebunden, Quotes werden aus einer bestimmten Quelle gepumpt und Parameter oder Szenarien können nur mit der mitgelieferten Software berechnet werden.


Ich habe die Aufgabe gelöst, Portfolios in verschiedenen Märkten mit R zu verwalten. Die Open-Source-Engine bietet viele Möglichkeiten: Portfolios werden in einem beliebigen DBMS oder Excel gespeichert oder vom Terminal heruntergeladen (QUIK, TWS, andere mit einer API). Die Quotes werden von ihrer Quelle (Terminal, Datenbank oder Website) gepumpt und jede Portfolioanalyse ist verfügbar!


Allgemeine Beschreibung


Marktdaten und Portfolio werden in Objekte der OptPort und OptMarket geladen. Das Portfolio wird entsprechend dem Markt neu bewertet. Auf der Grundlage dieser Daten werden der aktuelle Gewinn und die "Griechen" sowie ihr Profil berechnet. Das Portfolio-Profil (Abhängigkeit des Gewinns oder „Griechen“ vom Kurs des Basiswerts) wird berechnet und in einem Objekt der Klasse OptProfile . Integrierte Funktionen zeichnen ein Profildiagramm und ermöglichen den Vergleich der Profile mehrerer Portfolios.


Über den Link (1) am Ende des Artikels - eine Option zur Verwaltung des Mosbirzh-Optionsportfolios mit Verbindung zu QUIK und Access.


OptMarket Marktnotierungen


Ein Objekt der OptMarket Klasse OptMarket benötigt, um Aktienoptionskurse, Informationen zum zugrunde liegenden Vermögenswert und das aktuelle Datum zu speichern.


Ohne Marktpreise wird ein Portfolio zum inneren Wert neu bewertet.


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

OptPort-Portfolio


Ein Portfolio kann aus Optionen und einem Basiswert bestehen. Konstruktor
Erstellt ein Portfolio basierend auf einer Tabelle mit Transaktionen für eine bestimmte Basis
Vermögenswert. Transaktionen werden in einem gemeinsamen Standpunkt zusammengefasst.


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

Basierend auf den Transaktionen erstellen wir ein Objekt der OptPort Klasse:


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

Portfolio-Analyse


Portfoliobewertung


PortPricing bewertet das Portfolio zu aktuellen Preisen neu - wählt Optionspreise von OptMarket und fügt sie dem OptPort Portfolio hinzu. Für die Optionen von Moscow Exchanges ist es am einfachsten, sie zu dem theoretischen Preis neu zu bewerten, den die Börse selbst sendet und der immer bekannt ist ( price_at = 'theor' ).


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

Profit und die "Griechen"


Die PortValuation Funktion berechnet Portfolio-Parameter - nicht realisierte Gewinne und „Griechen“. Die Ergebnisse werden im Feld total_value des OptPort Objekts gespeichert.


 port = PortValuation(port) port$total_value 

Portfolio-Profil - OptProfile


Das OptProfile Objekt speichert das Portfolio-Profil in der Preisspanne des zugrunde liegenden Vermögenswerts.


Die PlotProfile Funktion erstellt ein auf ggplot2 basierendes ggplot2 .


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


Portfolio Zusammensetzung


Um die Zusammensetzung des Portfolios zu ändern, gibt es eine Funktion AddTrades . Sie fügt dem Portfolio einen Deal hinzu und berechnet eine neue Portfolioposition.



 #   -      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' 

Das Profil des neuen Portfolios kann mit dem alten verglichen werden. JoinProfiles Funktion
Kombiniert Profildaten, um ein gemeinsames Diagramm zu erstellen.


 #       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


Grundfunktionen lösen Grundprobleme. Meine Lösung wurde für einen bestimmten Zweck entwickelt - Analyse vieler Portfolios und Modellierung von Änderungen in diesen Portfolios. Den Quellcode finden Sie unter dem unten stehenden Link. Bonus - eine Basis zum Importieren von Daten aus QUIK und zum Einrichten von QUIK selbst für den Export.


Referenzen:
(1) Quellcode auf GitHub .

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


All Articles