Multi-Asset Value at Risk?

I’ve been demonstrating how Wolfram Finance Platform could be used for Value at Risk (VaR) for a while now, but have only been showing single asset calculations like the following and then show EmpiricalDistribution, CombinedDistribution, etc..

InverseSurvivalFunction[EstimatedDistribution[FinancialData["AAPL", "Return", DatePlus[-365], "Value"],NormalDistribution[a, b]],0.95]

But that’s quite boring, so I’ve looked around for a guide to portfolio VaR measurements and found this http://www.math.nus.edu.sg/~urops/Projects/valueatrisk.pdf amongst other resources and built the following function:

 multiAssetVaR[stocks_List, weights_List, buyDate_List, 
  estDist_: NormalDistribution[](*If no other distribution specified, 
  normal assumed*), conf_: 0.95(*risk level, default 0.95*)] := 
 Module[{initialPrices, currentPrices, ratesOfReturn, rateWeights, 
   portRateOfReturn, stockReturns, varPortRateOfReturn, multiAssetVaR},  
  initialPrices = 
   Transpose[{Flatten[
      ParallelMap[
       FinancialData[#[[1]], "Price", {#[[2]]}, "Value"] &, {stocks, 
         buyDate} // Transpose]], weights}];  
  currentPrices = 
   Transpose[{ParallelMap[FinancialData[#, "Price"] &, stocks], 
     weights}];  
  ratesOfReturn = 
   Map[(Times @@ #[[2]] - Times @@ #[[1]])/Times @@ #[[1]] &, 
    Transpose[{initialPrices, currentPrices}]];  
  rateWeights = 
   Map[Times @@ #/Total[Times @@@ currentPrices] &, currentPrices];  
  portRateOfReturn = Total[Times @@@ {rateWeights, ratesOfReturn}];  
  stockReturns = 
   ParallelMap[
    FinancialData[#[[1]], "Return", {#[[2]], Date[]}, "Value"] &, 
    Transpose[{stocks, buyDate}]];  
  varPortRateOfReturn = 
   rateWeights.Covariance[
     Transpose[stockReturns]].Transpose[{rateWeights}];
  multiAssetVaR = (InverseSurvivalFunction[estDist, conf]*(-1))*
    Sqrt[varPortRateOfReturn]
  ]

Usage:

multiAssetVaR[{"LLOY.L", "BARC.L", "RBS.L"}, {2000, 1423, 1000}, {{2012, 11, 1}, {2012, 11, 1}, {2012, 11, 1}}]

I’ve only limited experience with actually applying financial models, could anyone advise whether what I’ve done is appropiate?

Comments on the code would also be appreciated, I used ParallelMap for FinancialData calls to reduce the lag in collecting data (my birthday was chosen for the purchase dates at DayOfWeek told me it was a Thursday) but have assumed parallelisation is not beneficial for the rest of the maps. Note that if I had a Bloomberg subscription myself then I’d use BloombergLink, but at the moment I just have FinancialData.

5 Likes