Movimento Browniano Geométrico para Previsão no Mercado de Ações

De Física Computacional
Ir para navegação Ir para pesquisar

Grupo: Eric Naiber, Vitória Xavier

Forecasting é uma palavra da língua inglesa que dá ideia de fazer uma previsão que pode não ser certeira, esta é a palavra que define bem o que realizamos ao longo deste trabalho. A ideia é fazer um forecasting do preço das ações de determinada empresa (utilizamos neste trabalho os dados do Magazine Luiza/MGLU3) utilizando de métodos matemáticos e futuramente estatísticos junto de algoritmos escritos na linguagem Python.

Mercado de ações

O mercado de ações de uma forma mais generalizada é quando temos um conjunto de empresas colocando à venda uma porcentagem/fração de seu capital social, esta fração é conhecida como uma ação. O valor de uma ação é volátil, podendo variar muito tanto para cima quanto para baixo em um curto intervalo de tempo, podendo trazer grandes lucros ou grandes prejuízos, como por exemplo: Em 2021 o preço unitário de uma ação do Magazine Luiza custava em média 20 reais, e hoje (09/05/2022) o preço não passa dos 5 reais. Uma queda tão drástica quanto esta traz aos investidores inúmeras inseguranças e incertezas quanto ao futuro, se seria viável investir novamente ou não. Para o entendimento do que foi feito neste trabalho, o que foi dito é o suficiente, porém quanto mais conhecimento sobre mundo financeiro, melhor o aproveitamento. Recomendamos o livro “Os Axiomas de Zurique” para o leitor interessado em entender mais sobre o assunto.

Figura 1: Comportamento de 3 ações das empresas Magazine Luiza, B2W Digital(responsável pelas lojas Americanas, etc) e ViaVarejo (Casas Bahia, Ponto Frio, etc).

Movimento Browniano e Movimento Browniano Geométrico

Em 1828, o biólogo Robert Brown observou comportamento irregular e ininterrupto de grãos de pólen suspensos em água, o que posteriormente foi nomeado de Movimento Browniano [1]. Acreditava-se que esse movimento aleatório era advindo de uma força vital do próprio pólen. Quase 80 anos se passaram com diferentes pesquisadores tentando desvendar a natureza do movimento browniano até que Einstein, em 1905, obteve a expressão matemática que caracterizou esse comportamento. O movimento do pólen sobre a água não tratava-se de um fenômeno biológico, mas sim físico. Mostrou que esse movimento se dá pelo choque com outras partículas, gerando movimento não contínuo[2]. Sua solução representou grandes avanços para física e química, e dentre elas lançou as bases de uma das teorias mais bem sucedidas para a modelagem de sistemas naturais.

Einstein, em 1905 [3], com relação ao primeiro experimento em que o movimento browniano foi observado, demonstrou que o número de partículas suspensas em um ponto do espaço com relação a um instante temporal assumia uma distribuição gaussiana. Além disso, o MB é um processo markoviano, dado que seu estado futuro depende apenas do presente, e não de eventos passados [4][5]. Portanto, o movimento Browniano é tido como um modelo referencial para processos estocásticos e usado para entender diferentes sistemas em não equilíbrio. Esse modelo pode ser aplicado no estudo de comportamento de diversos sistemas dotados de movimentos aleatórios cuja distribuição de probabilidades seja gaussiana. A fórmula do movimento browniano é dada por:

B(t)=σW(t)


Sendo σ é a variância e Wt o processo de Wiener. Sua distribuição normal é dada por:


N[0,s−t]


Movimento Browniano Geométrico

O movimento browniano geométrico é a distribuição logarítmica do movimento browniano, gerando apenas valores positivos e provocando um deslocamento na curva gaussiana pelo qual o MB é caracterizado. Ele é definido pela equação diferencial estocástica abaixo:


dSt=μStdt+σtStdW,t∈[t0,T]


Onde S(t) é processo estocástico, Wt um processo de Wiener, μ é a média e σ é a variância, ambas são constantes.

Para resolvermos a equação, apresentaremos rapidamente o lema de Itô, identidade para encontrar o diferencial de funções de processos estocásticos dependentes de tempo. É dado por:

dy(t,Xt)=∂y∂tdt+∂y∂XtdXt+12∂2y∂Xt2dXt2


Onde y é a função do processo estocástico dependente do tempo e Xt é o processo estocástico. Vamos renomear o processo estocástico para St. Agora, iremos aplicar transformação logarítmica, ferramenta que será relevante nos próximos passos.


