# Projeto I - Modelagem Matemática em Finanças I - 2019
> Grupo: Gil Miranda e João Victor Fonseca<br>


```python
import numpy as np
import matplotlib.pyplot as plt
from sympy import binomial as b
```


```python
## Função para simular os valores da ação dados os parametros
def binomial(S0, T, dt, u, d, p):
    Si = S0
    S = []
    t = np.arange(0,T,dt)
    for ti in t:
        rnd = np.random.rand()
        if rnd < p:
            Si *= u
        else:
            Si *= d
        S.append(Si)
    return S
```


```python
## Definição dos parametros
T = 20
dt = 0.5
S0 = 5
u = 120/110
d = 110/120
p = 0.5

## Construção da lista de valores da ação pelo tempo
x = [binomial(S0, T, dt, u, d, p) for i in range(0,20)]

## Inserir o valor inicial em cada lista
for i in range(0,20):
    x[i].insert(0,S0)
    
## Discretização do tempo
ts = np.linspace(0,20,41)

## Plot do gráfico
plt.figure(figsize=(20,10))
for i in range(0,20):
    plt.plot(ts,x[i],label="{0:.5f}".format(x[i][-1]))
plt.title('Simulação com 20 caminhos de valor da ação')
plt.legend(title='Valor final', loc='upper center', fancybox=True, shadow=True,
           ncol=7, bbox_to_anchor=(0.5,1.05))
plt.xlabel('Tempo')
plt.ylabel('Valor da Ação.')
plt.show()
```

Há um problema aqui, a maior parte dos caminhos de valor da ação estão convergindo para 0.
Portanto vamos analisar os gráficos na escala log em Y.
Identificarei cada curva com seu valor final


```python
plt.figure(figsize=(20,10))
for i in range(0,20):
    plt.semilogy(ts,x[i],label="{0:.5f}".format(x[i][-1]))
plt.legend(title='Valor final', loc='upper center', fancybox=True, shadow=True, ncol=7, bbox_to_anchor=(0.5,1.05))
plt.title('Caminhos de valor da ação')
plt.show()
```

## Boxplot


```python
vs = [[],[]]
for j in [250,500,1000,2000]:
    vs[0].append([binomial(S0, T, dt, u, d, p)[-1] for i in range(0,j)])
plt.boxplot(vs[0])
plt.title('Boxplot com simulações')
plt.xlabel('Número de caminhos executados na simulação')
plt.xticks([1,2,3,4],[250,500,1000,2000])
plt.show()
```


```python
(1/2 * 120/110 + 1/2 * 110/120)**20
```




    1.0785466676518478



## Modificando os parâmetros


```python
u_n = np.sqrt(u)
d_n = np.sqrt(d)
dt_n = dt/2
for j in [250,500,1000,2000]:
    vs[1].append([binomial(S0, T, dt_n, u_n, d_n, p)[-1] for i in range(0,j)])

plt.boxplot(vs[1])

plt.title('Boxplot com simulações')
plt.ylabel('Valores das ações ao tempo final')
plt.xlabel('Número de caminhos executados na simulação')
plt.xticks([1,2,3,4],[250,500,1000,2000])
plt.show()
```


```python
np.mean(vs[1][0])
```




    5.489027709163725




```python
## Função para calcular a esperança
def esperanca(p_e,u_e,d_e,S0_e,n_e):
    return ((p_e*u_e+(1-p_e)*d_e)**n_e)*S0_e
```


```python
e = [0,0]
e[0] = esperanca(p,u,d,S0,T)
e[1] = esperanca(p,u_n,d_n,S0,T)
```


```python
ts = np.linspace(250,2000,4)

ys = [[],[]]
for j in [0,1]:
    for i in vs[j]:
        ys[j].append(abs((np.mean(i)-e[j])))
```


```python
plt.plot(ts,ys[0],label='Caso 1')
plt.plot(ts,ys[1], label='Caso 2')
plt.title('Gráfico do erro em relação ao número de simulações')
plt.xlabel('Número de simulações')
plt.ylabel('Erro relativo')
plt.legend()
plt.show()
```


```python
plt.semilogy(ts,ys[0],label='Caso 1')
plt.semilogy(ts,ys[1], label='Caso 2')
plt.legend()
plt.title('Gráfico do erro em relação ao número de simulações escala log')
plt.xlabel('Número de simulações')
plt.ylabel('Erro relativo')
plt.show()
```


```python

```


```python

```

4883d1083b7c86ebd8cf34b311e426d003baa51b
ipynb
Jupyter Notebook
mod-mat-financas-I-2019-1/.ipynb_checkpoints/Projeto I-checkpoint.ipynb
mirandagil/university-courses
e70ce5262555e84cffb13e53e139e7eec21e8907
MIT
2019-12-23T16:39:01.000Z
2019-12-23T16:39:01.000Z
mod-mat-financas-I-2019-1/Projeto I.ipynb
mirandagil/university-courses
e70ce5262555e84cffb13e53e139e7eec21e8907
MIT
mod-mat-financas-I-2019-1/Projeto I.ipynb
mirandagil/university-courses
e70ce5262555e84cffb13e53e139e7eec21e8907
MIT
Qwen/Qwen-72B
1. YES
2. YES