Usuário Senha
Manter conectado | Recuperar dados | Cadastro
Home Produtos & Serviços Cursos Downloads Plataforma de Risco Fórum Wiki Duxus

Manual e Ajuda para o add-in Multifatorial para Taxas de Juros

-> Conteúdo

Anterior: 1. Instalação

Próxima: 3. REFERÊNCIAS BIBLIOGRÁFICAS


2. UTILIZAÇÃO

2.1. Funções do Sistema
2.1.1. Geração de van der Corput
2.1.2. Geração de Matriz de Baixa Discrepância
2.1.3. Geração de Cubo de Baixa Discrepância
2.1.4. Inversão de Moro
2.1.5. Geração de Cubo Aleatório
2.1.6. Geração de Caminho Aleatório
2.1.7. Geração de Multifatorial para Taxas de Juros
2.1.8. Geração de Multifatorial para Taxas de Juros com Cubo Aleatório Fixo
2.1.9. Ferramentas de Consulta
2.1.10. Geração de Cubo Aleatório Correlacionado
2.1.11. Geração de Movimento Browniano Aritmético Correlacionado com Reversão para Média - MBACRM


O sistema engloba um conjunto de funções. Serão detalhadas as formas de utilização de cada uma das funções do sistema. Existem funções disponíveis para planilhas e funções disponíveis para os módulos de programação.

As funções disponíveis em planilhas estão localizadas na categoria:

Categoria: Multifatorial

As funções disponíveis em planilhas têm seus nomes inicializados pela abreviação com 2 (duas) letras do suplemento do sistema seguida de um ponto de separação (ex: XX.).

Abreviação: MF. (de MultiFatorial)

Para localizar uma função de planilha nome_da_função, basta procurar por XX.nome_da_função.

A forma de inclusão de funções para as planilhas é idêntica às demais funções do Microsoft Excel e não será aqui detalhada. Todas as funções de planilhas serão descritas como funções apenas.

Para as funções dos módulos de programação, os seus nomes sempre acompanharão um prefixo dado pela abreviação com 2 (duas) letras do suplemento do sistema seguida de um caractere de sublinhado (ex: XX_).

Abreviação: MF_ (de MultiFatorial)

Para utilizar uma função de módulo nome_da_função, basta procurar por XX_nome_da_função.

A forma de inclusão de funções em módulos de programação é específica e será apresentada para cada função em particular. Todas as funções de módulo de programação serão descritas como macros apenas. As macros (funções em módulos de programação) devem ser obrigatoriamente declaradas dentro dos módulos onde são executadas ou chamadas.
Topo


2.1. Funções do Sistema
2.1.1. Geração de van der Corput

Descrição: Gera números de van der Corput entre (0,1) de acordo com os argumentos informados. Retorna um número na seqüência ou toda a seqüência de números.

2.1.1.1. Função MF.VAN_DER_CORPUT

Chamada: MF.VAN_DER_CORPUT (Base, n, Seqüência, Vertical)

Argumento

Tipo

Descrição

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

n

long

Posição ou total da seqüência de van der Corput. O número n deve ser maior do que 0.

Seqüência

boolean

Opcional. Indica se o retorno é para a seqüência completa (informe 1) até o número n ou apenas um número (informe 0). O padrão (ou 0) retorna um número apenas.

Vertical

boolean

Opcional. Permite a exibição da seqüência na horizontal (padrão ou informe 0) ou na vertical (informe 1).

Nota 1: Resultados de vetores devem ser extraídos do Excel através da seleção da região para os resultados, colocação da fórmula com a área de saída selecionada e pressionando CTRL+SHIFT+ENTER.
Nota 2: O Microsoft Excel possui limitações quanto ao tamanho de dados passados entre as funções externas e suas planilhas. Desaconselha-se a utilização de chamadas de funções externas com grande volume de dados a partir das planilhas do Excel. De uma forma genérica, o Microsoft Excel não suporta um número de dados maior do que 32.767 campos. Para maiores detalhes, consultar a Ajuda on-line ou suporte do Microsoft Excel.
Nota 3: A seqüência ou o número gerado utiliza o intervalo entre (0,1). O número ‘0’ é descartado da geração original de van der Corput [0,1).

Exemplo de utilização em uma célula:

  • Base 2
  • Posição 10
  • Mostrar a seqüência até a posição
  • Visualizar na posição vertical

= {MF.VAN_DER_CORPUT(2;10;1;0)}

1/2 1/4 3/4 1/8 5/8 3/8 7/8 1/16 9/16 5/16

Simulação

  • Geração de 100, 200, 300 e 500 números de van der Corput
  • Base 2

  • Geração de 100, 200, 300 e 500 números de van der Corput
  • Base 20

O espaçamento entre os pontos no gráfico representa a ocupação na distribuição uniforme entre (0,1) de van der Corput.

O número da base de van der Corput escolhido é mais ou menos importante conforme o total de iterações. Para números maiores de base, o número de iterações deve ser maior a fim de cobrir uniformemente o intervalo (0,1).

2.1.1.2. Macro MF_VAN_DER_CORPUT

Declaração:

Private Declare Function MF_VAN_DER_CORPUT _
Lib multifatorial.xll (Resultados() As Double, ByVal Base As Integer, _
ByVal n As Long, ByVal Seq As Boolean) As Integer

Chamada: MF_VAN_DER_CORPUT (Resultados, Base, n, Seqüência)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor para receber a seqüência de dados.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

n

long

Posição ou total da seqüência de van der Corput. O número n deve ser maior do que 0.

Seqüência

boolean

Opcional. Indica se o retorno é para a seqüência completa (informe 1) até o número n ou apenas um número (informe 0). O padrão (ou 0) retorna um número apenas.

Ver Nota 3.

Importante: O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_VAN_DER_CORPUT Lib multifatorial.xll (Resultados() As Double, ByVal Base As Integer, ByVal n As Long, ByVal Seq As Boolean) As Integer
Sub Call_van_der_corput() 'Testa a utilização da função de van der Corput chamada por macro
Dim saida() As Double
Dim arg_base As Integer
Dim arg_n As Long
Dim arg_seq As Boolean
Dim resultado As Integer
Dim i As Long
arg_base = Range("base_van_der_corput").Value
arg_n = Range("n_van_der_corput").Value
arg_seq = Range("seq_van_der_corput").Value
resultado = MF_VAN_DER_CORPUT(saida,arg_base, arg_n, arg_seq)
If resultado = 1 Then
'Coloca vetor a partir da célula macro_van_der_corput
If Not arg_seq Then
Range("macro_van_der_corput").Value = saida(0)
Else
For i = 0 To arg_n - 1
Range("macro_van_der_corput").Offset(0, i).Value = saida(i)
Next
End If
Else
MsgBox "Parâmetros incorretos!" , vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub


Topo

2.1.2. Geração de Matriz de Baixa Discrepância

Descrição: Gera números entre (0,1) em uma matriz a partir da seqüência de van der Corput para todas as colunas da matriz e realiza trocas pseudo-randômicas não-determinísticas entre todos os elementos das colunas, exceto para a primeira coluna, a fim de eliminar a dependência serial entre os elementos [2].
Retorna uma matriz de baixa discrepância para o número de dimensões e iterações informadas.

2.1.2.1. Função MF.MLD_VAN_DER_CORPUT

Chamada: MF.MLD_VAN_DER_CORPUT (Iterações, Dimensões, Base)

Argumento

Tipo

Descrição

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Notas 1, 2 e 3.
Nota Técnica 1: O volume de dados analisados depende do tamanho total da memória física e da memória virtual do computador. Para grandes volumes de dados, pode ser necessário aumentar a memória virtual, ficando o limite imposto pela capacidade de endereçamento em disco rígido.

Exemplo de utilização em uma célula:

  • Iterações 200
  • Dimensões 20
  • Base 2

= {MF.MLD_VAN_DER_CORPUT(20;200;2)}

1/2

3/4

3/4

3/8

3/8

7/8

3/16

...

1/4

7/16

1/4

5/8

1/2

1/4

5/8

...

3/4

7/8

11/16

1/2

1/4

9/16

11/16

...

1/8

1/2

5/16

1/32

1/16

13/16

3/4

...

5/8

11/16

1/32

15/16

17/32

3/8

7/16

...

3/8

1/32

17/32

7/8

7/8

1/8

9/16

...

7/8

1/4

7/16

3/4

5/32

5/8

1/16

...

...

...

...

...

...

...

...

...

Simulação

  • Geração de 10 dimensões para 250 iterações de números de van der Corput em matriz de baixa discrepância
  • Base 2

  • Geração de 100 dimensões para 250 iterações de números de van der Corput em matriz de baixa discrepância
  • Base 2

Não se percebe agrupamento espacial nas dimensões simuladas (10 e 100) dimensões.

2.1.2.2. Macro MF_MLD_VAN_DER_CORPUT

Declaração

