fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <iomanip>
  6. #include <tuple>
  7. #include <string>
  8.  
  9. using namespace std;
  10.  
  11. using Portfolio = vector<int>; // weights in percent, size = 6
  12.  
  13. double percentile15(vector<double>& data) {
  14. sort(data.begin(), data.end());
  15. size_t index = static_cast<size_t>(floor(0.15 * data.size()));
  16. if (index >= data.size()) index = data.size() - 1;
  17. return data[index];
  18. }
  19.  
  20. double median(vector<double>& data) {
  21. sort(data.begin(), data.end());
  22. size_t n = data.size();
  23. if (n % 2 == 0)
  24. return (data[n / 2 - 1] + data[n / 2]) / 2.0;
  25. else
  26. return data[n / 2];
  27. }
  28.  
  29. double lumpSumCAGR(const vector<double>& returns) {
  30. double compound = 1.0;
  31. for (double r : returns) {
  32. compound *= (1.0 + r);
  33. }
  34. return pow(compound, 1.0 / returns.size()) - 1.0;
  35. }
  36.  
  37. double portfolioReturn(const vector<vector<double>>& assets, const Portfolio& weights, int year) {
  38. double result = 0.0;
  39. for (int i = 0; i < weights.size(); ++i) {
  40. result += (weights[i] / 100.0) * assets[i][year];
  41. }
  42. return result;
  43. }
  44.  
  45. void generatePortfolios(vector<Portfolio>& portfolios, Portfolio current, int pos, int totalWeight, int maxAssets) {
  46. if (pos == current.size()) {
  47. if (totalWeight == 100) {
  48. int nonZero = count_if(current.begin(), current.end(), [](int w) { return w > 0; });
  49. if (nonZero <= maxAssets) {
  50. portfolios.push_back(current);
  51. }
  52. }
  53. return;
  54. }
  55. for (int w = 0; w <= 100 - totalWeight; w += 5) {
  56. current[pos] = w;
  57. generatePortfolios(portfolios, current, pos + 1, totalWeight + w, maxAssets);
  58. }
  59. }
  60.  
  61. int main() {
  62. const int numAssets = 6;
  63. const int maxAssets = 3;
  64. const int step = 5;
  65.  
  66. // Asset names
  67. vector<string> assetNames = {
  68. "scv60Lcg15", "scv95", "vti", "20bal", "33gld", "lcbtiltled"
  69. };
  70.  
  71. // Return data
  72. vector<vector<double>> assets = {
  73. {-0.04,0.14,0.15,-0.14,-0.19,0.26,0.28,0.04,0.08,0.28,0.08,-0.06,0.24,0.22,-0.01,0.26,0.14,-0.02,0.14,0.16,-0.16,0.29,0.15,0.18,-0.03,0.20,0.13,0.20,0.02,0.08,-0.04,0.04,-0.07,0.33,0.12,0.06,0.15,0.01,-0.26,0.31,0.22,-0.03,0.15,0.19,0.08,-0.06,0.16,0.13,-0.11,0.21,0.13,0.12,-0.18,0.15,0.12},
  74. {-0.03,0.13,0.06,-0.29,-0.31,0.43,0.46,0.08,0.07,0.21,0.12,0.06,0.31,0.38,0.02,0.31,0.12,-0.08,0.23,0.14,-0.22,0.37,0.24,0.19,-0.02,0.24,0.17,0.31,-0.06,0.02,0.04,0.11,-0.13,0.41,0.17,0.04,0.15,-0.09,-0.32,0.33,0.23,-0.06,0.18,0.32,0.09,-0.06,0.23,0.09,-0.15,0.20,0.03,0.19,-0.16,0.11,0.08},
  75. {-0.02,0.11,0.12,-0.25,-0.36,0.30,0.21,-0.11,-0.01,0.05,0.16,-0.11,0.19,0.19,0.01,0.28,0.15,-0.02,0.12,0.24,-0.10,0.29,0.06,0.08,-0.01,0.34,0.19,0.30,0.24,0.19,-0.13,-0.09,-0.25,0.30,0.08,0.02,0.12,0.01,-0.37,0.26,0.16,-0.02,0.14,0.31,0.12,0.00,0.11,0.19,-0.07,0.28,0.19,0.18,-0.24,0.22,0.20},
  76. {-0.03,0.15,0.18,-0.07,-0.14,0.12,0.18,0.04,0.07,0.28,0.06,-0.13,0.17,0.13,0.01,0.22,0.18,0.02,0.07,0.14,-0.13,0.23,0.06,0.17,-0.02,0.16,0.12,0.12,0.04,0.07,-0.03,0.01,-0.02,0.29,0.13,0.08,0.17,0.03,-0.23,0.27,0.21,0.02,0.13,0.07,0.12,-0.03,0.09,0.13,-0.08,0.22,0.14,0.11,-0.23,0.16,0.13}, {-0.01,0.11,0.19,0.03,-0.05,0.13,0.23,0.07,0.10,0.44,0.08,-0.13,0.20,0.14,-0.04,0.19,0.16,0.02,0.06,0.08,-0.15,0.17,0.08,0.16,-0.03,0.17,0.11,0.12,0.00,0.02,-0.01,0.02,-0.02,0.30,0.11,0.07,0.19,0.03,-0.21,0.25,0.23,0.00,0.13,0.08,0.09,-0.06,0.13,0.10,-0.08,0.20,0.10,0.11,-0.14,0.11,0.14},
  77. {-0.03,0.13,0.12,-0.22,-0.30,0.25,0.24,-0.02,0.00,0.07,0.08,-0.09,0.14,0.20,0.07,0.26,0.15,-0.02,0.16,0.24,-0.13,0.33,0.10,0.21,-0.03,0.22,0.16,0.21,0.05,0.15,-0.05,-0.02,-0.12,0.32,0.14,0.08,0.17,0.02,-0.32,0.29,0.17,-0.01,0.14,0.17,0.13,-0.03,0.11,0.16,-0.09,0.23,0.11,0.14,-0.24,0.14,0.11}
  78. };
  79.  
  80. int numYears = assets[0].size();
  81.  
  82. for (int duration = 1; duration <= 31; duration += 1) {
  83. cout << "\n========== Duration: " << duration << " years ==========" << endl;
  84.  
  85. vector<Portfolio> portfolios;
  86. generatePortfolios(portfolios, Portfolio(numAssets, 0), 0, 0, maxAssets);
  87.  
  88. vector<tuple<Portfolio, double, double, double, double>> results;
  89.  
  90. for (const Portfolio& p : portfolios) {
  91. vector<double> cagrList;
  92. for (int start = 0; start <= numYears - duration; ++start) {
  93. vector<double> subReturns;
  94. for (int i = 0; i < duration; ++i) {
  95. subReturns.push_back(portfolioReturn(assets, p, start + i));
  96. }
  97. double cagr = lumpSumCAGR(subReturns);
  98. cagrList.push_back(cagr);
  99. }
  100.  
  101. double p15 = percentile15(cagrList);
  102. double pmin = *min_element(cagrList.begin(), cagrList.end());
  103. double pmax = *max_element(cagrList.begin(), cagrList.end());
  104. double pmed = median(cagrList);
  105.  
  106. results.emplace_back(p, p15, pmin, pmax, pmed);
  107. }
  108.  
  109. sort(results.begin(), results.end(), [](const auto& a, const auto& b) {
  110. return get<1>(a) > get<1>(b);
  111. });
  112.  
  113. cout << fixed << setprecision(2);
  114.  
  115. // Summary table
  116. cout << "\nTop 2 Portfolios Summary (Bottom 15th Percentile CAGR):" << endl;
  117. cout << left << setw(10) << "#" << setw(40) << "Portfolio" << setw(10) << "P15%" << setw(10) << "Min" << setw(10) << "Max" << setw(10) << "Median" << endl;
  118. cout << string(80, '-') << endl;
  119.  
  120. for (int i = 0; i < 2 && i < results.size(); ++i) {
  121. auto [weights, p15, pmin, pmax, pmed] = results[i];
  122. string portStr;
  123. for (int j = 0; j < numAssets; ++j) {
  124. if (weights[j] > 0) {
  125. portStr += assetNames[j] + ":" + to_string(weights[j]) + "% ";
  126. }
  127. }
  128. cout << left << setw(10) << (i + 1) << setw(40) << portStr << setw(10) << p15 * 100 << setw(10) << pmin * 100 << setw(10) << pmax * 100 << setw(10) << pmed * 100 << endl;
  129. }
  130.  
  131. // // Detailed breakdown
  132. // for (int i = 0; i < 2 && i < results.size(); ++i) {
  133. // auto [weights, p15, pmin, pmax, pmed] = results[i];
  134. // cout << "\nPortfolio " << (i + 1) << ":\n";
  135. // cout << left << setw(15) << "Asset" << setw(10) << "Weight\n";
  136. // cout << "-------------------------\n";
  137. // for (int j = 0; j < numAssets; ++j) {
  138. // if (weights[j] > 0) {
  139. // cout << left << setw(15) << assetNames[j] << setw(10) << weights[j] << "\n";
  140. // }
  141. // }
  142. // cout << "-------------------------\n";
  143. // cout << "Bottom 15th % CAGR : " << p15 * 100 << "%\n";
  144. // cout << "Min CAGR : " << pmin * 100 << "%\n";
  145. // cout << "Max CAGR : " << pmax * 100 << "%\n";
  146. // cout << "Median CAGR : " << pmed * 100 << "%\n";
  147. // }
  148. }
  149.  
  150. return 0;
  151. }
  152.  