g(S(t))=ln(S(t))


Aplicando o lema de Itô no nosso sistema:

dg(t,St)=(∂g)/(∂t)(dt)+(∂g)/(∂St)(dSt)+1/2(∂2g)/(∂St)2(dSt2)
dg(t,St)=∂g∂t(dt)+∂g(∂St(dSt)+12∂2g∂St2dSt2

Aplicando g(St)=ln(St), temos que as derivadas parciais são:


(∂g)/(∂t)(dt)=0,(∂g)/(∂St)(dSt)=1/(St),(∂2g)/(∂St)2(dSt2)=−1/(St)2
∂g∂tdt=0,∂g∂StdSt=1St,∂2g∂St2(dSt2)=−1St2

E utilizando propriedades de cálculo estocástico:


dSt2=σ2St2dt

A substituição e desenvolvimento desses valores e a equação dSt na equação dg(t,St) resulta em:



Integrando ambos lados da equação, chegamos em:


g(St)−g(St0)=(μ−1/2σ2)(T−t0)+σ(Wt−Wt0)

Aplicando o logaritmo em ambos lados da equação, como sugerido anteriormente, temos:


ln((St)/(St0))=(μ−1/2σ2)(T−t0)+σ(Wt−Wt0)


exp(ln((St)/(St0)))=exp((μ−1/2σ2)(T−t0))+σ(Wt−Wt0)

E finalmente chegamos na solução da equação diferencial estocástica do movimento browniano geométrico:


St=S0exp((μ−1/2σ2)(T−t0))+σ(Wt−Wt0)

Ou


St=S0exp((μ−1/2σ2)t)+σWt


Sua distribuição normal é dada por:


N[(μ−(σ2)/2)t,σ2t]


Sendo o primeiro termo a média e o segundo a variância.

Graficamente, a diferença entre movimento browniano e movimento browniano geométrico é apresentado abaixo[6]:

Figura 2: Comportamento do movimento browniano e sua distribuição de probabilidade.
Figura 3: Comportamento do movimento browniano geométrico e sua distribuição de probabilidade.

Na coluna da esquerda das figuras observamos os possíveis caminhos e seu destino e na coluna direita observamos a distribuição de probabilidade de cada destino ser atingido. É possível observar que o movimento browniano geométrico não assume valores negativos e seu deslocamento é linear. Sua média, nesses valores, está centrada em 1. Já o movimento browniano geométrico, por ter distribuição gaussiana, a média é zero.

Aplicação: Mercado Financeiro

Mercado financeiro é a plataforma de compra e venda de ativos financeiros, sendo eles ações, títulos, mercadorias e linhas de crédito. Seus agentes são o investidor, que tem o papel de emprestar dinheiro com a expectativa de receber lucro sobre ele, e o tomador de dinheiro, pessoa física ou jurídica que toma o dinheiro e o devolve ao investidor com juros mais tarde. O mercado de capitais é o setor do mercado financeiro que negocia as operações de venda e compra de ações. O investidor, ao comprar a ação, pode participar da sociedade da empresa ou receber parte do lucro dela. O objetivo do investidor é ganhar dinheiro com a valorização das ações e de sua venda.

No Brasil, essa plataforma de negociação é a bolsa de valores IBOVESPA, localizada em São Paulo. Em 2021, mais de 400 companhias brasileiras estavam listadas na B3 (como também chama-se a IBOVESPA) [7].

O valor de uma ação flutua dependendo de diferentes fatores, como economia, geopolítica, etc. Por isso, toda compra e venda de ações possui um risco intrínseco de perda de dinheiro devido à dificuldade de estimar o valor futuro. O investidor deve constantemente estar buscando informações para auxiliar no seu processo de decisão sobre compra, venda ou manutenção dos capitais. Os principais parâmetros para entender a movimentação do mercado de capitais são o preço das ações, a volatilidade financeira e o retorno de investimento:

  • Preço da ação: é o valor máximo recebido ao para vender uma ação ou o valor mínimo pago para comprar a ação. [8].
  • Volatilidade financeira: vulnerabilidade que o preço da ação tem a eventos, causando grandes oscilações do seu valor. É um parâmetro importante para garantir segurança na tomada de decisão.
  • Retorno sobre investimento: é o de lucro ou perda que o investidor teve sobre o valor investido.

O comportamento do mercado financeiro é estudado a partir de diferentes abordagens, com objetivo de elaborar estratégias para previsão dos índices ou preços futuros das ações, buscando maximizar o lucro do investidor.

A teoria do passeio aleatório é utilizada no campo das finanças, onde descreve que os processos no mercado de ações evoluem como um passeio aleatório e que predição não é possível [9]. O próximo movimento será determinado a partir do estado atual e não de estados passados, configurando um processo markoviano [10].

Assumindo que o mercado de ações possui comportamento estocástico e similar ao passeio aleatório, é possível utilizar modelos matemáticos que, a partir de dados que descrevem o cenário de compra e venda atual, descrevem possíveis cenários futuros de preço de ações e auxiliam o investidor a tomar decisões menos arriscadas.

Como citado na seção acima, o movimento Browniano é um tipo de caminhada aleatória. O movimento browniano geométrico, variação do movimento browniano padrão, assume apenas valores positivos e é amplamente utilizado no mercado financeiro. Aplicado ao mercado de ações, é definido pela equação:

S(t)=S(0)exp((μ−(σ2)/2)t+σWt)

Onde S(t) é o valor futuro da ação, S(o) é o valor inicial da ação, μ é o deslocamento (“drift”) diário, σ é a volatilidade diária e Wt é o processo de Wiener. O termo μ é um parâmetro de taxa de crescimento, onde seu valor positivo sinaliza tendência de crescimento e negativo sinaliza tendência de queda.

O MBG é um modelo muito utilizado no mercado financeiro por assumir propriedade markoviana, gerar apenas valores reais e ser de fácil implementação. Suas desvantagens é que o parâmetro volatilização é constante e não ocorrem os “jumps”, eventos maiores que afetam o cenário de maneira mais drástica (o caminho não é descontínuo) [11]

O MBG é assumido no modelo de Black-Scholes, modelo avançado e bastante utilizado nas simulações de economia. A ideia central deste modelo é enxergar o mercado como um sistema dinâmico de muitos corpos, tornando possível traçar analogias com conceitos da termodinâmica[12].

Esse trabalho irá trabalhar com o MBG apenas.

Simulações

A ideia é gerar números pseudo-aleatórios com um comportamento provável do preço da ação, os resultados serão discutidos mais adiante.

Para fazer as simulações foram necessárias 6 etapas.

Etapa 1: Adquirir os dados

Utilizamos o Google Sheets para baixar um documento .csv que continha todos os dados necessários, na figura abaixo é possível ver como os dados estão distribuídos na planilha.

Temos na tabela os valores máximos, mínimos, de abertura e fechamento de preço das ações, junto de sua data e volume (que não nos interessa).

Figura 2: Tabela de dados da Magazine Luiza. Para baixar uma tabela neste formato, basta utilizar o comando GOOGLEFINANCE() do próprio Google Sheets.


Etapa 2: Cálculos iniciais necessários

Precisamos da Taxa de Retorno Diária, Volatilidade Diária e Desvio Médio para poder gerar um número pseudo-aleatório que tenha um comportamento similar ao do preço da ação. Antes, é interessante fazer um paralelo entre mercado financeiro e o MBG.

Mundo Financeiro Movimento Browniano Geométrico
Taxa de Retorno Diária μ
Volatilidade Diária σ
Desvio Médio Drift

Para calcular a Taxa de Retorno Diária fazemos:

μ=∑i=1n(xin)

onde a soma de xi é a taxa de retorno anual, já n é a quantidade de dias que o mercado ficou aberto para trocas. Esta taxa dita o tamanho médio do passo em que a simulação percorrerá.

Agora para calcular a Volatilidade Diária:

σ=∑i=1n(xi−μ)2n

onde o somatório da diferença da Taxa de Retorno Diária menos uma parte da taxa de retorno anual é chamada de Volatilidade Anual. A volatilidade mostra o tamanho base extra que a simulação irá percorrer.

Por último temos o Drift, que mostra o tamanho e direção do passo dado na simulação (considerando uma distribuição normal):

Drift=μ−12σ2

Etapa 3: Aplicar à simulação

Utilizando o MBG, a tabela com as informações das ações e os valores calculados acima, é possível calcular o preço futuro da ação com base no que já ocorreu da seguinte forma:


S(t)=S(0)e(Drift)t+σZ


onde S(t) é o preço futuro da ação, S(0) é o preço atual da ação e Z é um número aleatório de 0 até 1 que segue uma distribuição normal.

Discussão e Resultados

Para a empresa em análise (Magazine Luiza) foi observado primeiramente o comportamento real do preço de fechamento da ação, como possível de se observar no gráfico abaixo. No eixo vertical temos o preço e no horizontal o tempo, a linha preta no meio demonstra o período em que a simulação irá começar a acontecer (intervalo entre 1 ano real e 1 ano simulado).

Figura 3:MGLU3 Stock Price, intervalo de dois anos.

Logo após a linha preta foi dado início às simulações, cada linha mostra um possível comportamento da ação, o usuário poderia (vendo o gráfico) tomar algum tipo de decisão e/ou criar um planejamento estratégico financeiro para os cenários onde o preço da ação é máximo após 1 ano (linha vertical preta) ou onde o valor é mínimo.

Figura 3:MGLU3 Stock Price, simulação do valor após um ano.

Por fim uma análise é feita comparando ambos os gráficos, é possível perceber que o caminho real que o preço da ação percorre está dentro do esperado para um cenário negativo, onde o preço da ação está em queda. A ideia seria que o usuário estivesse se planejado financeiramente para que o prejuízo não seja tão alto.

Figura 4:MGLU3 Stock Price, simulação do valor após um ano.

Funciona?

A pergunta que fica é: realmente funciona para prever o preço de uma ação?

A resposta é não. O mercado financeiro é muito mais complexo e possui um comportamento quase aleatório (se observado microeconomicamente), não é possível prever o preço de uma ação se baseando apenas no que ocorreu no passado, se fosse assim, a empresa que estudamos teria uma curva de crescimento indefinida, algo que não ocorre. Podemos sim fazer métodos matemáticos e estatísticos para analisar possíveis cenários, mas da forma em que fizemos esta ainda muito arcaico, porém serve bem para demonstração da ideia.

Como melhorar a simulação?

Podemos começar colocando pesos na geração de números aleatórios, onde cada ação (como mostrado na figura *, de empresas de varejo) influencia a outra, ou seja, se a maioria das empresas de varejo estão em queda isso deverá pesar, fazendo com que o próximo valor tenha uma probabilidade maior de cair também. Mas mesmo fazendo tudo o que foi comentado, teríamos apenas valores possíveis para o preço de uma ação, e nunca o valor certo. Concluindo, utilizar MBG (junto do método de Monte Carlo se possível) não será satisfatório para prever o preço de uma ação, mas sim para poder ver caminhos possíveis que a ação poderá tomar, fazendo com que o usuário consiga fazer um planejamento estratégico financeiro para evitar prejuízos e maximizar possíveis lucros.

Código para Simulação

Para gerar os gráficos acesse o link [[2]].

Código utilizado para as simulações.

import numpy as np
import matplotlib.pyplot as plt

"""
Previsão do valor de mercado MAGLU3

Data inicial: 02/01/2019
Data final: 19/04/2022
"""

Untreated = []

# Data original
OriginalDate = []
# Colocando o Valor do final do dia.
OriginalStockPrice = []

"""
Coluna | Significado
0      | Data
1      | Hora
2      | Open
3      | High
4      | Low
5      | Close
6      | Volume
"""

with open('STOCK.csv', 'r', encoding='utf8') as f:
    for line in f:
        Untreated.append(line.split(','))

Untreated.pop(0)

for i in Untreated:
    """
    Open = float(i[1])
    High = float(i[2])
    Low = float(i[3])
    """
    Close = float(i[4])

    OriginalDate.append(i[0][0:9])
    OriginalStockPrice.append(Close)

# Data para monte carlo
Date = OriginalDate[0:int(len(OriginalDate) / 2)]
# Stock final do dia monte carlo
StockPrice = OriginalStockPrice[0:int(len(OriginalDate) / 2)]

mean = np.nanmean(StockPrice)
std = np.nanstd(StockPrice)
var = np.nanstd(StockPrice) ** 2

#######################

# Stochastic Differential Equation (SDE):
# dS(t) = mu S(t) dt + sigma S(t) dW(t)

# Explicit Expression:
# S(t) = S0 exp( (mu - sigma^2/2) t + sigma W(t) )


######## Cte's ########

# drift coefficent
mu = mean - 0.5 * var
# number of steps
n = 100
# time in years
T = 1
# number of sims
M = 500
# initial stock price
S0 = StockPrice[-1]
# volatility
sigma = 0.3

######## Simulating GBM Paths ########

# calc each time step
dt = T / n

# simulation using numpy arrays
St = np.exp(
    (mu - sigma ** 2 / 2) * dt
    + sigma * np.random.normal(0, np.sqrt(dt), size=(M, n)).T
)

# include array of 1's
St = np.vstack([np.ones(M), St])

# multiply through by S0 and return the cumulative product of elements along a given simulation path (axis=0).
St = S0 * St.cumprod(axis=0)

######## Consider time intervals in years. ########

# Define time interval correctly
time = np.linspace(0, T, n + 1)

# Require numpy array that is the same shape as St
tt = np.full(shape=(M, n + 1), fill_value=time).T


######## Plotting. ########

def OriginalPlot(graph=False):
    plt.figure(figsize=(19, 10))
    Date_in_slice = np.linspace(0, 2, num=len(OriginalDate))
    plt.plot(Date_in_slice, OriginalStockPrice)
    plt.title(f'MGLU3 - 2 Years.\nStart: {OriginalDate[0]}\nEnd: {OriginalDate[-1]}')
    plt.xticks([0, 1, 2], [Date[0], Date[int(len(Date) / 2)], Date[-1]])
    plt.xlabel('Date')
    plt.ylabel('Stock Price R$')
    plt.vlines(1, 0, 60, colors='black')
    plt.ylim(0, 50)
    plt.savefig("1OriginalPlot.jpeg")
    if graph:
        plt.show()


def FinalPlot(graph=False):
    plt.figure(figsize=(19, 10))
    Date_in_slice = np.linspace(-1, 0, num=int(len(OriginalDate) / 2))
    plt.plot(Date_in_slice, StockPrice)

    plt.plot(tt, St)
    plt.xlabel("Date")
    plt.ylabel("Stock Price $(S_t)$ R\$")

    plt.xticks([-1, 0, 1], [Date[0], Date[int(len(Date) / 2)], Date[-1]])

    # "Realizations of Geometric Brownian Motion for Stock Price $dS_t = \mu S_t dt + \sigma S_t dW_t$\n $S_0 = R${0}, \mu = {1}, \sigma = {2}$"
    # $ for itallic, \sigma, \mu

    plt.title(f"Realizations of Geometric Brownian Motion for Stock Price\n"
              f"$dS_t = \mu S_t dt + \sigma S_t dW_t$\n"
              f"$S\u2080$ = {StockPrice[-1]:.2f}   $\u03BC$ = {mu:.2f}   \u03C3 = {sigma}")
    plt.ylim(0, 50)
    plt.vlines(0, 0, 60, colors='black')
    plt.savefig('2SimulationPlot.jpeg')

    if graph:
        plt.show()


OriginalPlot()
FinalPlot()

Referências

  1. ↑ R. Brown, Phil. Mag. 4, 161 (1828).
  2. ↑ A. Einstein, Ann. d. Phys. 17, 549 (1905).
  3. ↑ A. Einstein, Ann. d. Phys. 17, 549 (1905).
  4. ↑ Wilmott, P., 2000. Quantitative Finance. John Wiley & Son, Ltd, Chichester
  5. ↑ A Review on Geometric Brownian Motion in Forecasting the Share Prices in Bursa Malaysi
  6. ↑ Caesar Wu, Rajkumar Buyya. Chapter 18 - Real Option Theory and Monte Carlo Simulation. Cloud Data Centers and Cost Modeling. 2015. Pages 707-772. [ISBN 9780128014134](https://fiscomp.if.ufrgs.br/index.php/Especial:Fontes_de_livros/9780128014134) . [1](https://doi.org/10.1016/B978-0-12-801413-4.00018-0)
  7. ↑ https://blog.toroinvestimentos.com.br/empresas-listadas-b3-bovespa#:~:text=A%20B3%2C%20conhecida%20anteriormente%20como,mais%20de%20100%20empresas%20estrangeiras. Acesso em: 30 de abril de 2022.
  8. ↑ NurAimiBadriah, N, SitiNazifah, Z. A. and Maheran, M. J., Forecasting Share Prices Accurately For One Month Using Geometric Brownian Motion, 26 (4): 1619 - 1635 (2018).
  9. ↑ Kobeissi Y. H, Multifractal Finance Markets: An Alternative Approach to Asset and Risk Management, springer, New York. (2012).
  10. ↑ Farida Agustini W, IkaRestuAffianti, Endah RM Putri, Stock price prediction using geometric Brownian motion, International Conference on Mathematics: Pure, IOP -974 012047(2018).
  11. ↑ Caesar Wu, Rajkumar Buyya. Chapter 18 - Real Option Theory and Monte Carlo Simulation. Cloud Data Centers and Cost Modeling. 2015. Pages 707-772. ISBN 9780128014134. https://doi.org/10.1016/B978-0-12-801413-4.00018-0.
  12. ↑ Black and Scholes, 1973; Merton, 1973.