Private Declare Function MF_MLD_VAN_DER_CORPUT _
Lib multifatorial.xll (Resultados () As Double, ByVal Iterações As Long, _
ByVal Dimensões As Long, ByVal Base As Integer) As Integer

Chamada: MF_MLD_VAN_DER_CORPUT (Resultados, Iterações, Dimensões, Base)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 2 dimensões para receber a geração de dados.

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Nota 3 e Nota Técnica 1.

Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um matriz (Iterações, Dimensões).
O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_MLD_VAN_DER_CORPUT Lib multifatorial.xll (Resultados() As Double, ByVal Iterações As Long, ByVal Dimensoes As Long, ByVal Base As Integer) As Integer
Sub Call_MLD_van_der_corput()
'Testa a utilização da função de van der Corput chamada por macro para matriz
Dim saida() As Double 'Matriz de saída
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim resultado As Integer
Dim j As Long
Dim i As Long
arg_base = Range("base_matriz_van_der_corput").Value
arg_dimensoes = Range("dimensoes_van_der_corput").Value
arg_iteracoes = Range("iteracoes_van_der_corput").Value
resultado = MF_MLD_VAN_DER_CORPUT(saida, arg_iteracoes,arg_dimensoes, arg_base)
If resultado = 1 Then
'Coloca vetor a partir da célula macro_matriz_van_der_corput
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("macro_matriz_van_der_corput").Offset(j, i).Value = saida(j, i)
Next
Next
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub


Topo

2.1.3. Geração de Cubo de Baixa Discrepância

Descrição: Gera números entre (0,1) em um cubo a partir da seqüência de van der Corput para todas as colunas do cubo, com a profundidade indicada (variáveis independentes) e realiza trocas pseudo-randômicas não-determinísticas entre todos os elementos de todas as colunas, exceto para a primeira coluna da primeira profundidade, a fim de eliminar a dependência serial entre os elementos (2). Retorna um cubo de baixa discrepância para o número de dimensões, iterações e profundidade (variáveis de estado) informada.

2.1.3.1. Função MF.CLB_VAN_DER_CORPUT

Chamada: MF.CLB _VAN_DER_CORPUT (Iterações, Dimensões, Profundidade, Base)

Argumento

Tipo

Descrição

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Profundidade

long

Número de variáveis independentes de estado para a profundidade do cubo. O número Profundidade deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Notas 1, 2 e 3 e Nota Técnica 1.

Importante: A profundidade do cubo é representada por linhas. Assim sendo, se o cubo possuir por exemplo duas profundidades, a primeira iteração para a primeira profundidade corresponderá à primeira linha e a primeira iteração para a segunda profundidade corresponderá à segunda linha. A segunda iteração para a primeira profundidade corresponderá à terceira linha e a segunda iteração para a segunda profundidade corresponderá à quarta linha e assim sucessivamente.

Exemplo de utilização em uma célula:

  • Iterações 6
  • Dimensões 200
  • Profundidade (variáveis de estado) 3 – 2a. profundidade em itálico e 3a. em negrito
  • Base 2

={MF.CLD_VAN_DER_CORPUT(6;200;3;2)}

1/2

3/4

5/8

1/8

1/4

...

1/8

1/4

1/8

1/8

1/4

...

5/8

3/8

1/4

5/8

1/2

...

1/4

1/2

3/4

1/4

1/2

...

3/4

1/2

3/4

3/8

3/8

...

3/4

1/8

3/4

1/8

5/8

...

3/4

5/8

1/2

3/4

1/8

...

5/8

5/8

1/2

1/2

1/8

...

1/4

5/8

3/8

3/4

1/8

...

1/8

3/8

1/8

1/2

3/8

...

1/4

3/4

5/8

1/4

1/2

...

1/8

1/2

1/2

1/2

1/4

...

5/8

1/8

3/8

3/8

3/4

...

1/2

1/8

1/4

3/4

5/8

...

3/8

1/4

5/8

3/8

3/4

...

3/8

1/4

1/4

5/8

5/8

...

3/8

3/8

3/8

5/8

3/4

...

1/2

3/4

1/8

1/4

3/8

...

2.1.3.2. Macro MF_CLD_VAN_DER_CORPUT

Declaração:

Private Declare Function MF_CLD_VAN_DER_CORPUT _
Lib multifatorial.xll (Resultados() As Double, ByVal Iterações As Long, _
ByVal Dimensões As Long, ByVal Profundidade As Long, ByVal Base As Integer) As Integer

Chamada: MF_CLD_VAN_DER_CORPUT (Resultados, Iterações, Dimensões, Profundidade, Base)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Profundidade

long

Número de variáveis independentes de estado para a profundidade do cubo. O número Profundidade deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Nota 3 e Nota Técnica 1.

Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Profundidade).


Importante: O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_CLD_VAN_DER_CORPUT Lib "multifatorial.xll" (Resultados() As Double, ByVal Iterações As Long, ByVal Dimensões As Long, ByVal Profundidade As Long, ByVal Base As Integer) As Integer
Sub Call_CLD_van_der_corput()
'Testa a utilização da função de van der Corput chamada por macro para cubo
Dim saida() As Double 'Matriz de saída
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim arg_profundidade As Long
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
arg_base = Range("base_matriz_van_der_corput").Value
arg_dimensoes = Range("cubo_dimensoes_van_der_corput").Value
arg_iteracoes = Range("cubo_iteracoes_van_der_corput").Value
arg_profundidade = Range("profundidade_van_der_corput").Value
resultado = MF_CLD_VAN_DER_CORPUT(saida, arg_iteracoes, arg_dimensoes, arg_profundidade, arg_base)
If resultado = 1 Then
'Coloca vetor a partir da célula macro_cubo_van_der_corput
'Coloca a profundidade deslocada
For t = 0 To (arg_profundidade - 1)
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("macro_cubo_van_der_corput").Offset(j * arg_profundidade + t, i + t).Value = saida(j, i, t)
Next
Next
Next
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub


Topo

2.1.4. Inversão de Moro

Descrição: Retorna a inversão de uma curva normal padrão dada pela sua densidade de probabilidade acumulada utilizando o algoritmo de Moro [2].

2.1.4.1. Função MF.INVERSAO_MORO

Chamada: MF.INVERSAO_MORO (Probabilidade)

Argumento

Tipo

Descrição

Probabilidade

double

Probabilidade acumulada da curva normal. O número Probabilidade deve ser maior do que 0 e menor do que 1.

Exemplo de utilização em uma célula:

  • Probabilidade acumulada 0,45

=MF.INVERSAO_MORO(0,45)

-0,125661346

Simulação

  • Comparação entre o valor exato e a inversão de Moro para a distribuição normal

Inversão de:

Exata

Moro

0,001

-3,09023

-3,09023

0,0001

-3,71902

-3,71902

0,00001

-4,26489

-4,26489

0,000001

-4,75342

-4,75342

0,0000003

-4,99122

-4,99122

0,0000002

-5,06896

-5,06896

2.1.4.2. Macro MF_INVERSAO_MORO

Declaração:

Private Declare Function MF_INVERSAO_MORO _
Lib multifatorial.xll (Probabilidade As Double) As Double

Chamada: MF_INVERSAO_MORO (Probabilidade)

Retorno: double = inversão da normal padrão

Argumento

Tipo

Descrição

Probabilidade

double

Probabilidade acumulada da curva normal. O número Probabilidade deve ser maior do que 0 e menor do que 1.

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_INVERSAO_MORO Lib "multifatorial.xll" (ByVal Probabilidade As Double) As Double
Sub Call_moro_inversao()
Dim arg_probabilidade As Double
Dim inversao As Double
arg_probabilidade = Range("moro_probabilidade").Value
inversao = MF_INVERSAO_MORO(arg_probabilidade)
Range("moro_macro").Value = inversao
End Sub


Topo


2.1.5. Geração de Cubo Aleatório

Descrição: Gera números em um cubo aleatório a partir da aplicação da inversão da normal de Moro sobre um cubo de baixa discrepância, gerado pela seqüência de van der Corput com números entre (0,1) para todas as colunas, com a profundidade indicada (variáveis independentes) e com trocas pseudo-randômicas não-determinísticas entre todos os elementos de todas as colunas, exceto para a primeira coluna da primeira profundidade. Retorna um cubo de aleatório para o número de dimensões, iterações e profundidade (variáveis de estado) informada.

2.1.5.1. Função MF.CUBO_ALEATORIO

Chamada: MF.CUBO_ALEATORIO (Iterações, Dimensões, Profundidade, Base)

Argumento

Tipo

Descrição

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Profundidade

long

Número de variáveis independentes de estado para a profundidade do cubo. O número Profundidade deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Notas 1, 2 e 3 e Nota Técnica 1.

Importante: A profundidade do cubo é representada por linhas. Assim sendo, se o cubo possuir por exemplo duas profundidades, a primeira iteração para a primeira profundidade corresponderá à primeira linha e a primeira iteração para a segunda profundidade corresponderá à segunda linha. A segunda iteração para a primeira profundidade corresponderá à terceira linha e a segunda iteração para a segunda profundidade corresponderá à quarta linha e assim sucessivamente.

