Mês: março 2019

Precificação de opções via redes neurais

Precificação de opções via redes neurais

Em 1973, Fischer Black, Myron Scholes e Robert Merton publicaram uma maneira analítica para precificar opções, de modo que se pudesse relacionar a dinâmica do preço do ativo subjacente, uma taxa de juros livre de risco, o intervalo de tempo até a data de expiração da opção, o strike da opção e a volatilidade futura deste ativo, sem depender de um retorno esperado (algo muito mais imprevisível).

HIPÓTESES DO BLACK & SCHOLES

Como já vimos em artigos anteriores, a fórmula de precificação de Black & Scholes (Black 1973) assumia a hipótese de lognormalidade para os retornos do ativo subjacente, além de que a volatilidade implícita do ativo se manteria constante para opções de um mesmo ativo e de mesmo moneyness. Em relação a hipótese de lognormalidade, isso nos diz que temos um método paramétrico de precificação, o que pode ser ruim (temos que assumir uma distribuição que não se ajusta com o que acontece nos mercados, que apresentam caudas longas), e a volatilidade implícita constante também não se concretiza, dando origem ao fenômeno chamado de “smile de volatilidade”, algo também já tratado nos nossos artigos antigos.

ENSINANDO UMA MÁQUINA A PRECIFICAR OPÇÕES

Na década de 70, seria muito difícil construir um método prático e data-driven de precificação de opções, já que não se possuía poder computacional suficiente para realizar a mineração necessária; tínhamos que ter uma maneira analítica de precificação, o que começou com a fórmula de Black & Scholes (que garantiu o Prêmio Nobel aos pesquisadores). A partir da década de 90, com o avanço computacional, alguns pesquisadores começaram a se interessar por métodos data-driven de precificação, podendo se desvencilhar das hipóteses pouco realistas.

Para tanto, podemos pensar em algumas possibilidades: tendo informações sobre as características de uma determinada opção (o seu preço de mercado, uma volatilidade implícita realizada, um determinado intervalo de tempo até a data de expiração, com o moneyness da opção, etc…), teríamos condições de ensinar um algoritmo a precificar esta opção?

Em (Hutchinson 1994), esta abordagem foi realizada com a utilização do método das redes neurais. A abordagem do pesquisadores do MIT era de ensinar uma máquina a precificar opções de maneira não-paramétrica e que não assumisse as hipóteses tão contestadas por outros pesquisadores. Colocando como input as informações teoricamente determinantes para os preços das opções, o artigo buscou ver o ajuste das previsões realizadas com o que realmente aconteceu nos mercados. Outro bom artigo, aplicando a mesma técnica mas para opções de outro mercado, é o de (Huynh 2018).

REDES NEURAIS



Como um resumo sobre o método das redes neurais, (Friedman 2001, 389) traz que a ideia é extrair combinações lineares entre as variáveis explicativas e então modelar a variável dependente (no nosso caso, o prêmio da opção) como uma função não-linear das variáveis explicativas. O modelo de redes neurais também é chamado de multilayer perceptron, onde o modelo comprime diversas camadas de regressões logísticas com não-linearidades contínuas (Bishop 2006, 226); assim é formada a função de máxima verossimilhança que é a base das “redes de treino”.

Ao contrário do que se pensa, a pesquisa sobre métodos de inteligência artificial, e mais especificamente de redes neurais, começou já na década de 40, com (McCulloch 1943), em “A Logical Calculus of The Ideas Immanent in Nervous Activity”. A ideia era de simular as redes neurais do cérebro como forma de computadores estarem aptos a aprenderem e tomarem decisões como um humano.

Para isso, matematicamente, construímos uma função de ativação \(y\), onde \(y\) é uma função de uma função não-linear das combinações lineares entre os inputs dados (\(\phi(x)\)), ponderada por pesos que, inicialmente, são aleatórios (\(w_j\)), entre 0 e 1.

\[ y(\mathbf{x, w})=f\left(\sum_{j=1}^M w_j\phi_j(\mathbf{x})\right) \]

Esses pesos, com o método de treino estipulado (backpropagation), será alterado de forma com que se alcance o erro mínimo da função para os dados inseridos. Temos que M é o número de combinações lineares, que, somados, gerarão o primeiro input para o treino da função.

