calculatePortfolios = (syms = []) => {
const coorelations = coorelationMatrix(syms)
const weights = combinationSum(syms.length, 100).map(x => x.map(x => x/100))
const returns = weights.map(comb => simpleStatistics.sum(comb.map((weight,i) => weight * forwardExpectedReturn[syms[i]])))
const stds = syms.map(ticker => {
const pctChanges = getSymbolPercentageChanges(ticker).slice(-sharpeLookback)
const std = simpleStatistics.standardDeviation(pctChanges)
return std
})
const weightedStds = weights.map(comb => simpleStatistics.sum(comb.map((weight, i) => (weight * stds[i])**2)))
const weightedCors = weights.map(weights => {
let cors = []
for(let i=0;i<syms.length;i++){
for(let j=i+1;j<syms.length;j++){
const first = syms[i]
const second = syms[j]
const key = `${first}_${second}`
const cor = coorelations[key]
const result = 2*weights[i]*weights[j]*stds[i]*stds[j]*cor
cors.push(result)
}
}
return simpleStatistics.sum(cors)
})
const portfolioStds = weightedStds.map((std, i) => Math.sqrt(std + weightedCors[i]))
const details = weights
.map(w => w.map((w, i) => `${syms[i]}: ${w}`))
.map(w => w.reduce((pv,cv) => `${pv} ${cv}`))
.map((w,i) => `${w} sharpe: ${(returns[i] - riskFreeRate) / portfolioStds[i]}`)
const riskReturns = portfolioStds.map((p,i) => ({ portfolioStd: p, returns: returns[i], details: details[i]}))
return { weights,returns, portfolioStds, stds, weightedStds, coorelations, weightedCors, riskReturns, details }
}