public OptimalPortoliosViewModel CreatePortfolio(User user, CreatePortfolioCommand cmd) { if (cmd.CalcType == enumEfCalculationType.Custom && cmd.Exchanges.Count < 1) { for (int i = 0; i < user.Licence.Stocks.Count; i++) { cmd.Exchanges.Add(Convert.ToInt32(user.Licence.Stocks[i].id)); } } OptimalPortoliosViewModel vm = new OptimalPortoliosViewModel(); var portID = 0; var count = cPortHandler.GetPortfolioCount(user.UserID); if (count < user.Licence.Service.Iportfolios) { portID = cPortHandler.CreateDefaultPortfolio(user, cmd); } else { vm.Messages.Add(new Message { LogLevel = LogLevel.Error, Text = "You've exceeded the number of portfolios you can create. Please delete any unwanted portfolios" }); } if (portID > 0) { vm = opService.GetPortfolioOptimazation(user, new Models.Queries.OptimazationQuery { CalcType = cmd.CalcType, PortID = portID, Securities = cmd.Securities, Exchanges = cmd.Exchanges, Risk = cmd.Risk //LR on 18/07/18 }); if (vm.Messages.Count == 0) { cPortHandler.SelectedPortfolio.Details.LastOptimization = DateTime.Today; cPortHandler.SelectedPortfolio.Details.SecsNum = vm.Portfolios[vm.PortNumA].Securities.Count; cPortHandler.SelectedPortfolio.Details.CurrentStDev = vm.Portfolios[vm.PortNumA].Risk; UpdatePortfolioCommand updCmd = new UpdatePortfolioCommand { CalcType = cPortHandler.SelectedPortfolio.Details.CalcType, Equity = cmd.Equity, Risk = vm.Portfolios[vm.PortNumA].Risk, PortID = portID, Securities = vm.Portfolios[vm.PortNumA].Securities }; cPortHandler.UpdatePortfolio(updCmd); } else { cPortHandler.DeletePortfolio(portID); } } return(vm); }
public OptimalPortoliosViewModel GetPortfolioOptimazation(User user, OptimazationQuery query) { OptimalPortoliosViewModel vm = new OptimalPortoliosViewModel(); cPort.openExistingPortfolio(query.PortID, false); lock (lockObject) { var stocks = query.Exchanges != null && query.Exchanges.Count > 0 && query.Exchanges.Count <= user.Licence.Stocks.Count ? query.Exchanges : user.Licence.Stocks.Select(t => t.id).ToList(); //if (!cPort.instantiatePortfolioVariables(true, cPort.Details.CalcCurrency, stocks , query.Securities)) if (!cPort.instantiateVariablesForPortfolio(true, cPort.Details.CalcCurrency, stocks, query.Securities)) { vm.Messages.Add(new Models.App.Message { LogLevel = Models.App.LogLevel.Error, Text = "Error Get Portfolio Data. Please Contanct System Administrator" }); } else { cPort.ColHandler.setDisabledSecsToActive(); if (query.Securities.Count > 0) { cPort.ColHandler.ActiveSecs = getFilteredSecByCustomList(query); //custom portfolio build } else // filter Active securities from Securities by exchangesIds and risk level: sec.stdYield { cPort.ColHandler.ActiveSecs = getFilteredSecByExchangesAndRisk(query); } cPort.Details.CalcType = query.CalcType; // cPort.Classes.Optimizer.SecuritiesCol = cPort.ColHandler.ActiveSecs; ISecurities cSecsCol = cPort.ColHandler.ActiveSecs; //vm = cPort.Classes.Optimizer.calculateNewEfficientFrontier(ref cSecsCol, cPort.ColHandler.Benchmarks, new cDateRange(DateTime.Today.AddYears(-cProperties.DatesInterval), DateTime.Today), true, false); vm = cPort.Classes.Optimizer.calculateNewEfficientFrontier(ref cSecsCol, cPort.ColHandler.Benchmarks, new cDateRange(DateTime.Today.AddYears(-3).AddDays(-1), DateTime.Today.AddDays(-1)), true, false); cPort.ColHandler.ActiveSecs = cSecsCol; } } return(vm); }//GetPortfolioOptimazation
}//initMainVars #endregion Constructors, Initialization & Destructor #region Methods #region Calculation methods public OptimalPortoliosViewModel calculateNewEfficientFrontier(ref ISecurities cSecsCol, ISecurities cBenchmarksCol, cDateRange drCalcRange, Boolean isClearDisabled, Boolean isBacktest) { // Calculates the Efficient Frontier including the rates vector and covariance matrix /// Parameters: cSecsCol - collection of securities for optimization /// drCalcRange - date range for calculation OptimalPortoliosViewModel vmOptimal = new OptimalPortoliosViewModel(); try { //m_colSecurities = cSecsCol; if (cSecsCol.Count > 0) { // Data exists for calculations if (isClearDisabled) { m_objColHandler.DisabledSecs.Clear(); } // Calculate covariance m_objPortfolio.Classes.CovarCorrel.calcRiskAndCovariance(drCalcRange, ref cBenchmarksCol, false, isBacktest); m_arrCovarData = m_objPortfolio.Classes.CovarCorrel.calcRiskAndCovariance(drCalcRange, ref cSecsCol, true, isBacktest); //m_colSecurities = cSecsCol; // Calculate optimal portfolios runEfficientFrontierModule(cSecsCol); setStartingRiskLevel(); setSecuritiesQuantities(cSecsCol); setSecuritiesDatatable(cSecsCol); // In case of Backtesting there is no need to call this function //m_objCovarCalcs.reportCovarianceMatrix(cSecsCol, m_dtSecsData, Portfolios[PortNumA], m_objPortfolio.Details.Equity, isBacktest); //m_objCovarCalcs.reportCovarianceMatrix(cSecsCol, m_dtSecsData, Portfolios[0], m_objPortfolio.Details.Equity, isBacktest); } } catch (Exception ex) { m_objErrorHandler.LogInfo(ex); } setCalcSuccess(); if (!m_isSuccessfulCalc) { vmOptimal.Messages.Add(new Models.App.Message { Text = "Failed to calculate due to: " + m_strEngineErrors, LogLevel = Models.App.LogLevel.Fatal }); } else { vmOptimal = AutoMapper.Mapper.Map <OptimalPortoliosViewModel>(m_objPortfolio.Classes.Optimizer); vmOptimal.PortID = m_objPortfolio.Details.ID; vmOptimal.PortDetails = m_objPortfolio.Details; for (int iPorts = 0; iPorts < vmOptimal.Portfolios.Count; iPorts++) { for (int iSecs = 0; iSecs < vmOptimal.Portfolios[iPorts].Securities.Count; iSecs++) { // Securities displayed on page vmOptimal.Portfolios[iPorts].Securities[iSecs].StdYield *= Math.Sqrt(52); vmOptimal.Portfolios[iPorts].Securities[iSecs].FinalRate *= 52; //vmOptimal.PortNumA vmOptimal.Portfolios[iPorts].Securities[iSecs].StandardDeviation *= 1; } } } return(vmOptimal); }//calculateNewEfficientFrontier