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 .