多输入单输出Google表格如何实现蒙特卡洛分析?
我刚好折腾过Google Sheets里的蒙特卡洛分析,给你几个落地的方案,完全能替代Excel里的DIY流程:
方案1:用Google Apps Script模拟Excel宏的循环重算逻辑
这是最贴近你Excel操作习惯的方法,用脚本实现循环触发重算+结果记录,步骤如下:
- 先在你的输入单元格里写好和Excel类似的公式,比如
=NORMINV(RAND(), expected_return, st_deviation),多个输入项就逐个设置。 - 打开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); }
- 保存脚本后,点击脚本编辑器里的运行按钮,授权后就能自动执行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
相关产品推荐
相关产品推荐

