Gestión de cartera en R

Existen muchos programas para analizar y administrar carteras de opciones. Se encuentran en terminales comerciales, en forma de productos o servicios comerciales separados en los sitios. Dichos programas tienen una serie de restricciones: las carteras están vinculadas a una plataforma de negociación, las cotizaciones se bombean desde una determinada fuente y los parámetros o escenarios solo pueden calcularse proporcionados por el software.


Resolví la tarea de administrar carteras en diferentes mercados usando R. El motor de código abierto ofrece muchas posibilidades: las carteras se almacenan en cualquier DBMS o Excel, o se descargan desde el terminal (QUIK, TWS, cualquier otro con una API); ¡las cotizaciones se bombean desde su fuente (terminal, base de datos o sitio web) y cualquier análisis de cartera está disponible!


Descripción general


Los datos de mercado y la cartera se cargan en objetos de las OptPort y OptMarket . La cartera se revalúa según el mercado, en función de estos datos se calculan los beneficios actuales y los "griegos", así como su perfil. El perfil de cartera (dependencia del beneficio o "griegos" del precio del activo subyacente) se calcula y almacena en un objeto de la clase OptProfile . Las funciones integradas dibujan un gráfico de perfil y le permiten comparar los perfiles de varias carteras.


Por el enlace (1) al final del artículo, una opción para administrar la cartera de opciones sobre acciones de Mosbirzha con conexión a QUIK y Access.


OptMarket Market Quotes


Se necesita un objeto de la clase OptMarket para almacenar cotizaciones de opciones sobre acciones, información sobre el activo subyacente y la fecha actual.


Sin precios de mercado, una cartera se revalúa a su valor intrínseco.


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

Portafolio OptPort


Una cartera puede consistir en opciones y un activo subyacente. Constructor
crea una cartera basada en una tabla de transacciones para una base dada
activo. Las transacciones se resumen en una posición común.


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

Según las ofertas, cree un objeto de la clase OptPort :


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

Análisis de cartera


Valoración de cartera


PortPricing reevalúa la cartera a los precios actuales: selecciona los precios de las OptMarket de OptMarket y los agrega a la cartera de OptPort . Para las opciones de Intercambios de Moscú, lo más simple es reevaluarlas al precio teórico que el intercambio mismo transmite y siempre se conoce ( price_at = 'theor' ).


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

El beneficio y los "griegos"


La función PortValuation calcula los parámetros de la cartera: ganancias no realizadas y "griegos". Los resultados se almacenan en el campo OptPort objeto OptPort .


 port = PortValuation(port) port$total_value 

Perfil de cartera - OptProfile


El objeto OptProfile almacena el perfil de cartera en el rango de precios del activo subyacente.


La función PlotProfile crea un gráfico de perfil basado en ggplot2 .


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


Composición de cartera


Para cambiar la composición de la cartera hay una función AddTrades . Agrega un trato a la cartera y calcula una nueva posición de cartera.



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

El perfil de la nueva cartera se puede comparar con el anterior. Función JoinProfiles
Combina datos de perfil para construir un gráfico común.


 #       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


Las funciones básicas resuelven problemas básicos. Mi solución fue desarrollada para un propósito específico: el análisis de muchas carteras y los cambios de modelado en estas carteras. Puede encontrar el código fuente en el siguiente enlace. Bonificación: una base para importar datos desde QUIK y configurar QUIK para la exportación.


Referencias
(1) Código fuente en GitHub .

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


All Articles