Hello everyone,

I am still learning to use QuantConnect and I need your help with RollingWindows. Somehow, I cannot access all datapoints in the RollingWindows created in lines 66-73 when I call them at line 106. Do you know why?

Do you know any alternative to the list with RollingWindows? I have been checking universes, but I would like to have something where I can directly enter the assets I would like to have in this case.

// https://numerics.mathdotnet.com/ // https://numerics.mathdotnet.com/DescriptiveStatistics.html // http://www.bluebit.gr/NET/Library/topic594.html using MathNet.Numerics; using MathNet.Numerics.LinearAlgebra; namespace QuantConnect.Algorithm.CSharp { public class BaH_Markowitz : QCAlgorithm { // List of assets to construct the portfolio; public string[] assets = {"URTH","EEM"}; // Number of assets. public int numAssets; // Set the look back period public int LookBackPeriods = 2; public override void Initialize() { //--------------------------- //--- Backtest Paramters --- //-------------------------- // Set start date for the backtest. SetStartDate(2012,1,25); // Set end date for the backtest. SetEndDate(2012,1,30); // Set the initial cash for the backtest. SetCash(100000); numAssets = assets.Length; // Add the assets to the portfolio universe. foreach(string asset in assets){ AddEquity(asset, Resolution.Daily); } /* // Schedule rebalancing for URTH. Schedule.On(DateRules.MonthStart("URTH"), TimeRules.AfterMarketOpen("URTH"), ()=> { if (!new []{5,6,7,8}.Contains(Time.Month)) { SetHoldings("URTH", 0.7); } }); //Schedule rebalancing for EEM. Schedule.On(DateRules.MonthStart("EEM"), TimeRules.AfterMarketOpen("EEM"), () => { if (!new []{5,6,7,8}.Contains(Time.Month)) { SetHoldings("EEM", 0.3); } }); */ Settings.StalePriceTimeSpan = TimeSpan.FromMinutes(60); SetWarmUp(3); } public override void OnData(Slice data) { Vector<double> weights = Vector<double>.Build.Dense(numAssets); if(!Portfolio.Invested){ List<RollingWindow<decimal>> windows = new List<RollingWindow<decimal>>(); foreach(string asset in assets){ RollingWindow<decimal> _window = new RollingWindow<decimal>(LookBackPeriods); Debug(asset+" added to the universe"); _window.Add(data[asset].Close); windows.Add(_window); } weights = OptPFMarkowitz(assets, windows, LookBackPeriods); Debug(weights.ToString()); for(int i=0;i<numAssets;i++){ SetHoldings(assets[i],weights[i]); Debug("New position opened for "+assets[i]); } } /* if (new []{5,6,7,8}.Contains(Time.Month)) { Liquidate(); return; } */ } public Vector<double> OptPFMarkowitz(string[] Securities, List<RollingWindow<decimal>> data, int Periods) { // Count the number of securities to have in the portfolio. int numSec = Securities.Length; // Create a matrix to save the close price data from the securities. Matrix<double> closeData = Matrix<double>.Build.Dense(numSec,Periods); // Fill the data matrix with close prices of the last Periods-points. int k = 0; foreach (string Security in Securities){ for (int i=0; i<Periods; i++) { closeData[k,i] = (double)data[k][i]; } k++; } // Create a vector to save the average returns of the securities in the last Periods periods. Vector<double> avgReturn = Vector<double>.Build.Dense(numSec); // Create a matrix to save the covariance matrix of the securities in the last Periods periods. Matrix<double> covMatrix = Matrix<double>.Build.Dense(numSec,numSec); // Create a vector to save the weights to be assigned to each security in the portfolio. Vector<double> weights = Vector<double>.Build.Dense(numSec); // Calculate the average return of each security. avgReturn = (1/numSec)*closeData.RowSums(); // Center the data. for(int i=0; i<numSec;i++){ for(int j=0; j<numSec;j++){ closeData[i,k] -= avgReturn[i]; } } // Compute the covariance matrix. covMatrix = (1/numSec)*(closeData*closeData.Transpose()); weights = (covMatrix.Inverse()*avgReturn).Normalize(2); return weights; } } }

Thank you very much.

Kind regards,

Francisco

Ps I don't know how to insert the algo here, since there is no backtest I can choose.