VBA 中的蒙特卡罗模拟始终低估真实值

2023-12-02

我构建的蒙特卡罗模拟遇到了一个奇怪的问题。它是一个嵌套循环,用于计算投资的预期价值(实际上是扑克锦标赛)。为了进行演示,假设我们正在讨论单挑扑克锦标赛,这相当于抛硬币。假设每次抛硬币的投资回报率为 25%,买入金额为 1,那么抛硬币 100 次(500, 1000)次后的 EV 为 25 (125, 250) 个单位。然而,模拟分别返回 24,6、123,6 和 246。 代码中的关键行在这里:

Randomize
randomnumber = Rnd()
If randomnumber > adjustedITM Then
MC_array(m, n) = -tournamentvariables(k, 6)
Else:
Randomize
MC_array(m, n) = CDec(tournamentstructures(Int(Rnd() * (tournamentvariables(k, 7)) + 1), k) * tournamentvariables(k, 6) * (1 - tournamentvariables(k, 5)) * tournamentvariables(k, 2) - tournamentvariables(k, 6))
End If

第二个 MC_array(m, n) 是关键代码行。如果玩家获胜,它会给出净利润。如果是抛硬币,则为一个单位。如果我将第二行更改为

 Randomize
    If Rnd() > adjustedITM Then
    MC_array(m, n) = -tournamentvariables(k, 6)
    Else:
    Randomize
    MC_array(m, n) = 1
    End If

结果是正确的。第二个 MCarray 之后的代码将硬币翻转简化为:

CDec(tournamentstructures(Int(Rnd() * (tournamentvariables(k, 7)) + 1), k) * tournamentvariables(k, 6) * (1 - tournamentvariables(k, 5)) * tournamentvariables(k, 2) - tournamentvariables(k, 6))

=
CDec(tournamentstructures(1,1) * 1 * (1 - 0%) * 2 - 1)

所以和一模一样。数组锦标赛结构()的大小为(1,1),因此它无法读取任何内容。我验证了所有结果都是整数(对于抛硬币,你只能赢或输一个单位),我强烈怀疑随机数生成器在某种程度上是有偏差的。

我将代码中的几乎所有内容都声明为变体,并排除了第二个 Randomize,而不会改变偏差。那么伙计们,这是怎么回事?


看起来您正在反复调用Randomize,大概是紧密循环的一部分。每次调用时,它都会从系统时钟重新播种随机数生成器。每次通过循环时这样做都会引入自相关(尽管具体如何还不太清楚)。

考虑以下实验:

Sub Test()
    Dim i As Long, A As Variant
    Dim count1 As Long, count2 As Long
    ReDim A(1 To 10000)

    For i = 1 To 10000
        Randomize
        A(i) = IIf(Rnd() < 0.5, 0, 1)
    Next i

    'count how often A(i) = A(i+1)
    For i = 1 To 9999
        If A(i) = A(i + 1) Then count1 = count1 + 1
    Next i

    For i = 1 To 10000
        A(i) = IIf(Rnd() < 0.5, 0, 1)
    Next i

    'count how often A(i) = A(i+1)
    For i = 1 To 9999
        If A(i) = A(i + 1) Then count2 = count2 + 1
    Next i

   Debug.Print "First Loop: " & count1
   Debug.Print "Second Loop: " & count2 & vbCrLf

End Sub

典型输出:

First Loop: 5452
Second Loop: 4996

我已经运行了好几次了。第一个循环几乎总是生成一个与 5000 相差很大的数字,而第二个循环几乎总是生成一个相当接近 5000 的数字(如果连续调用,则预期值为 4999.5)Rnd对应于独立的随机变量——因此在重复重新播种时明显缺乏独立性)。

故事的寓意:打电话Randomize just once在模拟中,称为主子的第一行。或者,使用Application.WorksheetFunction.RandBetween(0,1)让 Excel 负责播种。

如果此自相关不能解释错误,则问题出在您未显示的代码中,因此您需要包含该代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VBA 中的蒙特卡罗模拟始终低估真实值 的相关文章

