Рассмотрим этот подход:
В матрице корреляции нам нужно только взглянуть на числа либо «выше», либо «ниже» диагональной линии «1» с. Все остальные значения являются просто зеркальным отображением, смотреть на них было бы пустой тратой времени.
Поэтому мы пытаемся взглянуть на треугольник координат:
A (1) B (2) C (3) D (4) E (5)
1 Disney Microsoft Apple sp500
2 Disney 1 0.764790855 0.737566223 0.832602399
3 Microsoft 0.764790855 1 0.754724823 0.827980429
4 Apple 0.737566223 0.754724823 1 0.90982066
5 sp500 0.832602399 0.827980429 0.90982066 1
Excel также считает столбцы из 1, это то, что цифры в скобках. Координаты столбца строки, которые мы хотим проверить, могут быть «нижней» половиной, например так («x» обозначает диагональные ячейки со значением 1):
A (1) B (2) C (3) D (4) E (5)
1
2 x
3 (3,2) x
4 (4,2) (4,3) x
5 (5,2) (5,3) (5,4) x
Вложенный l oop может создать эти пары координат. L oop работает для строк 3..5 и столбцов 2..4 соответственно, но исключает любые столбцы за пределами "треугольника":
Sub LeastCorrelated(NumStocks As Integer)
Dim corrMatrix As Worksheet
Dim minimumCell As Range, cell As Range
Dim r As Integer, c As Integer
Dim stock1 As String, stock2 As String
Set corrMatrix = Worksheets("Correlation Matrix")
Set minimumCell = corrMatrix.Cells(2, 2) ' the top-left cell containing "1"
For r = 3 To NumStocks + 1
For c = 2 To r - 1
Set cell = corrMatrix.Cells(r, c)
If cell.Value < minimumCell.Value Then Set minimumCell = cell
Next
Next
minimumCell.Select
stock1 = corrMatrix.Cells(1, minimumCell.Column).Value
stock2 = corrMatrix.Cells(minimumCell.Row, 1).Value
Debug.Print stock1 & " / " & stock2
End Sub
Когда вызывается как
LeastCorrelated 4
печатает
Disney / Apple
и выбирает ячейку A4.