FEED FORWARD NETWORK

Agora, derivando o algoritmo para chegarmos em \(y(\mathbf{x, w})\), trazido acima:

1º – Primeiramente, teremos o somatório da multiplicação do vetor de pesos \(\mathbf{w}\) com o vetor de inputs \(\mathbf{x}\). Temos que \(w_{ji}\)é um vetor de pesos que serão alterados ao longo do treinamento da rede. Faremos esse mesmo cálculo para todas as nossas variáveis

\[ a_{ji} = \sum_{i = 0}^{D} w_{ji}^{(1)}x_i \]

2º – Temos de transformar o vetor de valores ponderados \(a_{ji}\) através de uma função de ativação, que poderá ser uma função que já é conhecida de econometristas e estudiosos da estatística: a função sigmoidal, que é a utilizada na regressão logística

\[ \sigma(a) = \frac{1}{1 + exp(-a)} \]

Com isso, temos então o que é chamado de “hidden layer”.

3º – Realizar novamente a ponderação dos valores, porém agora utilizando os hidden layers como input.

Logo, teremos uma nova ativação dos outputs pela função sigmoidal, dado por um input de uma função sigmoidal anterior. Nesse caso, duas camadas da rede neural foram utilizadas. Desta forma, podemos combinar estas várias etapas e chegar nesta função para a rede neural:

\[ y(\mathbf{x, w})= \sigma(\sum_{j=0}^M w_{kj}^{(2)} \sigma(\sum_{i=0}^D w_{ji}^{(1)}x_i)) \]

BACKPROPAGATION

Tendo um vetor de outputs, ou seja, valores preditos para o target utilizado, buscamos um vetor de pesos que minimize a seguinte função:

\[ E(\mathbf{w})= \frac{1}{2} \sum_{n=1}^N ||\mathbf{y(x_n, w) – t_n}||^2 \]

Ou seja, sendo \(y(\mathbf{x, w})\) um vetor de outputs e \(\mathbf{t_n}\) o vetor dos targets iniciais, queremos minimizar a soma dos erros quadrados. Os parâmetros que são alteráveis são os pesos, tanto da primeira camada quanto da segunda utilizada. OBS: O fator (½) é adicionado para ser cancelado junto com o expoente durante a diferenciação

A partir daqui, temos um problema computacional: simular infinitas possibilidades de vetores de pesos para identificar quais são os vetores que minimizam a soma do erro quadrado é uma tarefa computacionalmente exigente. Será que temos como usar a matemática para facilitar esse processo?

Para este problema, o método das redes neurais se utiliza do gradient descent, que é uma forma iterativa para se alcançar o mínimo de uma função.



Queremos encontrar os vetores de pesos que minimizem a função erro. Assim, aplicamos a regra da cadeia para derivar a função erro:

\[ {\frac {\partial E}{\partial w_{ij}}}={\frac {\partial E}{\partial o_{j}}}{\frac {\partial o_{j}}{\partial {\text{net}}_{j}}}{\frac {\partial {\text{net}}_{j}}{\partial w_{ij}}} \] Sendo:

\[ 1) {\frac{\partial net_j}{\partial w_{ij}}}={\frac {\partial }{\partial w_{ij}}}\left(\sum _{k=1}^{n}w_{kj}o_{k}\right) \]

que será simplesmente \(o_k\), sendo \(o_k\) um vetor que se for em relação a primeira camada, o input bruto; se for em relação a segunda layer, será o output da função de ativação.

\[ 2) {\frac{\partial o_j}{\partial net_{j}}}={\frac {\partial }{\partial net_{j}}} \varphi(net_j) = \varphi(net_j)(1 – \varphi(net_j)) \]

que é a derivada parcial da função de ativação (neste caso, a função sigmoidal), e a função abaixo, que é a derivada parcial da função perda com relação à hidden layer:

\[ 3) {\frac{\partial E}{\partial o_{j}}}={\frac {\partial E }{\partial y}} = {\frac {\partial}{\partial y}} {\frac {1}{2}}(t – y)^2 = y – t \]

Assim, atualizaremos os pesos com os resultados obtidos através da otimização, e seguiremos o processo iterativo de encontrar o mínimo da função.