Exemplo de utilização em uma célula:

  • Iterações 7
  • Dimensões 50
  • Profundidade (variáveis de estado) 3
  • Base 2

={MF.CUBO_ALEATORIO(7;50;3;2)}

-

0,674490

(0,318639)

1,150349

-

1,150349

...

(0,318639)

1,150349

1,150349

(1,150349)

-

(0,318639)

...

0,674490

-

0,674490

0,318639

(1,150349)

(1,150349)

...

(0,674490)

1,150349

0,674490

0,674490

1,150349

(0,674490)

...

1,150349

(0,674490)

(1,150349)

(0,318639)

0,674490

0,318639

...

-

(0,674490)

1,150349

1,150349

0,318639

0,674490

...

0,674490

(0,674490)

0,318639

(1,150349)

0,318639

-

...

0,318639

0,318639

(0,674490)

-

(0,674490)

-

...

1,150349

0,674490

(0,674490)

(1,150349)

1,150349

(0,674490)

...

(1,150349)

0,318639

-

(0,318639)

(0,674490)

(1,150349)

...

(1,150349)

(1,150349)

(0,318639)

0,318639

1,150349

0,674490

...

0,318639

0,318639

0,318639

-

-

-

...

0,318639

(1,150349)

(0,674490)

(0,674490)

(1,150349)

0,674490

...

-

(0,318639)

-

0,674490

0,318639

1,150349

...

(0,318639)

1,150349

(1,150349)

0,674490

0,674490

0,318639

...

(0,318639)

-

1,150349

0,318639

0,674490

(0,318639)

...

0,674490

-

0,674490

1,150349

(0,318639)

(1,150349)

...

(0,674490)

(0,318639)

(0,318639)

(0,318639)

(0,318639)

(0,318639)

...

1,150349

(0,318639)

(1,150349)

-

(0,318639)

0,318639

...

(0,674490)

0,674490

0,318639

(0,674490)

(1,150349)

(0,674490)

...

(1,150349)

(1,150349)

-

(0,674490)

(0,674490)

1,150349

...

2.1.5.2. Macro MF_CUBO_ALEATORIO

Declaração:

Private Declare Function MF_CUBO_ALEATORIO _
Lib multifatorial.xll (Resultados() As Double, ByVal Iterações As Long, _
ByVal Dimensões As Long, ByVal Profundidade As Long, ByVal Base As Integer) As Integer

Chamada: MF_CUBO_ALEATORIO (Resultados, Iterações, Dimensões, Profundidade, Base)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Profundidade

long

Número de variáveis independentes de estado para a profundidade do cubo. O número Profundidade deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Nota 3 e Nota Técnica 1.

Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Profundidade).
O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_CUBO_ALEATORIO Lib "multifatorial.xll" (Resultados() As Double, ByVal Iterações As Long, ByVal Dimensões As Long, ByVal Profundidade As Long, ByVal Base As Integer) As Integer
Sub Call_cubo_aleatorio()
'Testa a utilização da função de van der Corput + Moro chamada por macro para cubo aleatório
Dim saida() As Double 'Matriz de saída
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim arg_profundidade As Long
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
arg_base = Range("base_aleatorio").Value
arg_dimensoes = Range("dimensoes_aleatorio").Value
arg_iteracoes = Range("iteracoes_aleatorio").Value
arg_profundidade = Range("profundidade_aleatorio").Value
resultado = MF_CUBO_ALEATORIO(saida, arg_iteracoes, arg_dimensoes, arg_profundidade, arg_base)
If resultado = 1 Then
'Coloca vetor a partir da célula cubo_aleatorio
'Coloca a profundidade deslocada
For t = 0 To (arg_profundidade - 1)
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("cubo_aleatorio").Offset(j * arg_profundidade + t, i + t).Value = saida(j, i, t)
Next
Next
Next
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub


Topo


2.1.6. Geração de Caminho Aleatório

Descrição: Gera um caminho aleatório representado espacialmente por um cubo onde a profundidade do cubo reflete o número de pontos (p.ex. pontos da curva de juros), a abscissa reflete o próprio caminho no tempo (i.e. dimensões temporais) e a ordenada significa o número de iterações. O caminho é gerado de acordo com os parâmetros de entrada, como pontos iniciais e parâmetros estatísticos.

Os pontos do caminho, para cada profundidade, são gerados pela aplicação de uma matriz de componentes principais (argumento informado) a todas as variáveis independentes de estado de modo a compor um ponto no tempo. Os demais pontos no tempo, para a mesma profundidade, são gerados segundo a aplicação de um movimento Browniano aritmético com reversão para média (Ornstein-Uhlenbeck [1]) para cada uma das variáveis de estado.

O cubo aleatório, base para a geração do caminho aleatório para todas as profundidades (mesmo cubo para todas as variáveis independentes) é obtido a partir da aplicação da inversão da normal de Moro sobre um cubo de baixa discrepância, gerado pela seqüência de van der Corput com números entre (0,1) para todas as colunas, com a profundidade indicada e com trocas pseudo-randômicas não-determinísticas entre todos os elementos de todas as colunas, exceto para a primeira coluna da primeira profundidade.

O retorno desta macro é um caminho aleatório baseado no ABM (movimento aritmético Browniano).

Importante: Não confundir a profundidade de um cubo aleatório com a profundidade de um caminho aleatório. No primeiro, a profundidade representa as várias variáveis de estado. No caminho aleatório, a profundidade representa os vários pontos, já que as variáveis de estado são combinadas para formar uma indicação apenas para um ponto!

2.1.6.1. Macro MF_CAMINHO_ALEATORIO

Declaração:

Private Declare Function MF_CAMINHO_ALEATORIO _
Lib multifatorial.xll (Resultados() As Double, Vetor_Estados_Iniciais() As Variant, _
Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Vetor_Pontos_Iniciais As Variant, Matriz_PCA() As Variant, _
ByVal Fator_Tempo As Integer, ByVal Iteracoes As Long, ByVal Dimensões As Long, _
ByVal Base As Integer) As Integer

Chamada: MF_CAMINHO_ALEATORIO (Resultados, Vetor_Estados_Iniciais, Vetor_Volatilidade, Vetor_Velocidades, Vetor_Pontos_Iniciais, Matriz_PCA, Fator_Tempo, Iterações, Dimensões, Base)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Vetor_Estados_Iniciais

array variant

Vetor unidimensional contendo o valor inicial das variáveis independentes de estado. O tamanho deste vetor determinará o parâmetro de Profundidade do cubo aleatório.

Vetor_Volatilidades

array variant

Vetor unidimensional contendo os parâmetros estatísticos para os caminhos aleatórios. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Velocidades

array variant

Vetor unidimensional contendo os parâmetros do relacionamento matemático (O-U)[1]. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Pontos_Iniciais

array variant

Vetor unidimensional contendo os pontos para os quais se deseja realizar o caminho. O tamanho deste vetor determinará o número de Pontos e também a profundidade do cubo de caminho aleatório gerado.

Matriz_PCA

array variant

Vetor de 2 dimensões contendo os parâmetros da Análise de Componentes Principais (PCA). Este vetor deve representar uma matriz N x M, onde N é igual ao número de variáveis de estado (Profundidade do cubo aleatório) e M é igual ao número de Pontos (profundidade do caminho aleatório).

Fator_Tempo

double

Número indicando a relação temporal entre as medidas de volatilidade e velocidade e a trajetória (steps) no tempo. Deve ser maior do que 0.

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Nota 3 e Nota Técnica 1.

Importante: A orientação dos vetores pode ser horizontal ou vertical. A orientação também pode ser horizontal para alguns vetores e vertical para outros. A dimensão de cada vetor deve ser coerente independentemente da orientação. Caso um vetor seja erroneamente dimensionado, a dimensão vertical terá prioridade sobre a horizontal e não acarretará erro se, e somente se, as outras dimensões forem coerentes com o erro!
Em caso de orientações diversificadas para os vetores, a dimensão da matriz também pode ser vertical ou horizontal. No entanto, se o número de pontos e o número de variáveis de estado for o mesmo, a matriz será considerada como orientada horizontalmente, isto é, colunas correspondem a variáveis de estado e linhas correspondem ao número de pontos.


Importante: Esta macro realiza combinações das variáveis de estado segundo um movimento Browniano aritmético (ABM). Desta forma, o vetor de velocidades (drift) informado não deve ser o mesmo vetor de velocidades do movimento Browniano geométrico (GBM)!
O retorno desta função também está na forma ABM. Para o modelo multifatorial[2], o retorno da função equivale a não aplicação do operador exponencial para as taxas de juros, retornando yi.