Success #stdin #stdout 2.53s 5276KB
stdin
Standard input is empty
stdout
========== Duration: 1 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         20bal:40% 33gld:60%                     -2.00     -21.80    37.60     10.40     
2         20bal:45% 33gld:55%                     -2.00     -21.90    36.80     10.70     

========== Duration: 2 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:30% vti:10% 33gld:60%             1.09      -14.26    26.66     8.76      
2         scv60Lcg15:30% scv95:25% 33gld:45%      1.08      -13.80    27.29     8.27      

========== Duration: 3 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:20% vti:35% 33gld:45%             2.71      -7.91     20.42     8.07      
2         scv95:15% vti:35% 33gld:50%             2.67      -6.67     19.89     8.05      

========== Duration: 4 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:20% 33gld:80%                4.50      0.22      19.45     7.56      
2         scv60Lcg15:20% 20bal:5% 33gld:75%       4.49      0.21      19.14     7.58      

========== Duration: 5 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:5% 20bal:45% 33gld:50%       4.45      0.73      16.36     7.20      
2         scv60Lcg15:5% 20bal:50% 33gld:45%       4.44      0.78      16.10     7.14      

========== Duration: 6 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:30% 20bal:20% 33gld:50%      5.62      2.70      15.88     7.56      
2         scv60Lcg15:30% 20bal:25% 33gld:45%      5.61      2.75      15.64     7.58      