随机推荐

  • Paradox 如何管理 null 值和空值?

    我通过 Borland 数据库引擎 BDE 使用 Paradox 表 我无法领悟道路null and 空字符串值在字符串字段中处理 Paradox 数据类型 A 我的具体问题是如何确定字段值是否为空或空字符串 在数据库桌面工具中 它们似乎都
  • 如何在 Python 3 pyspark 中反转 RDD 中的键和值?

    这在 Python 2 7 中有效 但在 Python 3 5 中它返回 语法错误 语法无效 我不确定这是否与我在另一篇文章中读到的 元组解包 从 Python 3 中删除这一事实有关 或者是一个不同的问题 rddInverted rdd
  • MATLAB 的“fminsearch”与 Octave 的“fmincg”不同

    我试图在 MATLAB 和 Octave 中的两个函数之间获得简单优化问题的一致答案 这是我的代码 options optimset MaxIter 500 Display iter MaxFunEvals 1000 objFunc t l
  • Java 静态调用比非静态调用更昂贵还是更便宜?

    是否有这样或那样的性能优势 它是编译器 VM 特定的吗 我正在使用热点 四年后 好吧 为了一劳永逸地解决这个问题 我编写了一个基准测试 它显示了不同类型的调用 虚拟 非虚拟 静态 之间的比较 我运行了它关于ideone 这就是我得到的 迭代
  • 覆盖性。配置为忽略源代码的某些部分

    寻找一种配置覆盖性以忽略某些代码部分的方法 例如 假设我有源代码func1 and func2 我不想进行覆盖性分析func1 但我还是想分析一下func2 有没有办法做到这一点 是否有我可以添加的特殊内嵌注释 int func1 int
  • 创建包含“;”的cookie特点

    我想创建一个cookie 它的值包含许多 通常用于在 java 中分隔多个 cookie 的字符 这就是为什么我的代码无法完成他的工作 如果有人可以帮助我如何创建这个 特殊 cookie 并使我的代码正常工作 谢谢 您可以使用 URL 编码
  • 如何为多记录 Rails 表单中的复选框设置唯一 ID?

    我大致按照中的说明设置了一个 Rails 表单this铁路广播 这是表单的代码 ul div div ul 这是待办事项部分的代码 div class todo li li div
  • Vue:如何使用@click调用多个函数?

    如何在一个函数中调用多个函数 click aka v on click 到目前为止我尝试过 用分号分隔函数 div div 使用几个 click div div 作为解决方法 我可以创建一个处理程序 div div function fn3
  • QSignalMapper 可以用来重新发出具有多个参数的信号吗?

    是否可以使用 QSignalMapper 重新发出具有多个参数的信号 我找到了一种解决方法 但我很想知道这是否可能 示例 采取void QLineEdit textEdited const QString text 信号 并重新发出 voi
  • 我的 sql 查询使用 GROUP BY 函数获取中间行值

    我的数据库结构是这样的 Id Price Code 1 0 12 93 2 0 13 93 3 0 54 93 4 0 96 93 5 0 10 94 6 0 30 94 7 0 90 94 8 1 40 94 9 2 30 94 我必须使
  • 使用ffmpeg生成视频

    我正在尝试使用 ffmpeg 库从图像集生成视频 使用以下代码 我可以在模拟器上生成视频 但是当我在设备上运行它时 它会在视频中产生奇怪的绿色效果 我跟着使用 ffmpeg 将图像编码为视频网址 任何人都可以帮助我 或者如果可以提供代码片段
  • 具有指定截止频率的低通高斯滤波器

    我正在玩混合图像 并想使用高斯滤波器对图像进行低通滤波 然而 为了制作混合图像 应该在 2 个图像上使用 2 个滤波器 并以不同的截止频率进行组合 Does fspecial 当我们使用它来制作高斯滤波器时 允许我们指定截止频率吗 我知道我
  • 我们如何从 Dart 中的抽象类实例化?

    我们如何从 Dart 中的抽象类实例化 如下所示 int a 5 String a Hello List
  • .Net 核心的好处 - 并行执行需要清晰

    微软提到了ebook net core 的好处之一是您可以在同一台计算机上并行运行应用程序的 NET 版本 我在这里感到困惑 即使在 net框架中也是如此feature指向不同 net 框架版本的应用程序可以在同一台计算机上一起运行 那么它
  • 资源文件中的 Qt 图标不显示

    我使用 Qt Designer qith Qt 5 0 1 制作了一个用户界面 并使用了资源文件中的图标 编译后 可执行文件运行得很好 图标也按预期显示 然而 当我在另一台计算机上运行该程序时 它们神秘地消失了 而且我无法将它们找回来 这可
  • 将 FileUpload 内容传递到 [WebMethod] 的正确方法?

    我有一个 WebMethod Sendemail 这工作正常 但现在我如何升级它以发送附件 我正在使用文件上传 这是我的方法调用 lblEmailSent Text Send Sendemail txtTo Text txtSubject
  • 为什么 python 的内置 sum 函数在用于展平列表列表时速度很慢?

    当尝试使用 python 2 7 的内置函数来展平列表列表时sum函数时 我遇到了一些性能问题 不仅计算速度慢 而且迭代方法产生了更快的结果 下面的简短代码似乎说明了这种性能差距 import timeit def sum1 arrs re
  • 为什么这个损坏的程序总是运行?

    我正在尝试 JCIP 中的示例 下面的程序应该不起作用 但即使我执行它 20 次 它总是有效 这意味着ready and number即使在这种情况下应该变得可见 public class NoVisibility private stat
  • 如何使用默认用户名/密码初始化 Spring Boot 安全配置,但在第二次运行时不会崩溃?

    继专题指南在这里并添加基于 BCrypt 的密码编码器Baeldung 的例子在这里我已将 Spring Boot 应用程序配置为使用我的数据库 单独设置 不是由 ORM 或其他东西自动生成 作为其身份验证的用户详细信息来源 我的安全配置的
  • VBA 中的蒙特卡罗模拟始终低估真实值

    我构建的蒙特卡罗模拟遇到了一个奇怪的问题 它是一个嵌套循环 用于计算投资的预期价值 实际上是扑克锦标赛 为了进行演示 假设我们正在讨论单挑扑克锦标赛 这相当于抛硬币 假设每次抛硬币的投资回报率为 25 买入金额为 1 那么抛硬币 100 次