Importante: Para o argumento Fator_Tempo, informe 1 se todas as bases são diárias. Informe 1/12 se a base temporal para simulação é mensal e a base das volatilidades e velocidades informadas é anual. Informe 12 se a base temporal de simulação é anual e a base das volatilidades e velocidades informadas é mensal. No modelo multifatorial[1], este número deve ser igual a 1, já que todas as bases são diárias.


Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Pontos).
O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_CAMINHO_ALEATORIO _
Lib "multifatorial.xll" (Resultados() As Double, Vetor_Estados_Iniciais() As Variant, _
Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Vetor_Pontos_Iniciais() As Variant, Matriz_PCA() As Variant, _
ByVal Fator_Tempo As Double ,ByVal Iteracoes As Long, ByVal Dimensões As Long, _
ByVal Base As Integer) As Integer
Sub Call_caminho_aleatorio()
'Testa a geração de um caminho aleatório
Dim saida() As Double 'Matriz de saída
Dim estados() As Variant
Dim volatilidades() As Variant
Dim velocidades() As Variant
Dim pontos() As Variant
Dim matriz() As Variant
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
arg_base = Range("base_caminho").Value
arg_dimensoes = Range("dimensoes_caminho").Value
arg_iteracoes = Range("iteracoes_caminho").Value
estados = Range("estado_caminho").Value
volatilidades = Range("volatilidade_caminho").Value
velocidades = Range("velocidades_caminho").Value
pontos = Range("pontos_caminho").Value
matriz = Range("matriz_caminho").Value
resultado = MF_CAMINHO_ALEATORIO(saida, estados, volatilidades, velocidades, pontos, matriz, 1, arg_iteracoes, arg_dimensoes, arg_base)
If resultado = 1 Then
'Coloca vetor a partir da célula caminho_aleatorio
'Coloca a profundidade deslocada
If arg_iteracoes > 5 Then arg_iteracoes = 5 'Limita a apresentação na tela
If arg_dimensoes > 20 Then arg_dimensoes = 20 'Limita a apresentação na tela
For t = 0 To 8
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("caminho_aleatorio").Offset(j * 9 + t, i + t).Value = saida(j, i, t)
Next
Next
Next
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub

Simulação

  • Variáveis de estado:

0,148694726

0,000115

0,0002

0,003

0,0001

  • Volatilidades

0,014457485

0,0155955

0,000895406

0,000450

0,000160

  • Velocidades

0,502807659

0,5000593

0,496863657

0,520000

0,530000

  • Pontos Iniciais

(1,741)

(1,723)

(1,690)

(1,635)

(1,590)

(1,546)

(1,551)

(1,5)

(1,45)

  • Matriz PCA

0,3644

(0,4261)

0,0394

0,0394

0,0394

0,3496

(0,4851)

0,1102

0,1102

0,1102

0,3741

(0,4232)

0,0237

0,0237

0,0237

0,3910

0,2174

(0,6836)

(0,6836)

(0,6836)

0,4261

0,3192

(0,1969)

(0,1969)

(0,1969)

0,3924

0,3625

0,1491

0,1491

0,1491

0,3414

0,3514

0,6764

0,6764

0,6764

0,3414

0,3514

0,6764

0,6764

0,6764

0,3414

0,3514

0,6764

0,6764

0,6764

  • Iterações 250
  • Dimensões 10
  • Base 2
  • Fator Tempo 1

  • Dimensões 100

Apresentação do caminho aleatório para a primeira variável de estado apenas.

  • Iterações 1000
  • Dimensões 100

Histograma para resultados de simulação para a primeira variável de estado. Percebe-se uma curva normal de saída, já que este é o caminho aritmético browniano (p.ex. sem aplicação da operação logarítmica de inversão para curva de juros).
Topo


2.1.7. Geração de Multifatorial para Taxas de Juros

Descrição: Gera o mesmo resultado que um caminho aleatório, mas com a diferença da aplicação do operador logarítmico para o caminho, resultando na leitura de taxas de juros e a possibilidade de enviar a saída também para arquivos tabulados, com a especificação do parâmetro de tabulação.

Retorna um modelo multifatorial para taxas de juros com um cubo onde a profundidade equivale aos vários pontos da curva de juros, a abscissa equivale às dimensões temporais e a ordenada equivale ao número de iterações. Adicionalmente e dependendo dos argumentos, gera arquivos de saída.

Para a opção de gerar vários arquivos de saída, para cada ponto da curva de juros simulado, é gerado um arquivo "curva_X.txt" onde X representa a ordem do ponto na curva de juros. Assim , o arquivo de saída para o terceiro ponto da curva de juros será "curva_3.txt", tabulado conforme o parâmetro informado.

Para a opção de gerar um arquivo apenas, o arquivo de saída será o "curva_juros.txt" e será composto de todos os pontos da curva de juros, sendo cada iteração representada por tantas linhas quantos forem os pontos.

O formato dos campos no arquivo de saída tem 4 casas decimais, o que equivale a dizer que possuem duas casas decimais em percentuais.

2.1.7.1. Macro MF_JUROS

Declaração:

Private Declare Function MF_JUROS _
Lib multifatorial.xll (Resultados() As Double, Vetor_Estados_Iniciais() As Variant, _
Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Vetor_Pontos_Iniciais() As Variant, Matriz_PCA() As Variant, _
ByVal Fator_Tempo As Integer, ByVal Iteracoes As Long, ByVal Dimensões As Long, _
ByVal Base As Integer, ByVal Saida_Arquivo as Integer, Diretorio as String, Tabulador as String) As Integer

Chamada: MF_JUROS (Resultados, Vetor_Estados_Iniciais, Vetor_Volatilidade, Vetor_Velocidades, Vetor_Pontos_Iniciais, Matriz_PCA, Iterações, Dimensões, Base, Saida_Arquivo, Tabulador)

Retorno : 1 para OK , -1 para ERRO geral e -2 para falha apenas na geração de arquivos de saída.

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Vetor_Estados_Iniciais

array variant

Vetor unidimensional contendo o valor inicial das variáveis independentes de estado. O tamanho deste vetor determinará o parâmetro de Profundidade do cubo aleatório.

Vetor_Volatilidades

array variant

Vetor unidimensional contendo os parâmetros estatísticos para os caminhos aleatórios. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Velocidades

array variant

Vetor unidimensional contendo os parâmetros do relacionamento matemático (O-U)[1]. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Pontos_Iniciais

array variant

Vetor unidimensional contendo os pontos para os quais se deseja realizar o caminho. O tamanho deste vetor determinará o número de Pontos e também a profundidade do cubo de caminho aleatório gerado.

Matriz_PCA

array variant

Vetor de 2 dimensões contendo os parâmetros da Análise de Componentes Principais (PCA). Este vetor deve representar uma matriz N x M, onde N é igual ao número de variáveis de estado (Profundidade do cubo aleatório) e M é igual ao número de Pontos (profundidade do caminho aleatório).

Fator_Tempo

double

Número indicando a relação temporal entre as medidas de volatilidade e velocidade e a trajetória (steps) no tempo. Deve ser maior do que 0.

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Saida_Arquivo

integer

Informa se o resultado deve ser direcionado também para arquivos de saída. Informe 1 para gerar um arquivo de saída para cada ponto, 2 para gerar um arquivo de saída contendo todos os pontos em linhas consecutivas e 0 (padrão) para não gerar arquivos. Gera indicador de gravação de arquivos.

Diretorio

string

Local onde serão gravados os arquivos de saída. Por exemplo, "c:\output".

Tabulador

string

Caractere para ser utilizado como tabulador entre campos caso haja saída para arquivos. Se for informada uma string vazia (“”), será utilizada uma tabulação como separador de campos. Só considera o primeiro caractere da string.

Ver Nota 3 e Nota Técnica 1.

Nota Técnica 2: Os arquivos tipo ".txt" têm uma limitação de tamanho devido a endereçamento de aproximadamente 4GB. Simulações que gerem volumes de dados superiores a este limite podem acarretar erro na geração dos arquivos.

Importante: Se a função retornar -2, houve falha apenas na geração dos arquivos, não comprometendo a utilização do argumento Resultados.
Possíveis causas deste tipo de falha são: diretório de saída inválido, espaço insuficiente em disco ou falta de permissão para efetuar gravações em disco.


Importante: A orientação dos vetores pode ser horizontal ou vertical. A orientação também pode ser horizontal para alguns vetores e vertical para outros. A dimensão de cada vetor deve ser coerente independentemente da orientação. Caso um vetor seja erroneamente dimensionado, a dimensão vertical terá prioridade sobre a horizontal e não acarretará erro se, e somente se, as outras dimensões forem coerentes com o erro!
Em caso de orientações diversificadas para os vetores, a dimensão da matriz também pode ser vertical ou horizontal. No entanto, se o número de pontos e o número de variáveis de estado for o mesmo, a matriz será considerada como orientada horizontalmente, isto é, colunas correspondem a variáveis de estado e linhas correspondem ao número de pontos.


Importante: Esta macro realiza combinações das variáveis de estado segundo um movimento Browniano aritmético (ABM). Desta forma, o vetor de velocidades (drift) informado não deve ser o mesmo vetor de velocidades do movimento Browniano geométrico (GBM)!
O retorno desta função também está na forma ABM. Para o modelo multifatorial[2], o retorno da função equivale a não aplicação do operador exponencial para as taxas de juros, retornando yi.