OBS: Um problema do método do gradient descent é que ele pode encontrar um mínimo local, não um mínimo global, que é o que nos interessaria. Há formas de contornar este problema, como, por exemplo, assumindo uma versão probabilística para a função perda. Dada a sua complexidade, deixaremos para artigos futuros a sua explicação. Além disso, outras formas de se alcançar melhores resultados com redes neurais para opções seria de segmentar as opções em ATM (at the money), OTM (out of the money), podendo captar melhor as características de ambas as situações.

Também, por utilizarmos um dataset pequeno e gratuito, a estimação foi feita dentro da amostra; vale ressaltar a possibilidade de overfitting. Por ser uma abordagem didática, vale a demonstração. A literatura recomenda alguns anos em informações diárias para uma precificação mais assertiva, mas, por serem bases pagas (e muito bem pagas), deixaremos uma abordagem mais técnica para um futuro post.

REDE NEURAL NO R

Os dados foram retirados do site ivolatility.com

##Importando os dados que serão utilizados

smile_volatilidade <- 
  rio::import("../../static/input/IV_Raw_Delta_surface.csv") %>%
  select(period, moneyness, iv) %>% 
  mutate(period = period/365)

##Executando o algoritmo através do pacote neuralnet
##Foram escolhidas duas hidden layers para análise

rede_neural <- neuralnet(iv ~ period+moneyness, smile_volatilidade, hidden = 2)
iv_predito <- as.data.frame(rede_neural$net.result) 

df_nn <- cbind(smile_volatilidade$iv, iv_predito)

colnames(df_nn) <- c("volatilidade_implicita", "volatilidade_predita")

##Criando uma coluna com os erros da predição

df_nn <- df_nn %>% mutate(erro = volatilidade_implicita - volatilidade_predita)

hist(df_nn$erro,
     main = "Distribuição dos erros da volatilidade realizada pela predita",
     xlab = "Erro",
     ylab = "Frequência",
     xlim = c(-0.04, 0.04))

plot(rede_neural, rep = "best")



Bishop, Christopher M. 2006. Pattern Recognition and Machine Learning. springer.

Black, Myron, Fischer e Scholes. 1973. “The Pricing of Options and Corporate Liabilities.” Journal of Political Economy 81 (3). The University of Chicago Press: 637–54.

Friedman, Trevor e Tibshirani, Jerome e Hastie. 2001. The Elements of Statistical Learning. 10. Springer series in statistics New York.

Hutchinson, Andrew W e Poggio, James M e Lo. 1994. “A Nonparametric Approach to Pricing and Hedging Derivative Securities via Learning Networks.” The Journal of Finance, no. 3. Wiley Online Library: 851–89.

Huynh. 2018. “Modelling and Forecasting Implied Volatility Using Neural Network.” Hanken School of Economics.

McCulloch, Walter, Warren S e Pitts. 1943. “A Logical Calculus of the Ideas Immanent in Nervous Activity.” The Bulletin of Mathematical Biophysics 5 (4). Springer: 115–33.

Posted by Gabriel Dias in Derivativos & Riscos, 1 comment
Algo trading com Quantopian

Algo trading com Quantopian

Abriremos nossas discussões sobre algorithmic trading, ou algo trading para os iniciados, fazendo um review da plataforma mais popular atualmente, o Quantopian.

Da própria definição sobre a plataforma temos que:

O Quantopian é uma empresa de investimentos quantitativos com origem em crowd source. Nós inspiramos pessoas talentosas de todo o mundo a escrever algoritmos de investimento.

O Quantopian fornece capital, educação, dados, um ambiente de pesquisa e uma plataforma de desenvolvimento para autores de algoritmos (quants).

Mas o que isso tudo significa na prática? O Quantopian nasceu com o desejo de encontrar na multidão de pessoas, talentosos quants que pudessem escrever algoritmos de investimentos bons o suficiente para receberem um aporte de capital. Da necessidade de como fazer esta visão tornar-se realidade, o quantopian foi sendo moldado. Talvez a ordem das palavras destacadas no parágrafo anterior devessem constar na forma inversa. A plataforma surgiu como um ambiente de desenvolvimento, agregou um ambiente de pesquisa, fornece dados gratuitos e pagos (premium), edução na forma de tutorias e lectures e por fim, se o seu algoritmo se destacar na competição, eles financiam um fundo quantitativo que roda o seu algo e lhe paga royalties.

