You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多输入单输出Google表格如何实现蒙特卡洛分析?

我刚好折腾过Google Sheets里的蒙特卡洛分析,给你几个落地的方案,完全能替代Excel里的DIY流程:

方案1:用Google Apps Script模拟Excel宏的循环重算逻辑

这是最贴近你Excel操作习惯的方法,用脚本实现循环触发重算+结果记录,步骤如下:

  1. 先在你的输入单元格里写好和Excel类似的公式,比如=NORMINV(RAND(), expected_return, st_deviation),多个输入项就逐个设置。
  2. 打开Google Sheets的「扩展程序」→「Apps脚本」,粘贴下面的脚本(根据你的单元格位置调整参数):
function runMonteCarlo() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const triggerCell = sheet.getRange("A1"); // 随便选一个带易失性函数的输入单元格,用来触发重算
  const outputCell = sheet.getRange("C1"); // 你要记录结果的输出单元格
  const totalRuns = 1000; // 蒙特卡洛运行次数
  const resultsStorage = sheet.getRange("E1:E1000"); // 存放结果的区域

  // 先清空之前的结果
  resultsStorage.clearContent();
  
  // 循环执行重算并记录结果
  const results = [];
  for (let i = 0; i < totalRuns; i++) {
    // 强制触发表格重算:给触发单元格重新赋值,会带动所有易失性函数刷新
    triggerCell.setValue(triggerCell.getValue());
    SpreadsheetApp.flush(); // 确保重算完成再读取结果
    results.push([outputCell.getValue()]); // 存成二维数组方便后续批量写入
  }

  // 一次性写入所有结果,比逐行写快很多
  sheet.getRange(1, 5, totalRuns, 1).setValues(results);
}
  1. 保存脚本后,点击脚本编辑器里的运行按钮,授权后就能自动执行1000次蒙特卡洛分析,结果会存在你指定的区域里。
方案2:无脚本版——用数组公式批量生成结果

如果不想碰脚本,也可以用数组公式实现批量计算,适合表格逻辑相对简单的场景:

  • 第一步:在辅助列(比如D列)生成1000个独立的正态分布随机数,公式用=NORMINV(RANDBETWEEN(1,10000)/10000, expected_return, st_deviation),下拉填充1000行(或者用ARRAYFORMULA一次性生成:=ARRAYFORMULA(NORMINV(RANDBETWEEN(ROW(1:1000)*0+1,10000)/10000, 5, 2),这里的5是均值,2是标准差,按需调整)。
  • 第二步:把你的输出逻辑改成引用辅助列的每一行值作为输入,然后用ARRAYFORMULA批量计算所有输出结果。比如原来的输出是基于A1的输入,现在改成基于D1:D1000,用数组公式一次性得到1000次结果。

这个方法的好处是不需要脚本,但前提是你的输出计算逻辑能兼容数组公式的批量运算,复杂的嵌套依赖可能不太好适配。

几个关键提醒
  • Google Sheets里的RAND()是易失性函数,但脚本里必须用setValue或者SpreadsheetApp.flush()强制触发重算,不然循环里的结果会重复。
  • 如果有多个输入项,不需要逐个触发,只要触发其中一个带易失性函数的单元格,整个表格都会重算。
  • Apps Script有最长6分钟的执行限制,1000次循环完全没问题,要是跑10000次以上,可以把脚本改成分批次执行。

内容的提问来源于stack exchange,提问作者Oren Pinsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:41:42