Gerenciamento de portfólio em R

Existem muitos programas para analisar e gerenciar portfólios de opções. Eles estão em terminais comerciais, na forma de produtos ou serviços comerciais separados nos sites. Esses programas têm várias limitações: os portfólios estão vinculados a uma plataforma de negociação, as cotações são extraídas de uma fonte específica e os parâmetros ou cenários só podem ser calculados usando o software fornecido.


Resolvi a tarefa de gerenciar portfólios em diferentes mercados usando R. O mecanismo de código aberto oferece muitas possibilidades: os portfólios são armazenados em qualquer DBMS ou Excel ou baixados do terminal (QUIK, TWS, qualquer outro com uma API); as cotações são extraídas de sua fonte (terminal, banco de dados ou site) e qualquer análise de portfólio está disponível!


Descrição geral


Os dados de mercado e o portfólio são carregados em objetos da OptMarket e OptMarket . A carteira é reavaliada de acordo com o mercado, com base nesses dados, é calculado o lucro atual e são calculados "gregos", bem como seu perfil. O perfil do portfólio (dependência do lucro ou "gregos" do preço do ativo subjacente) é calculado e armazenado em um objeto da classe OptProfile . As funções internas desenham um gráfico de perfil e permitem comparar os perfis de vários portfólios.


Pelo link (1) no final do artigo - uma opção para gerenciar o portfólio de opções de ações da Mosbirzha com conexão com QUIK e Access.


Cotações do mercado OptMarket


Um objeto da classe OptMarket necessário para armazenar cotações de opções de ações, informações sobre o ativo subjacente e a data atual.


Sem preços de mercado, uma carteira é reavaliada a 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')) #   

Portfólio OptPort


Um portfólio pode consistir em opções e um ativo subjacente. Construtor
cria um portfólio com base em uma tabela de transações para uma determinada base
ativo. As transações são resumidas em uma posição comum.


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

Com base nas transações, criamos um objeto da classe OptPort :


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

Análise de portfólio


Avaliação de portfólio


PortPricing reavalia o portfólio a preços atuais - seleciona os preços das OptMarket do OptMarket e os adiciona ao portfólio OptPort . Para as opções de bolsas de Moscou, a coisa mais simples é reavalia-las ao preço teórico que a própria bolsa transmite e é sempre conhecido ( price_at = 'theor' ).


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

Lucro e os "gregos"


A função PortValuation calcula os parâmetros do portfólio - ganhos não realizados e "gregos". Os resultados são armazenados no campo OptPort objeto OptPort .


 port = PortValuation(port) port$total_value 

Perfil do portfólio - OptProfile


O objeto OptProfile armazena o perfil do portfólio na faixa de preço do ativo subjacente.


A função PlotProfile cria um gráfico de perfil com base no ggplot2 .


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


Composição do portfólio


Para alterar a composição do portfólio, existe uma função AddTrades . Ela adiciona um acordo ao portfólio e calcula uma nova posição no portfólio.



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

O perfil do novo portfólio pode ser comparado com o antigo. Função JoinProfiles
Combina os dados do perfil para criar um gráfico comum.


 #       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


Funções básicas resolvem problemas básicos. Minha solução foi desenvolvida para uma finalidade específica - análise de muitos portfólios e alterações de modelagem nesses portfólios. Você pode encontrar o código fonte no link abaixo. Bônus - uma base para importar dados do QUIK e configurar o próprio QUIK para exportação.


Referências:
(1) Código fonte no GitHub .

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


All Articles