Ambiente de desenvolvimento

A chamada IDE (de Interactive Development Environment) é toda baseda na linguagem Python, a mais utilizada1 atualmente para ciência de dados e machine learnig. É na IDE que a implementação e o backtesting de estratégias deve ser feito. Ela registra automaticamente as principais métricas de desempenho e compara sua estratégia com um benchmark. Algoritmos também podem ser simulados usando dados ao vivo, algo conhecido como paper trading. Operar com dinheiro real, live trading não é mais possível no Quantopian. No passado já houve uma integração com uma conhecida corretora americana, mas esta possibilidade não existe mais.

Nesta IDE três métodos estão definidos para serem implementados pelo quant, um deles é obrigatório que são as definições de setup do backtesting que devem constar no método initialize(context). Os métodos opcionais são handle_data(context, data), em geral utilizado em algoritmos minuto-a-minuto e before_trading_start(context, data) muito utilizado em conjunto com algum método de pipeline que baixa e processa o algoritmo de investimento sobre um determinado universo de ativos.

Na figura abaixo podemos ver uma amostra parcial do ambiente de desenvolvimento, com o código a esquerda e alguns resultados de backtesting a direita e logs da simulação logo abaixo.

Ambiente de desenvolvimento - IDE

Ambiente de pesquisa

O módulo de research do quantopian é fundamentado no conceito de notebooks do IPython. De fato, o ambiente é um Jupyter notebook, como toda a sua interatividade disponível. Neste notebook o quant pode programar seus algoritmos e testá-los sem fazer um backtest completo.

Nesta plataforma aberta pode-se carregar todos os dados disponibilizados pela plataforma e explorar novas ideias de investimento. O ambiente de pesquisa é o lugar para fazer hipóteses e análises, “comprar empresas de baixo P/L realmente dá lucro a longo prazo?”, “se eu montar uma estratégia long-short com os fatores de Fama&French, vou ser bem sucedido?”, estes questionamentos devem ser feitos e analisados no ambiente de pesquisa. Neste ambiente se tem acesso a todos os dados, volume, fundamentos corporativos e outros conjuntos de dados, incluindo dados de sentimento entre outros, para os EUA. Para outros países, incluindo o Brasil, existem dados diários de preço e volume e fundamentos, que exploraremos na seção seguinte.

O ambiente de pesquisa também é útil para analisar o desempenho de backtests. Você pode carregar o resultado do backtest de um algoritmo e analisar resultados e comparar com desempenhos de outros algoritmos.

Por ser implementado em Python, ele abre a possibilidade de usar bibliotecas poderosas para analisar dados de séries temporais, como StatsModels para estatística e scikit-learn para machine learning em Python. Estas bibliotecas também estão disponíveis no ambiente de desenvolvimento e seu algoritmo pode fazer uso destas e participar da competição.

Além disso, o Quantopian desenvolveu2 várias ferramentas internas, como o Alphalens – uma nova ferramenta para análise de fatores “alfa”. Aqui deixo o alfa entre parentêses pois a ideia deles é encontrar uma métrica, que chamam de “fator”, que explique os retornos do portfolio. Portanto, no melhor entendimento deste autor, se trata de beta e não de alfa.

Na figura abaixo temos um amostra do ambiente de pesquisa. Pode-se verificar que em muito pouco este difere de um típico Jupyter notebook.

Bases de dados

Certamente o foco da empresa ainda é os EUA. Para aquele mercado a plataforma conta com dados históricos em barras de 1 minuto para ações, ETFs e futuros dos EUA desde 2002 até o último dia completo de negociação.

Os dados históricos de preço ou volume é ajustado para splits, fusões e dividendos na data atual da simulação. Esse ajuste é feito para que o algoritmo possa fazer cálculos corretos usando os valores da janela histórica.

O Quantopian também fornece acesso a dados fundamentalistas e de demonstrações contábeis. Os dados da Morningstar consistem em mais de 600 métricas que medem o desempenho financeiro das empresas. Também estão disponívei dados do vendor Factset. O uso mais comum desses dados é a filtragem para um subconjunto de ativos para uso posterior em um algoritmo.