Importante: Para o argumento Fator_Tempo, informe 1 se todas as bases são diárias. Informe 1/12 se a base temporal para simulação é mensal e a base das volatilidades e velocidades informadas é anual. Informe 12 se a base temporal de simulação é anual e a base das volatilidades e velocidades informadas é mensal.No modelo multifatorial[1], este número deve ser igual a 1, já que todas as bases são diárias.


Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Pontos).
O retorno da função sempre deve ser testado para verificação de erros!

Dica: Utilize como tabulador algum caractere que seja reconhecido pelo sistema de banco de dados existente!

Dica: Para gerar vários arquivos de saída para várias simulações, salve cada simulação em um diretório diferente após a geração dos arquivos. Cada vez que uma simulação é efetuada, os arquivos gerados sobrescrevem os arquivos anteriores. Cuidado para não utilizar arquivos de simulações anteriores com mais pontos da curva de juros, pois estes arquivos não são sobrescritos por uma simulação com menos pontos!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_JUROS _
Lib "multifatorial.xll" (Resultados() As Double, Vetor_Estados_Iniciais() As Variant, _
Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Vetor_Pontos_Iniciais() As Variant, Matriz_PCA() As Variant, _
ByVal Fator_Tempo As Double, ByVal Iteracoes As Long, ByVal Dimensões As Long, _
ByVal Base As Integer, ByVal Saída_Arquivo As Integer, Diretorio As String, Tabulador As String) As Integer
Sub Call_mf_juros()
Dim saida() As Double 'Matriz de saída
Dim estados() As Variant
Dim volatilidades() As Variant
Dim velocidades() As Variant
Dim pontos() As Variant
Dim matriz() As Variant
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim arg_saida As Integer
Dim arg_tabulador As String
Dim arg_diretorio As String
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
arg_base = Range("base_mf").Value
arg_dimensoes = Range("dimensoes_mf").Value
arg_iteracoes = Range("iteracoes_mf").Value
estados = Range("estados_mf").Value
volatilidades = Range("volatilidades_mf").Value
velocidades = Range("velocidades_mf").Value
pontos = Range("pontos_mf").Value
matriz = Range("matriz_mf").Value
arg_saida = Range("saida_mf").Value
arg_tabulador = Range("tabulador_mf").Value
arg_diretorio = Range("diretorio_mf").Value
resultado = MF_JUROS(saida, estados, volatilidades, velocidades, pontos, matriz, arg_iteracoes, arg_dimensoes, arg_base, arg_saida, arg_diretorio, arg_tabulador)
If resultado = 1 Then
'Coloca vetor a partir da célula macro_mf
'Coloca a profundidade deslocada
If arg_iteracoes > 5 Then arg_iteracoes = 5 'Limita a apresentação na tela
If arg_dimensoes > 50 Then arg_dimensoes = 50 'Limita a apresentação na tela
For t = 0 To 8
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("macro_mf").Offset(j * 9 + t, i + t).Value = saida(j, i, t)
Next
Next
Next
ElseIf resultado = -2 Then
MsgBox "Falha de criação de arquivos! Verifique permissão para gravar arquivos ou espaço em disco.", vbOKOnly + vbCritical, "Falha em Arquivos"
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub

Simulação

  • Variáveis de estado:

0,148694726

0,000115

0,0002

0,003

0,0001

  • Volatilidades

0,014457485

0,0155955

0,000895406

0,000450

0,000160

  • Velocidades

0,502807659

0,5000593

0,496863657

0,520000

0,530000

  • Pontos Iniciais

(1,741)

(1,723)

(1,690)

(1,635)

(1,590)

(1,546)

(1,551)

(1,5)

(1,45)

  • Matriz PCA

0,3644

(0,4261)

0,0394

0,0394

0,0394

0,3496

(0,4851)

0,1102

0,1102

0,1102

0,3741

(0,4232)

0,0237

0,0237

0,0237

0,3910

0,2174

(0,6836)

(0,6836)

(0,6836)

0,4261

0,3192

(0,1969)

(0,1969)

(0,1969)

0,3924

0,3625

0,1491

0,1491

0,1491

0,3414

0,3514

0,6764

0,6764

0,6764

0,3414

0,3514

0,6764

0,6764

0,6764

0,3414

0,3514

0,6764

0,6764

0,6764

  • Iterações 1000
  • Dimensões 250
  • Base 2
  • Fator Tempo 1

Gráfico contendo o caminho aleatório para o primeiro e segundo ponto da curva de juros para uma iteração apenas.

Considerando o histograma dos resultados, temos:

Este histograma representa a distribuição da primeira variável de estado após as iterações realizadas. Vale notar que esta distribuição é uma distribuição log-normal, pouco visível se observarmos diretamente a saída da variável. Se, no entanto, esta distribuição for normalizada LN(0,1), fica mais fácil observar a característica log-normal da curva.

Histograma normalizado LN(0,1) da primeira variável de estado.

Topo


2.1.8. Geração de Multifatorial para Taxas de Juros com Cubo Aleatório Fixo

Descrição: Gera o mesmo resultado que a geração de multifatorial para taxas de juros, porém recebe um cubo aleatório como parâmetro. O objetivo desta função é gerar um modelo multifatorial de taxas de juros a partir de um cubo aleatório determinado a fim de permitir outras operações com o mesmo cubo aleatório.

Retorna um modelo multifatorial para taxas de juros com um cubo onde a profundidade equivale aos vários pontos da curva de juros, a abscissa equivale às dimensões temporais e a ordenada equivale ao número de iterações. Adicionalmente e dependendo dos argumentos, gera arquivos de saída.

Para a opção de gerar vários arquivos de saída, para cada ponto da curva de juros simulado, é gerado um arquivo “curva_X.txt” onde X representa a ordem do ponto na curva de juros. Assim , o arquivo de saída para o terceiro ponto da curva de juros será “curva_3.txt”, tabulado conforme o parâmetro informado.

Para a opção de gerar um arquivo apenas, o arquivo de saída será o "curva_juros.txt" e será composto de todos os pontos da curva de juros, sendo cada iteração representada por tantas linhas quantos forem os pontos.

O formato dos campos no arquivo de saída tem 4 casas decimais, o que equivale a dizer que possuem duas casas decimais em percentuais.

2.1.8.1. Macro MF_JUROS_CF

Declaração:

Private Declare Function MF_JUROS_CF _
Lib multifatorial.xll (Resultados() As Double, Cubo() As Double, Vetor_Estados_Iniciais() As Variant, _
Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Vetor_Pontos_Iniciais() As Variant, Matriz_PCA() As Variant, _
ByVal Fator_Tempo As Integer, ByVal Saida_Arquivo as Integer, Diretorio as String, Tabulador as String) As Integer

Chamada: MF_JUROS_CF (Resultados, Cubo, Vetor_Estados_Iniciais, Vetor_Volatilidade, Vetor_Velocidades, Vetor_Pontos_Iniciais, Matriz_PCA, Saida_Arquivo, Tabulador)

Retorno : 1 para OK , -1 para ERRO geral e -2 para falha apenas na geração de arquivos de saída.

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Cubo

array double

Vetor de 3 dimensões contendo um cubo aleatório gerado a partir da chamada da macro MF_CUBO_ALEATORIO.

Vetor_Estados_Iniciais

array variant

Vetor unidimensional contendo o valor inicial das variáveis de estado. Deve ser coerente com a profundidade do parâmetro Cubo.

Vetor_Volatilidades

array variant

Vetor unidimensional contendo os parâmetros estatísticos para os caminhos aleatórios. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Velocidades

array variant

Vetor unidimensional contendo os parâmetros do relacionamento matemático (O-U)[1]. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Pontos_Iniciais

array variant

Vetor unidimensional contendo os pontos para os quais se deseja realizar o caminho. O tamanho deste vetor determinará o número de Pontos e também a profundidade do cubo de caminho aleatório gerado.

Matriz_PCA

array variant

Vetor de 2 dimensões contendo os parâmetros da Análise de Componentes Principais (PCA). Este vetor deve representar uma matriz N x M, onde N é igual ao número de variáveis de estado (Profundidade do cubo aleatório) e M é igual ao número de Pontos (profundidade do caminho aleatório).

Fator_Tempo

double

Número indicando a relação temporal entre as medidas de volatilidade e velocidade e a trajetória (steps) no tempo. Deve ser maior do que 0.

Saida_Arquivo

integer

Informa se o resultado deve ser direcionado também para arquivos de saída. Informe 1 para gerar um arquivo de saída para cada ponto, 2 para gerar um arquivo de saída contendo todos os pontos em linhas consecutivas e 0 (padrão) para não gerar arquivos. Gera indicador de gravação de arquivos.

Diretorio

string

Local onde serão gravados os arquivos de saída. Por exemplo, "c:\output".

