Esse é um ambicioso projeto que simula o comportamento do mercado utilizando ferramentas provenientes de leis Físicas em Python.
- Simulação de Opções Binárias e o "Andar do Bêbado"
- Distibuição de Probabilidades dos Saldos Finais
- Implementação de Candles em Gráficos Interativos
- Geração de Gráficos em Tempo Real
Primeiramente, vamos começar com o mais simples, que é simular gráficos de opções binárias, onde a chance de lucrar, em teoria, se equipara a chance de ter um prejuízo.
Simular o desempenho de uma estratégia de opções binárias com base no conceito do "andar do bêbado", um modelo probabilístico que ilustra o movimento aleatório de uma partícula.
O "Andar do Bêbado" foi utilizado por Albert Einstein para explicar o movimento browniano, o movimento aleatório de partículas em suspensão em um fluido. A ideia é que a partícula se move em uma série de passos aleatórios, cada um com a mesma probabilidade de ser para frente ou para trás.
No código Python, simulamos uma série de operações de opções binárias, onde cada operação tem uma probabilidade fixa de ser vencedora ou perdedora. O movimento do saldo ao longo das operações é similar ao "andar do bêbado", com oscilações aleatórias em torno de um valor central.
Antes, vou explicar como o código funciona.
-
Parâmetros:
qtde
: Número de simulações a serem realizadas.n
: Número de operações por simulação.stop
: Limite de stop loss (perda máxima).profit
: Limite de take profit (lucro máximo).t
: Porcentagem de acerto nas operações (fixado em 50% neste exemplo).
-
Funções:
resultado
: Analisa os resultados das simulações e conta quantas vezes cada resultado (stop loss, take profit ou nenhum) ocorreu.f
: Simula uma única série de operações de opções binárias.rnd
: Gera uma lista de números aleatórios para simular os movimentos de preço.
-
Simulação e plotagem:
- 8 simulações são realizadas e plotadas no mesmo gráfico.
- O saldo final de cada simulação é armazenado na lista
saldo
.
-
Resultados:
- A função
resultado
imprime a quantidade de simulações que resultaram em stop loss, take profit ou nenhum dos dois.
- A função
import matplotlib.pyplot as plt # Biblioteca de plotagem
import numpy as np # Biblioteca de computação numérica
# Parâmetros da simulação
qtde = 1000 # Número de simulações
n = 1000 # Número de operações por simulação
stop = -2000 # Limite de stop loss
profit = 2000 # Limite de take profit
# Entrada de dados (opcional)
#t = float(input("% de acerto:"))
t = 50 # Porcentagem de acerto (fixado para 50 neste exemplo)
def resultado(saldo, qtde, stop, profit):
"""
Analisa os resultados das simulações e conta quantas vezes cada
resultado (stop loss, take profit ou nenhum) ocorreu.
Argumentos:
saldo: Lista com os saldos finais de cada simulação.
qtde: Número de simulações.
stop: Limite de stop loss.
profit: Limite de take profit.
Retorno:
Lista com a contagem de cada tipo de resultado.
"""
stoploss = 0
nothing = 0
takeprofit = 0
for i in range(qtde):
if saldo[i] <= stop:
stoploss += 1
elif saldo[i] >= profit:
takeprofit += 1
else:
nothing += 1
resultado = [stoploss, takeprofit, nothing]
return resultado
def f(y, t, n, stop, profit):
"""
Simula uma única série de operações de opções binárias.
Argumentos:
y: Lista com os movimentos de preço aleatórios.
t: Porcentagem de acerto.
n: Número de operações.
stop: Limite de stop loss.
profit: Limite de take profit.
Retorno:
Lista com o saldo ao longo da simulação.
"""
valor_investido = 50
f = np.zeros(n)
f[0] = 0
for i in range(n-1):
# Ajusta o saldo de acordo com a operação e o resultado
if f[i] > stop and f[i] < profit:
if y[i] > t:
f[i+1] = f[i] - valor_investido
else:
f[i+1] = f[i] + valor_investido
# Se o limite for atingido, interrompe a simulação
else:
if f[i] <= stop:
for j in range(i,n):
f[j] = stop
elif f[i] >= profit:
for j in range(i,n):
f[j] = profit
i=n
return f
def rnd(s):
"""
Gera uma lista de números aleatórios para simular os movimentos de preço.
Argumentos:
s: Tamanho da lista.
Retorno:
Lista com números aleatórios.
"""
a = np.random.randint(102, size=s)
b = []
for i in range(s):
b.append(a[i])
return b
x = np.arange(0, n, 1) # Eixo X para o gráfico (número de operações)
y = np.zeros(n) # Linha de base para o gráfico
plt.plot(x, y, color='black') # Plota a linha de base
# Simula 8 cenários e plota o saldo em cada um
for _ in range(8):
plt.plot(x, f(rnd(n), t, n, stop, profit), linewidth=0.7)
plt.xlabel('Número de operações') # Título do eixo X
plt.ylabel('Saldo (R$)') # Título do eixo Y
plt.title('Simulação de opções binárias') # Título do gráfico
plt.style.use('dark_background') # Tema do Gráfico
plt.show() # Exibe o gráfico
# A lista saldo armazena o saldo final de cada uma das qtde simulações
saldo = []
for i in range(qtde):
saldo.append(f(rnd(n), t, n, stop, profit)[n-1])
# Armazena o saldo final de cada simulação
r = resultado(saldo, qtde, stop, profit)
# Mostra a quantidade de simulações que terminaram em cada um dos cenários.
print("Qtde. Stop Loss:", r[0])
print("Qtde. Take Profit:", r[1])
print("Nem um nem outro:", r[2])
Qtde. Stop Loss: 205
Qtde. Take Profit: 216
Nem um nem outro: 579
- O código serve como um exemplo e pode ser adaptado para diferentes cenários.
- Para uma análise mais completa, é recomendável realizar simulações com diferentes parâmetros e avaliar a sensibilidade dos resultados.
- É possível adicionar um loop para realizar simulações com diferentes valores de
t
(porcentagem de acerto) e analisar o impacto na quantidade de stop losses, take profits e resultados intermediários.
Vamos voltar a analogia do "Andar do Bêbado". Com o tempo, a distância total percorrida pelo bêbado será a soma dos passos individuais. Como os passos são aleatórios, não há como prever exatamente onde o bêbado estará em qualquer momento. No entanto, podemos calcular a probabilidade de o bêbado estar em uma determinada posição.
A probabilidade de o bêbado estar a uma distância específica do ponto de partida segue uma função gaussiana, também conhecida como distribuição normal. Essa função tem a forma de um sino, com a probabilidade mais alta no ponto de partida e diminuindo à medida que a distância aumenta. E nós vamos provar isso nos cálculos a seguir.
Partindo da posição
A média das posições de
Já a média quadrada de
Agora, ao dar o passo
\begin{align*}
\langle x_2\rangle &= 0\
\langle (x_2)^2\rangle &= \langle (x_1 \pm 1)^2\rangle = 1$$
\end{align*}