O banco de dados inclui todas as ações e ETFs negociados desde 2002, mesmo aqueles que não são mais negociados. Isso é muito importante porque ajuda a prevenir o famoso survivorship bias, um dos vilões de “super” algoritmos que funcionam somente no backtesting. Bancos de dados que omitem títulos que não são mais negociados ignoram falências e outros eventos importantes, e levam a um falso otimismo sobre um algoritmo.

Uma lista com todas as bases de dados disponíveis pode ser consultada aqui. Uma interessante opção para aqueles que desejam utilizar a plataforma como meio de pesquisa é a possibilidade de colocar no ambiente o seu próprio conjunto de dados! Mesmo que este conjunto de dados não possa fazer parte de um algoritmo de competição, esta possibilidade é muito interessante para descobrir novas estratégias lucrativas com dados que por ventura não estejam disponíveis no Quantopian, e após esta descoberta, utilizar a plataforma de sua preferência para negociar.

Felizmente, e para alegria geral da nação, nem só de EUA vive o Quantopian. No final de 2018 a plataforma anunciou que passou a suportar, no ambiente de pesquisa, dados de preço/volume e dados fundamentalistas de 26 países. O Brasil está entre eles. Os dados de preços e fundamentos para cada um desses países estão disponíveis desde 2004. Os dados de preços são diários, incluindo as barras do OHLCV (Open-High-Low-Close-Volume). Os dados de fundamentos são do FactSet Fundamentals.

Educação

No quesito educação do investidor a plataforma oferece recursos como um ativo fórum de discussões, tutoriais para aprendizagem inicial e uma série de lectures que são vídeos demonstrando alguns usos mais avançados dos recursos.

No fórum podem ser compartilhados tanto backtests quanto notebooks e a troca de ideias de aloritmos é fomentada. Entretanto, predominam as discussões acerca de implementação dos algos e correção de bugs. Os tutoriais são bastante instrutivos, e recomenda-se iniciar por ali. Apesar de a linguagem de programação ser o conhecido Python, a plataforma faz uso intenso de sua API proprietária. São diversas classes, métodos e atributos que não fazem parte do core ou mesmo das famosas bibliotecas da linguagem e sim, são criações do Quantopian. Como iniciar diretamente pela referência a API é muito difícil e certamente logo afastaria iniciantes da plataforma, a empresa fez bons e simples tutoriais que já permitem ao quant wannabe criar seus primeiros algos, analisá-los através do Alphalens e rodar o backtesting na IDE.

Mas, na opinião deste autor, a verdadeira estrela desta seção são as lectures que podem ser vistas nesta lista. Estas são vídeos, no estilo webinar, e são acompanhadas de seus respectivos notebooks que podem ser clonados e modificados ao gosto do usuário. Os temas abordados são abragentes e relevantes, indo desde introdução ao NumPy e pandas, passando por conceitos importantes como momentos estatísticos e regressão múltipla, indo até assuntos avançados e muito pertinentes para qualquer algo trader como pairs trading, cointegração, análise de componentes principais e filtros de Kalman. São ao todo 56 lectures, material de ótima qualidade.

Conclusão

O Quantopian é uma excelente plataforma para pesquisar e implementar estratégias de negociação. Entre seus pontos fortes destacamos o ambiente de pesquisa, baseado na interatividade dos notebooks, a vasta base de dados, o uso da linguagem Python e os tutoriais e lectures que fornecem um bom suporte para o iniciante. Entre os pontos negativos da plataforma o uso de muitas classes e métodos proprietários, com pouca documentação, soam como uma caixa preta para o usuário e dificultam bastante o aprendizado inicial.

Ainda assim, se você está procurando um lugar para começar, a plataforma é uma das mais completas e sugere-se iniciar pelos tutoriais e então aprofundar seus conhecimentos com a série Lectures.

Em um próximo artigo, o Clube de Finanças implementará um algoritmo de demonstração, explicando o passo-a-passo para realizar a pesquisa e implementar o backtesting na IDE.


  1. Retirado de https://www.kaggle.com/kaggle/kaggle-survey-2017#multipleChoiceResponses.csv 

  2. Desenvolveu e mantém em código aberto boa parte de sua estrutura no repositório: https://github.com/quantopian 

Posted by Rafael F. Bressan in Derivativos & Riscos, 2 comments