Tabulador

string

Caractere para ser utilizado como tabulador entre campos caso haja saída para arquivos. Se for informada uma string vazia (“”), será utilizada uma tabulação como separador de campos. Só considera o primeiro caractere da string.

Ver Nota 3 e Nota Técnica 1.

Nota Técnica 2: Os arquivos tipo ".txt" têm uma limitação de tamanho devido a endereçamento de aproximadamente 4GB. Simulações que gerem volumes de dados superiores a este limite podem acarretar erro na geração dos arquivos.

Importante: Se a função retornar -2, houve falha apenas na geração dos arquivos, não comprometendo a utilização do argumento Resultados.
Possíveis causas deste tipo de falha são: diretório de saída inválido, espaço insuficiente em disco ou falta de permissão para efetuar gravações em disco.


Importante: A orientação dos vetores pode ser horizontal ou vertical. A orientação também pode ser horizontal para alguns vetores e vertical para outros. A dimensão de cada vetor deve ser coerente independentemente da orientação. Caso um vetor seja erroneamente dimensionado, a dimensão vertical terá prioridade sobre a horizontal e não acarretará erro se, e somente se, as outras dimensões forem coerentes com o erro!
Em caso de orientações diversificadas para os vetores, a dimensão da matriz também pode ser vertical ou horizontal. No entanto, se o número de pontos e o número de variáveis de estado for o mesmo, a matriz será considerada como orientada horizontalmente, isto é, colunas correspondem a variáveis de estado e linhas correspondem ao número de pontos.


Importante: Esta macro realiza combinações das variáveis de estado segundo um movimento Browniano aritmético (ABM). Desta forma, o vetor de velocidades (drift) informado não deve ser o mesmo vetor de velocidades do movimento Browniano geométrico (GBM)!
O retorno desta função também está na forma ABM. Para o modelo multifatorial[2], o retorno da função equivale a não aplicação do operador exponencial para as taxas de juros, retornando yi.


Importante: Para o argumento Fator_Tempo, informe 1 se todas as bases são diárias. Informe 1/12 se a base temporal para simulação é mensal e a base das volatilidades e velocidades informadas é anual. Informe 12 se a base temporal de simulação é anual e a base das volatilidades e velocidades informadas é mensal.No modelo multifatorial[1], este número deve ser igual a 1, já que todas as bases são diárias.


Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Pontos).
O retorno da função sempre deve ser testado para verificação de erros!


Importante: Esta macro, diferentemente da macro anterior de geração de multifatorial para taxas de juros (MF_JUROS), recebe um cubo aleatório como parâmetro. Isto possibilita cálculos adicionais com este cubo aleatório, porém reduz a velocidade dos cálculos efetuados e utiliza mais recursos do computador, como memória, podendo acarretar limitações maiores do que o modelo anterior.


Importante: Os parâmetros de iterações e dimensões são indicados no parâmetro Cubo. O número de variáveis de estado também é indicado no parâmetro Cubo (profundidade do cubo aleatório) e deve ser coerente com o número de variáveis de estado informado nos demais parâmetros de chamada.

Dica: Utilize como tabulador algum caractere que seja reconhecido pelo sistema de banco de dados existente!

Dica: Para gerar vários arquivos de saída para várias simulações, salve cada simulação em um diretório diferente após a geração dos arquivos. Cada vez que uma simulação é efetuada, os arquivos gerados sobrescrevem os arquivos anteriores. Cuidado para não utilizar arquivos de simulações anteriores com mais pontos da curva de juros, pois estes arquivos não são sobrescritos por uma simulação com menos pontos!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_JUROS_CF _
Lib "multifatorial.xll" (Resultados() As Double, Cubo() As Double, Vetor_Estados_Iniciais() As Variant, _
Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Vetor_Pontos_Iniciais() As Variant, Matriz_PCA() As Variant, ByVal Fator_Tempo As Double, _
ByVal Saída_Arquivo As Integer, Diretorio As String, Tabulador As String) As Integer
'Declarações para utilização em Macro - criação do cubo aleatório
Private Declare Function MF_CUBO_ALEATORIO Lib "multifatorial.xll" (Resultados() As Double, ByVal Iterações As Long, ByVal Dimensões As Long, ByVal Profundidade As Long, ByVal Base As Integer) As Integer
Sub Call_mf_juros_cf()
Dim saida() As Double 'Matriz de saída
Dim estados() As Variant
Dim volatilidades() As Variant
Dim velocidades() As Variant
Dim pontos() As Variant
Dim matriz() As Variant
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim arg_profundidade As Long
Dim arg_saida As Integer
Dim arg_tabulador As String
Dim arg_diretorio As String
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
Dim Cubo() As Double 'Matriz de saída para o cubo aleatório
arg_base = Range("base_mf_cf").Value
arg_dimensoes = Range("dimensoes_mf_cf").Value
arg_iteracoes = Range("iteracoes_mf_cf").Value
estados = Range("estados_mf_cf").Value
volatilidades = Range("volatilidades_mf_cf").Value
velocidades = Range("velocidades_mf_cf").Value
pontos = Range("pontos_mf_cf").Value
matriz = Range("matriz_mf_cf").Value
arg_saida = Range("saida_mf_cf").Value
arg_tabulador = Range("tabulador_mf_cf").Value
arg_diretorio = Range("diretorio_mf_cf").Value
arg_profundidade = Range("profundidade_mf_cf").Value
resultado = MF_CUBO_ALEATORIO(Cubo, arg_iteracoes, arg_dimensoes, arg_profundidade, arg_base)
If resultado = 1 Then
'Cubo foi montado
'Cubo poder ser utilizado em outras funções
'...........................................Utilização do cubo em outras funções aqui
'...........................................
'Utilização do cubo montado para gerar multifatorial
resultado = MF_JUROS_CF(saida, Cubo, estados, volatilidades, velocidades, pontos, matriz, 1, arg_saida, arg_diretorio, arg_tabulador)
If resultado = 1 Then
'Coloca a profundidade deslocada
If arg_iteracoes > 5 Then arg_iteracoes = 5 'Limita a apresentação na tela
If arg_dimensoes > 50 Then arg_dimensoes = 50 'Limita a apresentação na tela
For t = 0 To 8
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("mf_juros_cf").Offset(j * 9 + t, i + t).Value = saida(j, i, t)
Next
Next
Next
ElseIf resultado = -2 Then
MsgBox "Falha de criação de arquivos! Verifique permissão para gravar arquivos ou espaço em disco.", vbOKOnly + vbCritical, "Falha em Arquivos"
Else
MsgBox "Parâmetros incorretos para geração de multifatorial!", vbOKOnly + vbCritical, "Erro de Execução"
End If
Else
MsgBox "Parâmetros incorretos para geração de cubo aleatório!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub

Simulação

  • Variáveis de estado:

0,148694726

0,000115

0,0002

0,003

0,0001

  • Volatilidades

0,014457485

0,0155955

0,000895406

0,000450

0,000160

  • Velocidades

0,502807659

0,5000593

0,496863657

0,520000

0,530000

  • Pontos Iniciais

(1,741)

(1,723)

(1,690)

(1,635)

(1,590)

(1,546)

(1,551)

(1,5)

(1,45)

  • Matriz PCA

0,3644

(0,4261)

0,0394

0,0394

0,0394

0,3496

(0,4851)

0,1102

0,1102

0,1102

0,3741

(0,4232)

0,0237

0,0237

0,0237

0,3910

0,2174

(0,6836)

(0,6836)

(0,6836)

0,4261

0,3192

(0,1969)

(0,1969)

(0,1969)

0,3924

0,3625

0,1491

0,1491

0,1491

0,3414

0,3514

0,6764

0,6764

0,6764

0,3414

0,3514

0,6764

0,6764

0,6764

0,3414

0,3514

0,6764

0,6764

0,6764

  • Iterações 1000
  • Dimensões 250
  • Base 2
  • Fator Tempo 1
  • Variáveis de Estado 5 (informado para geração do cubo aleatório)

Gráfico contendo o caminho aleatório para o primeiro e segundo ponto da curva de juros para uma iteração apenas.

Considerando o histograma dos resultados, temos:

Este histograma representa a distribuição da primeira variável de estado após as iterações realizadas.

Histograma normalizado LN(0,1) da primeira variável de estado.

Topo


2.1.9. Ferramentas de Consulta

Descrição: Permite localizar no diretório de simulação, que contenha todos os arquivos de simulação, uma determinada iteração ou dimensão. Retorna um número equivalente a uma dimensão ou um vetor de dimensões para o ponto e para a iteração informada ou NULO (NULL) para falha de leitura de arquivo.

2.1.9.1. Função MF.CONSULTAR

Chamada: MF.CONSULTAR (Diretório, Ponto, Iteração, Dimensão, Vertical)

Argumento

Tipo

Descrição

Diretorio

string

Local onde se encontram os arquivos de simulação da curva de juros (p.ex. “c:/output”).

Ponto

integer

