Movimento Browniano Geométrico para Previsão no Mercado de Ações: mudanças entre as edições
(77 revisões intermediárias por 2 usuários não estão sendo mostradas) | |||
Linha 11: | Linha 11: | ||
[[Arquivo:StockPrices.png|thumb|center|700px|'''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).]] | [[Arquivo:StockPrices.png|thumb|center|700px|'''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 | == Movimento Browniano e Movimento Browniano Geométrico == | ||
Em 1828, o biólogo Robert Brown observou comportamento irregular e ininterrupto de | 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 <ref>R. Brown, Phil. Mag. 4, 161 (1828).</ref>. 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<ref>A. Einstein, Ann. d. Phys. 17, 549 (1905).</ref>. 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 <ref>A. Einstein, Ann. d. Phys. 17, 549 (1905).</ref>, 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 <ref>Wilmott, P., 2000. Quantitative Finance. John Wiley & Son, Ltd, Chichester</ref><ref> A Review on Geometric Brownian Motion in Forecasting the Share Prices in Bursa Malaysi</ref>. 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: | |||
:<math> | :<math>B\left(t\right)=\sigma W\left(t\right)</math> | ||
Sua | Sendo <math>\sigma</math> é a variância e <math>W_{t}</math> o processo de Wiener. Sua distribuição normal é dada por: | ||
<math>N ~ [0, s-t]</math> | |||
==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: | |||
<math>dS_{t}=\mu S_{t} dt+\sigma t St dW, t \in[t_{0}, T]</math> | |||
Onde <math>S(t)</math> é processo estocástico, <math>W_{t}</math> um processo de Wiener, <math> \mu </math> é a média e <math>\sigma</math> é 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: | |||
:<math>dy(t, X_{t})=\frac{\partial y}{\partial t}dt+ \frac{\partial y}{\partial X_{t}}dX_{t}+ \frac{1}{2} \frac{\partial ^{2}y}{\partial X^2_{t}}dX^2_{t}</math> | |||
Onde <math>y</math> é a função do processo estocástico dependente do tempo e <math>X_{t}</math> é o processo estocástico. Vamos renomear o processo estocástico para <math>S_{t}</math>. Agora, iremos aplicar transformação logarítmica, ferramenta que será relevante nos próximos passos. | |||
:<math>g(S(t)) = ln(S(t))</math> | |||
Aplicando o lema de Itô no nosso sistema: | |||
:<math>dg(t, S_{t})=\frac{\partial g}{\partial t}dt+\frac{\partial g}{\partial S_{t}}dS_{t}+\frac{1}{2} \frac{\partial ^{2}g}{\partial S^2_{t}}dS^2_{t}</math> | |||
Aplicando <math>g(S_t) = ln(S_t)</math>, temos que as derivadas parciais são: | |||
:<math>\frac{\partial g}{\partial t}dt=0, \frac{\partial g}{\partial S_{t}}dS_{t}= \frac{1}{S_{t}}, \frac{\partial ^2g}{\partial S^2_{t}}dS^2_{t}=-\frac{1}{S^2_{t}}</math> | |||
E utilizando propriedades de cálculo estocástico: | |||
:<math>dS^2_{t}=\sigma ^2S^2_{t}dt</math> | |||
A substituição e desenvolvimento desses valores e a equação <math>dS_t</math> na equação <math>dg(t, S_t)</math> resulta em: | |||
:<math>dg(S_{t})=(\mu- \frac{1}{2} \sigma^2)dt+\sigma dW_{t}</math> | |||
Integrando ambos lados da equação, chegamos em: | |||
:<math>g(S_{t})-g(S_{t_0})=(\mu- \frac{1}{2} \sigma^2)(T-t_{0})+\sigma (W_{t}-W_{t_0})</math> | |||
Aplicando o logaritmo em ambos lados da equação, como sugerido anteriormente, temos: | |||
:<math>exp(\frac{lnS_{t}}{S_{t_0}})=exp((\mu-\frac{1}{2} \sigma ^2)(T-t_{0}))+\sigma (W_{t}-W_{t_0})</math> | |||
E finalmente chegamos na solução da equação diferencial estocástica do movimento browniano geométrico: | |||
:<math>S_{t}=S_{0}exp((\mu-\frac{1}{2} \sigma ^2)(T-t_{0}))+\sigma (W_{t}-W_{t_0})</math> | |||
Ou | |||
:<math>S_{t}=S_{0}exp((\mu-\frac{1}{2} \sigma ^2)t)+\sigma W_{t}</math> | |||
Sua distribuição normal é dada por: | |||
:<math>N ~ [\frac{\mu-\sigma ^2}{2}t, \sigma ^2t]</math> | |||
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<ref>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) | |||
. [https://doi.org/10.1016/B978-0-12-801413-4.00018-0](https://doi.org/10.1016/B978-0-12-801413-4.00018-0)</ref>: | |||
[[Arquivo:Bm.png|thumb|center|700px|'''Figura 2''': Comportamento do movimento browniano e sua distribuição de probabilidade.]] | |||
[[Arquivo:Gbm.png|thumb|center|700px|'''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 === | === Aplicação: Mercado Financeiro === | ||
Linha 44: | Linha 119: | ||
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. | 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 <ref>Kobeissi Y. H, Multifractal Finance Markets: An Alternative Approach to Asset and Risk Management, springer, New York. (2012). </ref>. O próximo movimento será determinado a partir do estado atual e não de estados passados, configurando um processo markoviano <ref>Farida Agustini W, IkaRestuAffianti, Endah RM Putri, Stock price prediction using geometric Brownian motion, International Conference on Mathematics: Pure, IOP -974 012047(2018).</ref> | 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 <ref>Kobeissi Y. H, Multifractal Finance Markets: An Alternative Approach to Asset and Risk Management, springer, New York. (2012). </ref>. O próximo movimento será determinado a partir do estado atual e não de estados passados, configurando um processo markoviano <ref>Farida Agustini W, IkaRestuAffianti, Endah RM Putri, Stock price prediction using geometric Brownian motion, International Conference on Mathematics: Pure, IOP -974 012047(2018).</ref>. | ||
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. | 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 | 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: | Aplicado ao mercado de ações, é definido pela equação: | ||
:<math> S(t)=S( | :<math> S(t)=S(0)exp((\mu-(\sigma ^2)/2)t+\sigma W_{t})</math> | ||
Onde <math>S(t)</math> é o valor futuro da ação, <math>S(o)</math> é o valor inicial da ação, <math> \mu</math> é o deslocamento (“drift”) diário, <math>\sigma</math> é a volatilidade | Onde <math>S(t)</math> é o valor futuro da ação, <math>S(o)</math> é o valor inicial da ação, <math> \mu</math> é o deslocamento (“drift”) diário, <math>\sigma</math> é a volatilidade diária e <math>W_{t}</math> é o processo de Wiener. O termo <math>\mu</math> é 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 | 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) <ref>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.</ref> | ||
O MBG é assumido no modelo de Black-Scholes, | 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<ref>Black and Scholes, 1973; Merton, 1973.</ref>. | ||
Esse trabalho irá trabalhar com o MBG apenas. | Esse trabalho irá trabalhar com o MBG apenas. | ||
Linha 74: | Linha 149: | ||
[[Arquivo:MGLU3GoogleSheets.png|thumb|center|790px|'''Figura 2''': Tabela de dados da Magazine Luiza. Para baixar uma tabela neste formato, basta utilizar o comando GOOGLEFINANCE() do próprio Google Sheets.]] | [[Arquivo:MGLU3GoogleSheets.png|thumb|center|790px|'''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 === | === Etapa 2: Cálculos iniciais necessários === | ||
Linha 85: | Linha 161: | ||
|- | |- | ||
| Taxa de Retorno Diária | | Taxa de Retorno Diária | ||
| style="font-style:normal;" | <math> | | style="text-align:center; font-style:normal;" | <math>\mu</math> | ||
|- | |- | ||
| Volatilidade Diária | | Volatilidade Diária | ||
| style="font-style:normal;" | <math> | | style="text-align:center; font-style:normal;" | <math>\sigma</math> | ||
|- | |- | ||
| Desvio Médio | | Desvio Médio | ||
| style="font-style:normal;" | <math>Drift</math> | | style="text-align:center; font-style:normal;" | <math>Drift</math> | ||
|} | |} | ||
== Discussão == | Para calcular a ''Taxa de Retorno Diária'' fazemos: | ||
<math>\mu =\sum _{i=1}^n\left(\frac{xi}{n}\right)</math> | |||
onde a soma de <math>xi</math> é a taxa de retorno anual, já <math>n</math> é 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'': | |||
<math>\sigma =\frac{\sum _{i=1}^n\left(xi-\mu \right)^2}{n}</math> | |||
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): | |||
<math>Drift=\mu -\frac{1}{2}\sigma ^2</math> | |||
=== 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: | |||
<math>S\left(t\right)=S\left(0\right)e^{\left(Drift\right)t+\sigma Z}</math> | |||
onde <math>S\left(t\right)</math> é o preço futuro da ação, <math>S\left(0\right)</math> é o preço atual da ação e <math>Z</math> é 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). | |||
[[Arquivo:1OriginalPlot.jpeg|thumb|center|1000px|'''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. | |||
[[Arquivo:2SimulationPlot.jpeg|thumb|center|1000px|'''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. | |||
[[Arquivo:Comparision.jpg|thumb|center|1000px|'''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 [[https://github.com/RicGary/MetCompC/tree/main/MonteCarloStock]]. | |||
Código utilizado para as simulações. | |||
<source lang="python"> | |||
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() | |||
</source> | |||
==Referências== | ==Referências== | ||
<references/> | <references/> |
Edição atual tal como às 06h43min de 17 de maio de 2022
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.
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:
Sendo é a variância e o processo de Wiener. Sua distribuição normal é dada por:
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:
Onde é processo estocástico, 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:
Onde é a função do processo estocástico dependente do tempo e é o processo estocástico. Vamos renomear o processo estocástico para . Agora, iremos aplicar transformação logarítmica, ferramenta que será relevante nos próximos passos.
Aplicando o lema de Itô no nosso sistema:
Aplicando , temos que as derivadas parciais são:
E utilizando propriedades de cálculo estocástico:
A substituição e desenvolvimento desses valores e a equação na equação resulta em:
Integrando ambos lados da equação, chegamos em:
Aplicando o logaritmo em ambos lados da equação, como sugerido anteriormente, temos:
E finalmente chegamos na solução da equação diferencial estocástica do movimento browniano geométrico:
Ou
Sua distribuição normal é dada por:
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]:
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:
Onde é o valor futuro da ação, é o valor inicial da ação, é o deslocamento (“drift”) diário, é a volatilidade diária e é 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).
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 |
Para calcular a Taxa de Retorno Diária fazemos:
onde a soma de é a taxa de retorno anual, já é 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:
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):
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:
onde é o preço futuro da ação, é o preço atual da ação e é 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).
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.
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.
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
- ↑ R. Brown, Phil. Mag. 4, 161 (1828).
- ↑ A. Einstein, Ann. d. Phys. 17, 549 (1905).
- ↑ A. Einstein, Ann. d. Phys. 17, 549 (1905).
- ↑ Wilmott, P., 2000. Quantitative Finance. John Wiley & Son, Ltd, Chichester
- ↑ A Review on Geometric Brownian Motion in Forecasting the Share Prices in Bursa Malaysi
- ↑ 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)
- ↑ 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.
- ↑ 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).
- ↑ Kobeissi Y. H, Multifractal Finance Markets: An Alternative Approach to Asset and Risk Management, springer, New York. (2012).
- ↑ Farida Agustini W, IkaRestuAffianti, Endah RM Putri, Stock price prediction using geometric Brownian motion, International Conference on Mathematics: Pure, IOP -974 012047(2018).
- ↑ 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.
- ↑ Black and Scholes, 1973; Merton, 1973.