eenriquelopez
04/08/2025, 2:13 PM// Simulation parameters
val years = 30
val simulations = 10000
val initialInvestment = 1.0
// Market probabilities (adjusting bear probability to 30% and bull to 70%)
val bullProb = 0.75 // 75% for Bull markets
// Portfolio returns
val portfolioA = mapOf("bull" to 1.20, "bear" to 0.80)
val portfolioB = mapOf("bull" to 1.25, "bear" to 0.65)
// Function to simulate one portfolio run and return the accumulated return for each year
fun simulatePortfolioAccumulatedReturns(returns: Map<String, Double>, rng: Random): List<Double> {
var value = initialInvestment
val accumulatedReturns = mutableListOf<Double>()
repeat(years) {
val isBull = rng.nextDouble() < bullProb
val market = if (isBull) "bull" else "bear"
value *= returns[market]!!
// Calculate accumulated return for the current year
val accumulatedReturn = (value - initialInvestment) / initialInvestment * 100
accumulatedReturns.add(accumulatedReturn)
}
return accumulatedReturns
}
// Running simulations and storing accumulated returns for each year (for each portfolio)
val rng = Random(System.currentTimeMillis())
val accumulatedResults = (1..simulations).map {
val accumulatedReturnsA = simulatePortfolioAccumulatedReturns(portfolioA, rng)
val accumulatedReturnsB = simulatePortfolioAccumulatedReturns(portfolioB, rng)
mapOf("Simulation" to it, "PortfolioA" to accumulatedReturnsA, "PortfolioB" to accumulatedReturnsB)
}
// Count the number of simulations where Portfolio A outperforms Portfolio B and vice versa
var portfolioAOutperformsB = 0
var portfolioBOutperformsA = 0
accumulatedResults.forEach { result ->
val accumulatedA = result["PortfolioA"] as List<Double>
val accumulatedB = result["PortfolioB"] as List<Double>
if (accumulatedA.last() > accumulatedB.last()) {
portfolioAOutperformsB++
} else {
portfolioBOutperformsA++
}
}
// Print the results
println("Number of simulations where Portfolio A outperforms Portfolio B: $portfolioAOutperformsB")
println("Number of simulations where Portfolio B outperforms Portfolio A: $portfolioBOutperformsA")
println("Portfolio A outperformed Portfolio B in ${portfolioAOutperformsB.toDouble() / simulations * 100}% of simulations.")
println("Portfolio B outperformed Portfolio A in ${portfolioBOutperformsA.toDouble() / simulations * 100}% of simulations.")
altavir
04/08/2025, 4:17 PMaltavir
04/08/2025, 4:37 PMaltavir
04/08/2025, 4:40 PMaltavir
04/08/2025, 4:44 PMeenriquelopez
04/08/2025, 4:49 PMaltavir
04/08/2025, 4:52 PMeenriquelopez
04/08/2025, 4:53 PMaltavir
04/08/2025, 4:55 PMeenriquelopez
04/08/2025, 4:56 PMaltavir
04/08/2025, 5:14 PMaltavir
04/08/2025, 5:17 PMaltavir
04/08/2025, 5:23 PMeenriquelopez
04/08/2025, 5:26 PMNumber of simulations where Portfolio A outperforms Portfolio B: 6283
Number of simulations where Portfolio B outperforms Portfolio A: 3717
Portfolio A outperformed Portfolio B in 62.83% of simulations.
Portfolio B outperformed Portfolio A in 37.169999999999995% of simulations.
altavir
04/08/2025, 5:26 PMaltavir
04/08/2025, 5:27 PMaltavir
04/08/2025, 5:27 PMNumber of simulations where Portfolio A outperforms Portfolio B: 9025
Number of simulations where Portfolio B outperforms Portfolio A: 975
Portfolio A outperformed Portfolio B in 90.25% of simulations.
Portfolio B outperformed Portfolio A in 9.75% of simulations.
altavir
04/08/2025, 5:28 PMeenriquelopez
04/08/2025, 5:31 PMaltavir
04/08/2025, 5:34 PMeenriquelopez
04/08/2025, 5:36 PMaltavir
04/08/2025, 5:39 PMeenriquelopez
04/08/2025, 5:42 PM