Ponto da curva de juros para o qual se deseja obter a simulação. Deve ser um número maior do que 0.

Iteração

long

Posição procurada no total das simulações. Deve ser um número maior do que 0.

Dimensão

long

Posição temporal procurada na simulação. Informe a posição no tempo ou 0 (padrão) para todo o vetor de dimensões temporais.

Vertical

boolean

Opcional. Permite a exibição da seqüência na horizontal (padrão ou 0) ou na vertical (informe 1).

Ver Notas 1 e 2.

Importante: O argumento Diretorio deve ser o local onde se encontram os arquivos de simulação gerados para a curva de juros com a opção 1 para o parâmetro Saida_Arquivo!


Importante: A ferramenta de consulta possui um formato padrão de busca de dados. Os arquivos gerados contendo os pontos da curva de juros não devem ser editados ou modificados para que esta função funcione corretamente.

Exemplo de utilização em uma célula:

  • Diretório onde se encontra o arquivo do ponto procurado “C:\Output”
  • Ponto da curva 2
  • Iteração 55
  • Todo o vetor
  • Saída horizontal

={MF.CONSULTAR("C:\Output";2;55;0;0) }

18,81%

18,91%

18,70%

18,48%

18,45%

18,55%

...


Topo


2.1.10. Geração de Cubo Aleatório Correlacionado

Descrição: Gera números em um cubo com variáveis aleatórias correlacionadas como profundidade e utilizando a decomposição de Cholesky para a matriz de correlações (sobre as variáveis de profundidade para um ponto no tempo) sobre um cubo aleatório resultado da aplicação da inversão da normal de Moro sobre um cubo de baixa discrepância, gerado pela seqüência de van der Corput com números entre (0,1) para todas as colunas, com a profundidade indicada na matriz de correlações (matriz profundidade x profundidade) e com trocas pseudo-randômicas não-determinísticas entre todos os elementos de todas as colunas, exceto para a primeira coluna da primeira profundidade. Retorna um cubo de aleatório para o número de dimensões, iterações e profundidade (dimensão da matriz de correlações) informada com consideração da correlação entre as variáveis de profundidade pela decomposição de Cholesky para cada vetor de variáveis em cada posição no tempo. Esta função é semelhante à geração de um cubo aleatório, porém, aceita parâmetros (matriz SPD de correlações) entre as variáveis de estado.

A matriz informada deve ser a matriz de correlações.

Esta matriz deve obrigatoriamente ser simétrica positiva-definida (SPD) para permitir a decomposição de Cholesky!

A consideração da variância de cada variável de estado não é feita na determinação deste cubo aleatório genérico.

2.1.10.1. Função MF.CUBO_CORREL

Chamada: MF.CUBO_ CORREL (Matriz_Correl, Iterações, Dimensões, Base)

Argumento

Tipo

Descrição

Matriz_Correl

array variant

Vetor de 2 dimensões contendo a matriz SPD de correlações entre as variáveis de profundidade (variáveis de estado, p.ex.).

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Notas 1, 2 e 3 e Nota Técnica 1.

Importante: A profundidade do cubo é representada por linhas. Assim sendo, se o cubo possuir por exemplo duas profundidades, a primeira iteração para a primeira profundidade corresponderá à primeira linha e a primeira iteração para a segunda profundidade corresponderá à segunda linha. A segunda iteração para a primeira profundidade corresponderá à terceira linha e a segunda iteração para a segunda profundidade corresponderá à quarta linha e assim sucessivamente.

Exemplo de utilização em uma célula:

  • Matriz SPD de correlações:

1

0,5

0,4

0,5

1

0,3

0,4

0,3

1

  • Iterações 7
  • Dimensões 50
  • Base 2

={MF.CUBO_CORREL({1.0,5.0,4;0,5.1.0,3;0,4.0,3.1};7;50;2)}

-

(0,318639)

(0,318639)

(1,150349)

1,150349

...

0,27595

0,116630

(0,159320)

(0,299225)

(0,008951)

...

0,32650

(0,703917)

0,485799

0,622565

0,995511

...

(0,67449)

(1,150349)

(1,150349)

1,150349

(1,150349)

...

(0,61319)

(0,851124)

(1,159300

0,299225

(1,571406)

...

(0,30659)

(1,542845)

0,507888

1,036601

(0,592971)

...

0,67449

0,318639

0,318639

0,318639

(0,318639)

...

0,92137

0,159320

0,743445

(0,836912)

(0,435269)

...

(0,26557)

0,740710

(0,084372)

0,284336

(0,777503)

...

(1,15035)

-

1,150349

(0,318639)

0,318639

...

(0,57517)

0,996232

0,851124

(0,743445)

0,435269

...

0,58577

0,132831

0,786644

(1,251251)

0,453960

...

0,31864

0,674490

(0,674490)

(0,674490)

0,674490

...

1,15555

0,921370

0,658987

0,246880

0,337245

...

(0,02942)

0,637390

(0,136965)

(0,805167)

(0,019915)

...

(0,31864)

1,150349

0,674490

-

(0,674490)

...

(0,74344)

(0,421057)

(0,658987)

0,996232

0,658987

...

0,40792

1,373220

(0,908947)

0,132831

0,908947

...

1,15035

(0,674490)

-

0,674490

-

...

(0,42106)

(0,921370)

(0,275950)

0,337245

0,584125

...

(0,71860)

(0,637390)

(0,650048)

(0,019915)

(0,968028)

...

2.1.10.2. Macro MF_CUBO_CORREL

Declaração:

Private Declare Function MF_CUBO_CORREL _ Lib multifatorial.xll (Resultados() As Double, Matriz_Correl() as Variant, _
ByVal Iterações As Long, ByVal Dimensões As Long, ByVal Base As Integer) As Integer

Chamada: MF_CUBO_CORREL (Resultados, Matriz_Correl, Iterações, Dimensões, Base)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Matriz_Correl

array variant

Vetor de 2 dimensões contendo a matriz SPD de correlações entre as variáveis de profundidade (variáveis de estado, p.ex.).

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Nota 3 e Nota Técnica 1.

Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Profundidade).
O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_CUBO_CORREL Lib "multifatorial.xll" (Resultados() As Double, Matriz_Correl() as Variant, ByVal Iterações As Long, ByVal Dimensões As Long, ByVal Base As Integer) As Integer
Sub Call_cubo_correlacionado()
'Testa a utilização da função de van der Corput + Moro + matriz de correlações para cubo correlacionado
Dim saida() As Double 'Matriz de saída
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim matriz_correl() As variant
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
arg_base = Range("base_correl").Value
arg_dimensoes = Range("dimensoes_correl").Value
arg_iteracoes = Range("iteracoes_correl").Value
matriz_correl = Range("matriz_correl").Value
resultado = MF_CUBO_CORREL(saida, matriz_correl, arg_iteracoes, arg_dimensoes, arg_base)
If resultado = 1 Then
'Coloca vetor a partir da célula cubo_correl
'Coloca a profundidade deslocada
For t = 0 To (3 - 1)
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("cubo_correl").Offset(j * 3 + t, i + t).Value = saida(j, i, t)
Next
Next
Next
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub

Simulação

  • Iterações 1000
  • Dimensões 250
  • Base 2
  • Matriz SPD de correlações

1

0,95

0,5

0,95

1

0,5

0,5

0,5

1

Movimento aleatório fortemente correlacionado para a primeira e segunda variável.

  • Matriz SPD de correlações

1

0

0

0

1

0

0

0

1

Movimento para primeira e segunda variável utilizando uma matriz sem correlações. Percebe-se a dispersão e independência dos movimentos.

Topo


2.1.11. Geração de Movimento Browniano Aritmético Correlacionado com Reversão para Média - MBACRM

Descrição: Gera um caminho aleatório correlacionado representado espacialmente por um cubo onde a profundidade do cubo reflete o número de variáveis, a abscissa reflete o próprio caminho no tempo (i.e. dimensões temporais) e a ordenada significa o número de iterações. O caminho é gerado de acordo com os parâmetros de entrada, como pontos iniciais e parâmetros estatísticos, e segundo um Browniano aritmético com reversão para média (Ornstein-Uhlenbeck) para cada uma das variáveis.

O cubo base para a aplicação do caminho aleatório é um cubo com variáveis aleatórias correlacionadas pela utilização da decomposição de Cholesky para a matriz SPD de correlações (sobre as variáveis para um ponto no tempo) sobre um cubo aleatório resultado da aplicação da inversão da normal de Moro sobre um cubo de baixa discrepância, gerado pela seqüência de van der Corput com números entre (0,1) para todas as colunas, com a profundidade indicada na matriz SPD de correlações (matriz profundidade x profundidade) e com trocas pseudo-randômicas não-determinísticas entre todos os elementos de todas as colunas, exceto para a primeira coluna da primeira profundidade. Retorna um cubo de correlacionado para o número de dimensões, iterações e profundidade (dimensão da matriz de correlações) informada com consideração da correlação entre as variáveis de profundidade pela decomposição de Cholesky para cada vetor de variáveis em cada posição no tempo. Esta função é semelhante à geração de um cubo correlacionado, porém, realiza um movimento Browniano com reversão para uma média.

