Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.86 KB | None | 0 0
  1. Option Explicit
  2. 'https://chat.stackoverflow.com/rooms/167099/discussion-between-qharr-and-i--newb
  3.  
  4. Public Sub PerformLogOperation()
  5.  
  6. Dim wbTarget As Workbook
  7. Dim wsTarget As Worksheet
  8.  
  9. Set wbTarget = ThisWorkbook
  10. Set wsTarget = wbTarget.Worksheets("HistoricalDataandCalculations")
  11.  
  12. Dim namedRange As Range
  13. Dim namesArr()
  14.  
  15. Set namedRange = wsTarget.Range("HDaCReturns")
  16.  
  17. namesArr = GetNamedRangeNames(namedRange)
  18.  
  19. CreateNamedRanges namedRange, namesArr
  20.  
  21. With wsTarget
  22. .Range(.Cells(namedRange.Row + namedRange.Rows.Count, 1), .Cells(.Rows.Count, .Columns.Count)).ClearContents
  23. End With
  24.  
  25. PopulateFormulas namedRange
  26.  
  27. AddMeanSDCalculations namesArr, namedRange, wsTarget
  28.  
  29. ConvertFormulasToValues wsTarget
  30.  
  31. Dim targetVarMatrixCell As Range
  32.  
  33. With namedRange
  34. Set targetVarMatrixCell = .Offset(.Rows.Count + 1, .Columns.Count + 2).Resize(1, 1) 'the top left corner cell of matrix (will be empty as between headers)
  35. End With
  36.  
  37. AddVarianceCovarianceMatrix targetVarMatrixCell, namesArr, namedRange
  38.  
  39. End Sub
  40.  
  41. Public Sub CreateNamedRanges(ByVal namedRange As Range, ByVal namesArr As Variant, Optional wbTarget As Workbook)
  42.  
  43. Dim currentNamedRange As Long
  44. Dim tempRange As Range
  45. Dim tempRangeName As String
  46.  
  47. If wbTarget Is Nothing Then Set wbTarget = ThisWorkbook
  48.  
  49. Dim sheetName As String
  50. Dim startRow As Long
  51. Dim endRow As Long
  52. Dim columnForCount
  53.  
  54. sheetName = namedRange.Parent.Name
  55. startRow = namedRange.Row + 2
  56. endRow = namedRange.Parent.Cells.Rows.Count
  57. columnForCount = namedRange.Column
  58.  
  59. For currentNamedRange = LBound(namesArr, 2) To UBound(namesArr, 2)
  60.  
  61. With namedRange
  62. Set tempRange = .Columns(currentNamedRange + 1).Offset(2, 0).Resize(.Rows.Count - 2, 1)
  63. End With
  64.  
  65. tempRangeName = Trim$(namesArr(1, currentNamedRange))
  66.  
  67. wbTarget.Names.Add Name:=tempRangeName, _
  68. RefersTo:="=OFFSET(" & sheetName & "!R" & startRow & "C" & columnForCount + currentNamedRange & _
  69. ",0,0,COUNT(" & sheetName & "!R" & startRow & "C" & columnForCount & ":R" & endRow & "C" & _
  70. columnForCount & ")-1,1)"
  71.  
  72. Set tempRange = Nothing
  73. tempRangeName = vbNullString
  74.  
  75. Next currentNamedRange
  76.  
  77. End Sub
  78.  
  79. Public Function GetNamedRangeNames(ByVal namedRange As Range) As Variant
  80.  
  81. Dim namesArr()
  82.  
  83. With namedRange.Rows(1)
  84.  
  85. namesArr = .Offset(, 1).Resize(1, .Columns.Count - 1).Value2
  86.  
  87. End With
  88.  
  89. GetNamedRangeNames = namesArr
  90.  
  91. End Function
  92.  
  93. Public Sub AddMeanSDCalculations(ByVal namesArr As Variant, ByVal namedRange As Range, ByVal wsTarget As Worksheet)
  94.  
  95. Dim currentName As Long
  96.  
  97. With namedRange
  98. .Offset(.Rows.Count + 1, .Columns.Count).Resize(1, 1) = "Average"
  99. .Offset(.Rows.Count + 3, .Columns.Count).Resize(1, 1) = "StDev_P"
  100. .Offset(.Rows.Count + 5, .Columns.Count).Resize(1, 1) = "Var_P"
  101. .Offset(.Rows.Count + 7, .Columns.Count).Resize(1, 1) = "Excess Returns"
  102. .Offset(.Rows.Count, (.Columns.Count * 3) - 2).Resize(1, 1) = "Mean Returns"
  103. .Offset(.Rows.Count, 3 * .Columns.Count).Resize(1, 1) = "Portfolio Proportions"
  104. End With
  105.  
  106. For currentName = LBound(namesArr, 2) To UBound(namesArr, 2)
  107.  
  108. With namedRange
  109. .Offset(.Rows.Count + 1, currentName).Resize(1, 1) = Application.WorksheetFunction.Average(wsTarget.Range(namesArr(1, currentName)))
  110. .Offset(.Rows.Count + 3, currentName).Resize(1, 1) = Application.WorksheetFunction.StDev_P(wsTarget.Range(namesArr(1, currentName)))
  111. .Offset(.Rows.Count + 5, currentName).Resize(1, 1) = Application.WorksheetFunction.Var_P(wsTarget.Range(namesArr(1, currentName)))
  112. End With
  113.  
  114. Next currentName
  115.  
  116. Dim portfolioProportions As Range
  117.  
  118. With namedRange
  119. .Offset(.Rows.Count + 2, (.Columns.Count * 3) - 2).Resize(.Columns.Count - 1, 1) = Application.WorksheetFunction.Transpose(.Offset(.Rows.Count + 1, 1).Resize(1, .Columns.Count - 1))
  120. Set portfolioProportions = .Offset(.Rows.Count + 2, (.Columns.Count * 3)).Resize(.Columns.Count - 1, 1)
  121. End With
  122.  
  123. portfolioProportions = 0.2
  124.  
  125. End Sub
  126.  
  127. Public Sub PopulateFormulas(ByVal namedRange As Range)
  128.  
  129. Dim returns As Range
  130. Dim excessReturns As Range
  131.  
  132. With namedRange
  133.  
  134. Set returns = .Offset(2, 1).Resize(.Rows.Count - 3, .Columns.Count - 1)
  135. Set excessReturns = .Offset(.Rows.Count + 7, 1).Resize(.Rows.Count - 3, .Columns.Count - 1)
  136.  
  137. End With
  138.  
  139. returns.FormulaR1C1 = "=LN(R[-103]C/R[-102]C)"
  140. excessReturns.FormulaArray = "=R[-106]C:R[-9]C[3]-R[-6]C:R[-6]C[3]" 'TODO Verify fit for purpose if num columns changes
  141.  
  142. End Sub
  143.  
  144. Public Sub ConvertFormulasToValues(ByVal wsTarget As Worksheet)
  145.  
  146. With wsTarget.UsedRange
  147. .Value = .Value
  148. End With
  149.  
  150. End Sub
  151.  
  152. Public Sub AddVarianceCovarianceMatrix(ByVal targetVarMatrixCell As Range, ByVal namesArr As Variant, ByVal namedRange As Range)
  153.  
  154. Dim columnHeaders As Range
  155. Dim rowHeaders As Range
  156. Dim matrixArea As Range
  157. Dim excessReturns As Range
  158.  
  159. Set columnHeaders = targetVarMatrixCell.Offset(, 1).Resize(1, UBound(namesArr, 2))
  160. Set rowHeaders = targetVarMatrixCell.Offset(1, 0).Resize(UBound(namesArr, 2), 1)
  161. Set matrixArea = targetVarMatrixCell.Offset(1, 1).Resize(UBound(namesArr, 2), UBound(namesArr, 2))
  162.  
  163. With targetVarMatrixCell.Offset(-2, 0)
  164. .Value = "Variance-Covariance Matrix"
  165. .HorizontalAlignment = xlLeft
  166. End With
  167.  
  168. With namedRange
  169.  
  170. Set excessReturns = .Offset(.Rows.Count + 7, 1).Resize(.Rows.Count - 3, .Columns.Count - 1)
  171.  
  172. End With
  173.  
  174. columnHeaders = namesArr
  175. rowHeaders = Application.WorksheetFunction.Transpose(columnHeaders)
  176.  
  177. matrixArea.FormulaArray = "=MMULT(TRANSPOSE( " & excessReturns.Address & ")," & excessReturns.Address & ")/ROWS(" & excessReturns.Address & ")"
  178.  
  179. ColourMatrix matrixArea
  180.  
  181. End Sub
  182.  
  183. Public Sub ColourMatrix(ByVal matrixArea As Range)
  184.  
  185. Dim currRow As Long, currColumn As Long
  186.  
  187. For currRow = 1 To matrixArea.Rows.Count
  188.  
  189. For currColumn = 1 To matrixArea.Columns.Count
  190.  
  191. If currRow = currColumn Then
  192.  
  193. With matrixArea.Cells(currRow, currColumn).Interior
  194. .Pattern = xlSolid
  195. .PatternColorIndex = xlAutomatic
  196. .ThemeColor = xlThemeColorAccent1
  197. .TintAndShade = 0.799981688894314
  198. End With
  199.  
  200. End If
  201.  
  202. Next currColumn
  203.  
  204. Next currRow
  205.  
  206. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement