65.9K
CodeProject 正在变化。 阅读更多。
Home

使用蒙特卡洛模拟进行投资绩效分析

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (6投票s)

2010年7月15日

CPOL

3分钟阅读

viewsIcon

28501

downloadIcon

724

提供了一个类,用于随机抽样近似正态分布,并提供了一个窗体,该窗体实现了一个简单的投资示例。

引言

蒙特卡洛模拟是一种依赖随机抽样来计算有意义的预测的技术。当研究具有显着不确定性或风险的系统时,它特别有用。虽然通常存在统计模型以通用方式对过程进行建模,但蒙特卡洛模拟提供了检查实验值并研究结果的范围和趋势的机会。它也易于适应极其具体的场景,包括多个变量或过程可能相互依赖或相互影响的场景。

虽然没有单一的首选技术来创建蒙特卡洛模拟,但这种任务的方法通常涉及一系列输入,这些输入是从具有已知特征(均值、标准差、偏度等)的总体/分布中随机选择的。在对分布进行抽样以获取值之后,模拟器执行确定性计算,以根据特定于该迭代的输入集来确定结果。蒙特卡洛模拟的主要可信度来自分析师运行相同模拟数百或数千次以生成结果池的能力,从中可以得出具有统计意义的结论。

使用代码

包含的代码由一个 Simulation 类和一个演示如何使用该类来解决特定问题的窗体组成。 显然,该类可以被修改或按原样使用,以调查其他模拟场景。 然而,在这种情况下,我模拟了对那些试图确定他们是否有足够的钱退休的人有用的结果。 简而言之,用户指定初始投资(他们的储蓄)、这些储蓄投资的预期回报率、投资的历史或预期标准差以及年度提款率(例如,35,000 美元)。

如果考虑到其他因素,例如,可变通货膨胀率,该示例将更加准确。 此外,扩展该示例以对多个投资进行建模将是直接的,每个投资都有其自己的预期回报率和风险。 结果表可以汇总每个投资绩效的预期结果,并生成组合的预测值。 然而,为了简单起见,我选择保持演示窗体简单易懂。

当输入被输入并发出计算请求时,会构建一个表格,其中包含每个模拟试验的结果(默认情况下,2000 次试验)。 同样,会构建并显示一个表格,其中包含一些总结结果的信息统计数据。 这显示了相对年份数、帐户余额以及投资者在特定年份已达到其储蓄终点的可能性。 实验数据已经成熟,可以进行额外的分析,并且可以扩展到包括置信区间,或者回答稍微不同但相关的问题。

模拟类本身是使用描述要采样的分布的参数构建的。 在这里,我们假设正态分布,并用均值 mu 和标准差 sigma 来描述它。 显然,其他分布可能更适合特定的建模问题,例如,对数正态分布或二项式分布。 实例化的类公开了一个方法 GetSimulatedValue(),该方法从与指定分布特征相匹配的池中返回单个随机样本值。

可以实例化该类并调用采样方法,如下所示

Simulation simulator = new Simulation(mu, sigma);
for (Int32 instance = 0; instance < 2000; instance++)
{
    Double simValue = simulator.GetNextSimValue();
    //collect the retrieved values in an array, datatable, or collection...
}
//summarize the results by calculating relevant statistics

结论

此代码尚未经过彻底测试,可能包含错误。 其目的是指导模拟技术,不应依赖于实际数据用于决策。 它尚未针对性能或效率进行优化,并且编写的代码不是特别优雅或灵活。 我的目标是使其尽可能易于阅读和理解,以便其他人可以创建他们自己的函数来实现所描述的概念。 也就是说,如果您发现错误或一些明显的遗漏,或者您觉得我可以更清楚地解释某些内容,我欢迎建设性的反馈。

© . All rights reserved.