/// <summary> /// моделировать поведение портфеля методом монте-карло /// возвращает массив: кол-во строк равно количеству percentiles /// в каждой строке intervalsCount значений по каждому перцентилю /// </summary> public static double[][] CalculateRisks(List <PortfolioActive> actives, double [][] corrM, List <double> sigmas, int intervalMinutes, int intervalsCount, int iterationsCount, List <double> percentiles, ReportProgressDel reportProgress) { // преобразование Холецкого var chM = CholeskyTransform(corrM, corrM.Length, corrM.Length); // массив: одна строка соотв. одному испытанию // ячейка i строки - накопленнный за i-интервалов профит, % var profitByDay = new float[intervalsCount][]; for (var i = 0; i < intervalsCount; i++) { profitByDay[i] = new float[iterationsCount]; } var lastPercent = 0; for (var i = 0; i < iterationsCount; i++) { if (stoppingCalculation) { stoppingCalculation = false; return(null); } var startPrices = actives.Select(a => a.Price).ToList(); for (var j = 0; j < intervalsCount; j++) { ShiftPrices(startPrices, chM, sigmas); // посчитать отклонение портфеля var profit = PortfolioActive.CalculateProfitPercent(actives, startPrices); profitByDay[j][i] = profit; } var percent = 100 * i / iterationsCount; if (percent - lastPercent >= 5) { reportProgress(string.Format(Localizer.GetString("MessagePortfolioSimulationCompletedPercentFmt"), percent)); lastPercent = percent; } } // посчитать перцентили var percents = new double[percentiles.Count][]; for (var i = 0; i < percentiles.Count; i++) { percents[i] = new double[intervalsCount]; } lastPercent = 0; for (var j = 0; j < intervalsCount; j++) { if (stoppingCalculation) { stoppingCalculation = false; return(null); } // упорядочить массив профитов на день (ну, вообще-то - на данный интервал времени) var intervalProfit = new EverSortedList <float>(); for (var i = 0; i < iterationsCount; i++) { intervalProfit.Add(profitByDay[j][i]); } // записать перцентили на интервал for (var i = 0; i < percentiles.Count; i++) { var index = (int)(iterationsCount * percentiles[i] / 100); percents[i][j] = intervalProfit[index]; if (j > 0) { if (Math.Abs(percents[i][j]) < Math.Abs(percents[i][j - 1])) { percents[i][j] = percents[i][j - 1]; } } } var percent = 100 * j / intervalsCount; if (percent - lastPercent >= 5) { reportProgress(string.Format(Localizer.GetString("MessageResultProcessingCompletedPercentFmt"), percent)); lastPercent = percent; } } return(percents); }
/// <summary> /// моделировать поведение портфеля методом монте-карло /// возвращает массив: кол-во строк равно количеству percentiles /// в каждой строке intervalsCount значений по каждому перцентилю /// </summary> public static double[][] CalculateRisks(List<PortfolioActive> actives, double [][] corrM, List<double> sigmas, int intervalMinutes, int intervalsCount, int iterationsCount, List<double> percentiles, ReportProgressDel reportProgress) { // преобразование Холецкого var chM = CholeskyTransform(corrM, corrM.Length, corrM.Length); // массив: одна строка соотв. одному испытанию // ячейка i строки - накопленнный за i-интервалов профит, % var profitByDay = new float[intervalsCount][]; for (var i = 0; i < intervalsCount; i++) { profitByDay[i] = new float[iterationsCount]; } var lastPercent = 0; for (var i = 0; i < iterationsCount; i++) { if (stoppingCalculation) { stoppingCalculation = false; return null; } var startPrices = actives.Select(a => a.Price).ToList(); for (var j = 0; j < intervalsCount; j++) { ShiftPrices(startPrices, chM, sigmas); // посчитать отклонение портфеля var profit = PortfolioActive.CalculateProfitPercent(actives, startPrices); profitByDay[j][i] = profit; } var percent = 100*i/iterationsCount; if (percent - lastPercent >= 5) { reportProgress(string.Format(Localizer.GetString("MessagePortfolioSimulationCompletedPercentFmt"), percent)); lastPercent = percent; } } // посчитать перцентили var percents = new double[percentiles.Count][]; for (var i = 0; i < percentiles.Count; i++) percents[i] = new double[intervalsCount]; lastPercent = 0; for (var j = 0; j < intervalsCount; j++) { if (stoppingCalculation) { stoppingCalculation = false; return null; } // упорядочить массив профитов на день (ну, вообще-то - на данный интервал времени) var intervalProfit = new EverSortedList<float>(); for (var i = 0; i < iterationsCount; i++) { intervalProfit.Add(profitByDay[j][i]); } // записать перцентили на интервал for (var i = 0; i < percentiles.Count; i++) { var index = (int)(iterationsCount * percentiles[i] / 100); percents[i][j] = intervalProfit[index]; if (j > 0) if (Math.Abs(percents[i][j]) < Math.Abs(percents[i][j - 1])) percents[i][j] = percents[i][j - 1]; } var percent = 100 * j / intervalsCount; if (percent - lastPercent >= 5) { reportProgress(string.Format(Localizer.GetString("MessageResultProcessingCompletedPercentFmt"), percent)); lastPercent = percent; } } return percents; }
public static EverSortedList<string> UnzipFile(string zipFilePath, string folder) { var fileNames = new EverSortedList<string>(); var s = new ZipInputStream(File.OpenRead(zipFilePath)); ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { var fileName = string.Format("{0}\\{1}", folder, theEntry.Name); Path.GetFileName(theEntry.Name); if (fileName == String.Empty) continue; var streamWriter = File.Create(fileName); var data = new byte[2048]; while (true) { var size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } streamWriter.Close(); fileNames.Add(fileName); } s.Close(); return fileNames; }