UDF VBA производит нули. Нет ошибок, только нули. Может кто-нибудь, пожалуйста, проверьте мой код - PullRequest
0 голосов
/ 06 июля 2018

'Функция VBA рассчитывает форвардную ставку на 1 год через 0,5, 1, 1,5 и 2 года и т. Д. Все результаты равны нулю;нет ошибок, просто нули.Кто-нибудь может посоветовать, где я иду не так.Спасибо

Function OneYearFwdRates(Mty As Range, Spots As Range) As Variant
Dim Maturities()
ReDim Maturities(Mty.Rows.Count)  'Mty is the range of maturities'
Dim SpotRates()
ReDim SpotRates(Spots.Rows.Count)  'Spots is the range of spot rates'
Dim OYFR()                         'OYFR stands for One Year Forward Rates'
ReDim OYFR(Spots.Rows.Count)
Dim i

For i = 2 To Spots.Rows.Count - 2
    OYFR(i) = (1 + SpotRates(i + 2)) ^ (Maturities(i + 2)) _
        / (1 + SpotRates(i)) ^ (Maturities(i)) - 1
Next i
OneYearFwdRates = OYFR

End Function

Ниже приведена таблица.Я хочу заполнить синюю колонку с заголовком «Форвардные ставки» f (x, 1) приведенным выше кодом

                        Forward Rate
Maturity    Spot Rate     f(x,1)
 0.00         0.0200    
 0.5          0.0218    
 1.0          0.0231    
 1.5          0.0243    
 2.0          0.0253    
 2.5          0.0261    
 3.0          0.0268    
 3.5          0.0273    
 4.0          0.0277    
 4.5          0.0281    
 5.0          0.0284    
 5.5          0.0287    
 6.0          0.0289    
 6.5          0.0291    
 7.0          0.0293    
 7.5          0.0295    
 8.0          0.0296    
 8.5          0.0298    
 9.0          0.0299    
 9.5          0.0300    
 10.0         0.0301    
 10.5         0.0302    
 11.0         0.0303    
 11.5         0.0303    
 12.0         0.0304    
 12.5         0.0304    

1 Ответ

0 голосов
/ 06 июля 2018

Проблема в том, что вы никогда не назначаете никакие значения Maturities() или SpotRates. Вам не нужны эти переменные, если диапазон состоит из одной строки или столбца. SpotRates(1) вернет первую ячейку в диапазоне, SpotRates(2) - вторую.

Function OneYearFwdRates(Mty As Range, Spots As Range) As Double()
    Dim OYFR() As Double                            'OYFR stands for One Year Forward Rates'
    ReDim OYFR(1 To Spots.Rows.Count, 1 To 1)
    Dim i

    For i = 2 To Spots.Rows.Count - 2
        OYFR(i, 1) = (1 + Spots(i + 2)) ^ (Mty(i + 2)) _
                  / (1 + Spots(i)) ^ (Mty(i)) - 1
        ' Debug.Print Spots(i), Mty(i)
    Next i
    OneYearFwdRates = OYFR
End Function

Эта функция возвращает массив и должна быть введена как любая другая формула массива, используя Ctrl + Shift + Enter .

...