VBA UDF рассчитает ковариацию из ежедневных цен акций - PullRequest
0 голосов
/ 03 мая 2020

Результат Снимок экрана: ОШИБКА:

Result Screenshot: ERROR

Пример данных Снимок экрана:

Sample data Screenshot

Я новичок в VBA и сейчас Я застрял с ошибкой. Я хочу рассчитать ковариацию, взяв цены акций в качестве параметра, который возвращает массив * n (n = количество столбцов его параметра). Я не могу понять свою ошибку в следующем коде:

Function covarmat(prices As Range) As Variant
    Dim i As Integer, j As Integer
    Dim n As Integer

    n = prices.Columns.Count

    Dim resultarray()

    ReDim resultarray(n, n)
    Dim f  'as a proxy for return variant
    Dim basicarray() 'to extract columns and calculate returns
    ReDim basicarray(prices.Rows.Count, prices.Columns.Count)                                               Tried this separately! Works perfect!

    For j = 1 To prices.Columns.Count
        For i = 1 To prices.Rows.Count
            basicarray(i, j) = prices(i + 1, j) / prices(i, j) - 1
        Next i
    Next j
    f = basicarray

    For i = 1 To n
        For j = 1 To n
            resultarray(i, j) = Application.Covariance_S(f.columns(i), f.Columns(j))
        Next j
    Next i

covarmat = resultarray
End Function

1 Ответ

0 голосов
/ 03 мая 2020

Это даст вам массив covarinace_s. Так что это формула массива. Выберите диапазон, равный n * n, и введите формулу (Ctrl + Shift + Enter).

Function covarmat(prices As Range) As Variant
    Dim i As Integer, j As Integer
    Dim n As Integer

    n = prices.Columns.Count

    Dim resultarray()
    ReDim resultarray(1 To n, 1 To n)

    Dim basicarray()
    ReDim basicarray(1 To prices.Rows.Count - 1, 1 To n)

    For j = 1 To n
        For i = 1 To prices.Rows.Count - 1
            basicarray(i, j) = prices(i + 1, j) / prices(i, j) - 1
        Next i
    Next j

    For i = 1 To n
        For j = 1 To n
            resultarray(i, j) = Application.Covariance_S _
            (Application.WorksheetFunction.Index(basicarray, 0, i), _
            Application.WorksheetFunction.Index(basicarray, 0, j))
        Next j
    Next i

covarmat = resultarray
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...