========== Duration: 7 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:30% 20bal:60% 33gld:10%      6.20      4.34      12.84     7.70      
2         scv60Lcg15:30% 20bal:65% 33gld:5%       6.20      4.39      12.88     7.75      

========== Duration: 8 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:65% 20bal:35%                6.37      3.86      12.94     7.96      
2         scv60Lcg15:60% 20bal:40%                6.35      3.82      12.84     7.98      

========== Duration: 9 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:35% 20bal:5% 33gld:60%            7.04      3.75      16.47     8.19      
2         scv60Lcg15:10% scv95:30% 33gld:60%      7.01      3.70      16.35     8.21      

========== Duration: 10 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:95% scv95:5%                 6.45      3.10      13.79     8.70      
2         scv60Lcg15:100%                         6.44      3.13      13.43     8.70      

========== Duration: 11 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:20% scv95:65% 33gld:15%      6.75      2.20      18.65     9.56      
2         scv60Lcg15:25% scv95:60% 33gld:15%      6.74      2.28      18.31     9.50      

========== Duration: 12 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:40% 20bal:30% 33gld:30%           6.87      4.35      15.22     8.92      
2         scv60Lcg15:70% 20bal:30%                6.85      4.48      13.32     8.60      

========== Duration: 13 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:75% 20bal:25%                     6.62      4.88      16.12     9.78      
2         scv60Lcg15:5% scv95:70% 20bal:25%       6.61      4.90      15.87     9.71      