A matriz informada deve ser a matriz de correlações. Esta matriz deve ser obrigatoriamente SPD – simétrica positiva-definida!

2.1.11.1. Macro MF_CUBO_MBACRM

Declaração:

Private Declare Function MF_CUBO_MBACRM _
Lib multifatorial.xll (Resultados() As Double, Vetor_Variaveis_Iniciais() As Variant, _
Vetor_Medias() as Variant, Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Matriz_Correl() As Variant, ByVal Fator_Tempo As Integer, ByVal Iteracoes As Long, _
ByVal Dimensões As Long, ByVal Base As Integer) As Integer

Chamada: MF_CUBO_MBACRM (Resultados, Vetor_Variaveis_Iniciais, Vetor_Medias, Vetor_Volatilidade, Vetor_Velocidades, Matriz_Correl, Fator_Tempo, Iterações, Dimensões, Base)

Retorno: 1 para OK e –1 para ERRO

Argumento

Tipo

Descrição

Resultados

array double

Vetor de 3 dimensões para receber a geração de dados.

Vetor_Variaveis_Iniciais

array variant

Vetor unidimensional contendo o valor inicial das variáveis correlacionadas. O tamanho deste vetor determinará o parâmetro de Profundidade do cubo gerado.

Vetor_Medias

array variant

Vetor unidimensional contendo as médias para reversão de cada variável. Deve ter o mesmo tamanho que o vetor de variáveis iniciais e deve representar a média destas variáveis para um movimento aritmético browniano.

Vetor_Volatilidades

array variant

Vetor unidimensional contendo os parâmetros estatísticos para os caminhos aleatórios. Deve ter o mesmo tamanho que o vetor de estados iniciais.

Vetor_Velocidades

array variant

Vetor unidimensional contendo os parâmetros de velocidade de reversão para as variáveis. Deve ter o mesmo tamanho que o vetor de variáveis iniciais e deve representar a velocidade de reversão para a média de um movimento aritmético browniano.

Matriz_Correl

array variant

Vetor de 2 dimensões contendo a matriz SPD de correlações entre as variáveis.

Fator_Tempo

double

Número indicando a relação temporal entre as medidas de volatilidade e velocidade e a trajetória (steps) no tempo. Deve ser maior do que 0.

Iterações

long

Número de iterações para geração de dados. O número Iterações deve ser maior do que 0.

Dimensões

long

Número de dimensões temporais da matriz. O número Dimensões deve ser maior do que 0.

Base

integer

Número base para a seqüência de van der Corput. O número Base deve ser maior do que 1.

Ver Nota 3 e Nota Técnica 1.

Importante: A orientação dos vetores pode ser horizontal ou vertical. A orientação também pode ser horizontal para alguns vetores e vertical para outros. A dimensão de cada vetor deve ser coerente independentemente da orientação. Caso um vetor seja erroneamente dimensionado, a dimensão vertical terá prioridade sobre a horizontal e não acarretará erro se, e somente se, as outras dimensões forem coerentes com o erro!


Importante: Esta macro realiza combinações das variáveis de estado segundo um movimento Browniano aritmético (ABM). Desta forma, o vetor de velocidades (drift) informado não deve ser o mesmo vetor de velocidades do movimento Browniano geométrico (GBM)! O vetor de médias informado também deve ser o vetor de médias para um movimento ABM!


Importante: Para o argumento Fator_Tempo, informe 1 se todas as bases são diárias. Informe 1/12 se a base temporal para simulação é mensal e a base das volatilidades e velocidades informadas é anual. Informe 12 se a base temporal de simulação é anual e a base das volatilidades e velocidades informadas é mensal.


Importante: O argumento Resultados da função deve ser um vetor com alocação dinâmica e a saída será um cubo (Iterações, Dimensões, Variaveis).
O retorno da função sempre deve ser testado para verificação de erros!

Exemplo de utilização em VBA:

'Declarações para utilização em Macro
Private Declare Function MF_CUBO_MBACRM _
Lib "multifatorial.xll" (Resultados() As Double, Vetor_Variaveis_Iniciais() As Variant, _
Vetor_Medias() as Variant, Vetor_Volatilidades() As Variant, Vetor_Velocidades() As Variant, _
Matriz_Correl() As Variant, ByVal Fator_Tempo As Double, ByVal Iteracoes As Long, _
ByVal Dimensões As Long, ByVal Base As Integer) As Integer
Sub Call_cubo_mbacrm()
'Testa a geração de um caminho segundo um movimento browniano com reversão para média
Dim saida() As Double 'Matriz de saída
Dim variaveis() As Variant
Dim medias() As Variant
Dim volatilidades() As Variant Dim velocidades() As Variant
Dim pontos() As Variant
Dim matriz_correl() As Variant
Dim arg_base As Integer
Dim arg_dimensoes As Long
Dim arg_iteracoes As Long
Dim resultado As Integer
Dim j As Long
Dim i As Long
Dim t As Long
arg_base = Range("base_mbacrm").Value
arg_dimensoes = Range("dimensoes_mbacrm").Value
arg_iteracoes = Range("iteracoes_mbacrm").Value
variaveis = Range("variaveis_mbacrm").Value
volatilidades = Range("volatilidades_mbacrm").Value
velocidades = Range("velocidades_mbacrm").Value
medias = Range("medias_mbacrm").Value
matriz_Correl = Range("matriz_mbacrm").Value
resultado = MF_CUBO_MBACRM(saida, variaveis, medias ,volatilidades, velocidades, matriz_correl, 1, arg_iteracoes, arg_dimensoes, arg_base)
If resultado = 1 Then
'Coloca vetor a partir da célula cubo_mbacrm
'Coloca a profundidade deslocada
If arg_iteracoes > 5 Then arg_iteracoes = 5 'Limita a apresentação na tela
If arg_dimensoes > 20 Then arg_dimensoes = 20 'Limita a apresentação na tela
For t = 0 To (3 - 1)
For j = 0 To (arg_iteracoes - 1)
For i = 0 To (arg_dimensoes - 1)
Range("cubo_mbacrm").Offset(j * 3 + t, i + t).Value = saida(j, i, t)
Next
Next
Next
Else
MsgBox "Parâmetros incorretos!", vbOKOnly + vbCritical, "Erro de Execução"
End If
End Sub

Simulação

  • Variáveis de estado:

0,148694726

0,0001149

0,105594131

  • Volatilidades

0,014457485

0,0155955

0,000160

  • Velocidades

0,502807659

0,5000593

0,496863657

  • Médias

0,200

0,200

0,200

  • Matriz SPD de correlações

1

0,95

0,5

0,95

1

0,5

0,5

0,5

1

  • Iterações 1000
  • Dimensões 200
  • Base 2
  • Fator Tempo 1

Movimento aritmético Browniano sem correlação com reversão para média para a primeira e segunda variável.


Topo


Manual e Ajuda para o add-in Multifatorial para Taxas de Juros

-> Conteúdo

Anterior: 1. Instalação

Próxima: 3. REFERÊNCIAS BIBLIOGRÁFICAS

Home | Sobre a Élin Duxus | Ferramentas | CED | Papers | News | Parcerias | Clientes | Modelos | Carreira | Contato
©Todos os direitos reservados - Élin Duxus - Brasil - 2002 - 2010


Curso de Excel, curso de fórmulas, curso de macros, planilhas - Curso de Matemática Financeira, HP 12C - Curso de Opções, precificação de opções, letras gregas de opções - Curso de VaR (Value at Risk) - Curso de Renda Variável, ações, ADR e arbitragens internacionais - Profissionais certificados e certificação - Suplementos (add-in) de Excel para finanças e mercado financeiro - Suplementos (add-in) de Excel customizados - Desenvolvimento de sistemas e aplicativos, tecnologia - C/C++, VBA, macros, modelos - ARCH, GARCH, TGARCH, ICARG - Comunicação entre planilhas em rede - Modelamento financeiro - Consultoria financeira, Finanças - Estudo de fluxo de caixa - Downloads de suplementos e add-ins de Excel - Modelos e Templates - Sistema de Risco Duxus - Value at Risk - Resolução 3490 - Circular 3361 - Circular 3362 - Circular 3363 - Circular 3364 - Circular 3365 - Circular 3366 - Circular 3367 - Circular 3368 - Circular 2972 - Resolução 2804 - Stress Test - Análise de Liquidez - VaR - Modelos de Excel - Modelos de DRE - Indicadores Financeiros - ALM - Asset Liability Simulation - Sistema de Risco Duxus - Value at Risk - Resolução 3490 - Circular 3361 - Circular 3362 - Circular 3363 - Circular 3364 - Circular 3365 - Circular 3366 - Circular 3367 - Circular 3368 - Circular 2972 - Resolução 2804 - Stress Test - Análise de Liquidez - VaR