Boa tarde,
Tenho uma macro na qual defino uma função (mcubicspline) dentro de outra (mgetvoldol); a mgetvoldol calcula, no loop, a variável delta que é input da mcubicspline.
A mcubicspline trata o delta como uma matriz mas o output da mgetvol é um variant (double).
Dessa maneira, quando se tenta indexar um índice de matriz no delta, tenho o erro: "Erro em tempo de execução '13': tipos incompatíveis".
Fiz um teste o qual não solucionou mas ajudou: quando chamo a função mcubicspline referenciando, para o valor atribuído ao delta, uma célula com seu valor, calculo o spline de maneira correta, no entanto, quando escrevo, no cabeçalho da função, o valor do delta, tenho erro de #valor.
Sei que a função mcubicspline está correta mas estou com dificuldade em manipular as variáveis para linkar as duas funções, poderiam me ajudar?
Abaixo seguem os códigos:
Function mgetVolDol(Futuro As Double, Taxa As Double, Strike As Double, DU As Double, XArray As Variant, YArray As Variant) As Double
Dim x0, x, y, dum As Double
Dim delta As Variant
x0 = 0
x = 0.1
Do While Abs(x - x0) > 0.000001
x0 = x
dum = (Log(Futuro / Strike) + x ^ 2 / 2 * DU / 252) / (x * Sqr(DU / 252))
y = mNorm(dum)
delta = 1 - y 'se ploto o valor numa celula, a spline funciona, senão a spline dá erro de valor.
Range("p6").Value = delta
x = mCubicSpline(XArray, YArray, Range("p6").Value)
Loop
mgetVolDol = x
End Function
Function mCubicSpline(XArray As Variant, YArray As Variant, x As Variant)
Dim nRates As Double
nRates = Application.WorksheetFunction.Count(XArray) - 1
Dim m(), N(), Alfa(), Beta(), delta(), Q(), a(), B(), C() As Variant
'XArray é a matriz de deltas [0.05 0.10 0.25 0.35 0.50 0.65 0.75 0.90 0.95]
'YArray é a matriz de vols vinda da mVolatIDI para cada um dos deltas da XArray
'X é a resolução dos deltas no gráfico
ReDim m(0 To nRates + 1)
ReDim N(0 To nRates + 1)
ReDim Alfa(0 To nRates + 1)
ReDim Beta(0 To nRates + 1)
ReDim delta(0 To nRates + 1)
ReDim Q(0 To nRates + 1)
ReDim a(0 To nRates + 1)
ReDim B(0 To nRates + 1)
ReDim C(0 To nRates + 1)
For i = 0 To nRates - 1
m(i) = XArray(i + 2) - XArray(i + 1)
N(i) = YArray(i + 2) - YArray(i + 1)
Next
For i = 1 To nRates - 1
Q(i) = 3 * (N(i) / m(i) - N(i - 1) / m(i - 1))
Next
Alfa(0) = 1
Beta(0) = 0
delta(0) = 0
For i = 1 To nRates - 1
Alfa(i) = 2 * (m(i - 1) + m(i)) - m(i - 1) * Beta(i - 1)
Beta(i) = m(i) / Alfa(i)
delta(i) = (Q(i) - m(i - 1) * delta(i - 1)) / Alfa(i)
Next
Alfa(nRates) = 0
B(nRates) = 0
delta(nRates) = 0
For j = (nRates - 1) To 0 Step -1
B(j) = delta(j) - Beta(j) * Beta(j + 1)
a(j) = N(j) / m(j) - m(j) / 3 * (B(j + 1) + 2 * B(j))
C(j) = (B(j + 1) - B(j)) / (3 * m(j))
Next
nn = Application.Count(x)
Dim z() As Double
ReDim z(0 To nn + 1)
For i = 1 To nn
ArrayNo = Application.Match(x(i), XArray) ERRO '13' ACONTECE AQUI PARA TIPOS INCOMPATÍVEIS EM x(i)
Ti = Application.Index(XArray, ArrayNo)
y1 = Application.Index(YArray, ArrayNo)
ai = Application.Index(a(), ArrayNo)
bi = Application.Index(B(), ArrayNo)
ci = Application.Index(C(), ArrayNo)
z(i - 1) = y1 + ai * (x(i) - Ti) + bi * (x(i) - Ti) ^ 2 + ci * (x(i) - Ti) ^ 3
Next
mCubicSpline = Application.Transpose(z())
End Function
Postado : 03/08/2015 12:37 pm