========== Duration: 14 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:85% scv95:10% vti:5%         7.07      5.34      13.54     8.86      
2         scv60Lcg15:90% scv95:5% vti:5%          7.06      5.40      13.27     8.78      

========== Duration: 15 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:70% 20bal:30%                7.30      5.41      12.36     8.57      
2         scv60Lcg15:75% 20bal:25%                7.28      5.40      12.53     8.64      

========== Duration: 16 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:40% 20bal:60%                     7.06      5.08      12.31     8.75      
2         scv60Lcg15:5% scv95:40% 20bal:55%       7.06      5.10      12.43     8.81      

========== Duration: 17 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:5% scv95:25% 20bal:70%       7.23      5.65      11.22     8.55      
2         scv60Lcg15:15% scv95:20% 20bal:65%      7.22      5.70      11.15     8.54      

========== Duration: 18 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:35% 20bal:65%                     7.20      5.76      11.83     8.39      
2         scv60Lcg15:5% scv95:30% 20bal:65%       7.19      5.79      11.60     8.33      

========== Duration: 19 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:60% 20bal:40%                     6.97      6.02      13.98     9.13      
2         scv95:55% 20bal:45%                     6.97      6.06      13.62     9.02      

========== Duration: 20 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:70% 20bal:30%                     7.36      6.11      13.80     9.52      
2         scv95:75% 20bal:25%                     7.36      6.06      14.13     9.62      

========== Duration: 21 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:20% scv95:75% lcbtiltled:5%  7.70      5.93      15.14     9.26      
2         scv60Lcg15:20% scv95:70% lcbtiltled:10% 7.70      5.94      14.89     9.29      

========== Duration: 22 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:5% scv95:20% 20bal:75%       7.39      6.39      10.88     8.20      
2         scv95:25% 20bal:75%                     7.39      6.41      11.10     8.25      

========== Duration: 23 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:90% lcbtiltled:10%                7.28      6.36      16.29     9.75      
2         scv95:85% 20bal:5% lcbtiltled:10%       7.27      6.38      15.95     9.64      

========== Duration: 24 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv60Lcg15:95% scv95:5%                 7.53      6.27      12.30     8.75      
2         scv60Lcg15:90% scv95:5% vti:5%          7.53      6.20      12.30     8.74      

========== Duration: 25 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:40% 20bal:35% lcbtiltled:25%      7.75      5.92      12.22     8.76      
2         scv95:45% vti:20% lcbtiltled:35%        7.74      5.74      13.37     8.87      

========== Duration: 26 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:85% vti:15%                       8.01      6.03      14.25     9.52      
2         scv95:80% vti:15% lcbtiltled:5%         8.00      6.04      14.06     9.51      

========== Duration: 27 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:100%                              8.36      6.04      14.57     9.72      
2         scv95:95% lcbtiltled:5%                 8.36      6.06      14.37     9.72      

========== Duration: 28 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:65% vti:30% lcbtiltled:5%         8.37      7.04      11.98     8.95      
2         scv95:70% vti:30%                       8.36      7.05      12.18     8.98      

========== Duration: 29 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:80% vti:5% lcbtiltled:15%         8.56      7.20      13.49     9.62      
2         scv95:75% vti:5% lcbtiltled:20%         8.56      7.18      13.29     9.59      

========== Duration: 30 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:75% lcbtiltled:25%                8.34      7.29      13.40     9.71      
2         scv95:70% lcbtiltled:30%                8.34      7.28      13.20     9.66      

========== Duration: 31 years ==========

Top 2 Portfolios Summary (Bottom 15th Percentile CAGR):
#         Portfolio                               P15%      Min       Max       Median    
--------------------------------------------------------------------------------
1         scv95:70% vti:20% lcbtiltled:10%        8.37      7.56      12.78     9.46      
2         scv95:70% vti:15% lcbtiltled:15%        8.37      7.51      12.82     9.51