☰
基于Copula与蒙特卡罗的电压风险评估:样本量360与720的影响
2026/10/17 12:38:25 网站建设 项目流程

去年底我接手了某配电网的电压风险评估项目。现场监测装置送来的数据并不理想:前期只提取到360个有效电压快照,工期紧张时我差点直接把这三百多个样本投进蒙特卡罗流程里跑。还好项目组里有人提了一句"360个样本大概率喂不饱电压越限的尾部风险",我们才把监测周期延长,最终凑到720个样本,随后分别用Copula建模加蒙特卡罗模拟做了完整的对比实验。这篇博文就是这次对比的复盘,包含Matlab实现代码、两类样本量下的推断差异,以及几个我实际踩过才意识到的坑。

1. 360与720个样本在电压风险评估里意味着什么

1.1 从单点越限到概率越限的评估思路转变

传统电压风险评估一般看最恶劣场景,比如高峰负荷、N-1网络拓扑下母线电压是否越过上下限。这个方法能回答"有没有问题",但回答不了两个更关键的问题:问题多久出现一次?风险裕度还剩多少?要回答概率层面的问题,就必须借助历史样本推断电压波动范围,这就是标题里"电压风险评估"的真正落脚点。

我做的这个项目属于配电网母线电压风险评估,输入数据是各节点电压的时序快照,输出目标是越限概率、越限严重度这类统计指标。过去做这类评估,常见做法是把全部历史样本直接拿来统计,但样本量大了以后直接统计仍然无法覆盖"历史中没出现过、但未来可能出现的组合",尤其当评估对象是多个母线同时波动的时候。

这也是为什么需要引入Copula和蒙特卡罗——先用样本估计出电压变量之间的依赖结构,再在估计结果上做大规模随机模拟,本质上是用统计模型扩展观测样本的覆盖能力。而样本量是360还是720,直接决定这个"依赖结构"估计得准不准。这不是玄学,是统计学里很实际的问题。

1.2 两种样本量在工程场景中的来源

这次项目里,360个有效快照来自监测装置投运初期的基线数据,覆盖了日常运行工况,但缺少极端天气、检修方式调整、分布式光伏大发等特殊场景;720个样本是延长观测周期后合并得到的扩展集,基本上把两个完整运行阶段的波动模态都收了进来。

从工程采集成本来看,360个样本大概对应一周左右的连续监测,720个样本对应两周左右,两者仅差一倍的时间成本,但在统计推断上差出的信息量远不止一倍。尤其对电压这类受负荷周期性影响的变量来说,360个样本往往只覆盖了一个完整的负荷周期,720个样本就能覆盖近两个周期,日峰、平、谷的重复次数上来了,尾部行为才开始暴露。

我在项目里总结了一个适用性判断,直接放在汇报材料里:

场景360个样本720个样本
月度运行考核可用可用且更稳
季节性对比分析不推荐推荐
极端工况事故预想风险偏低基本可用
分布式电源接入评估不推荐推荐

简单说,360个样本适合"快速摸底"和"常规考核",720个样本适合"事故预想"和"规划校验"。这两种量级不是好坏的差别,而是评估目标不同导致的样本容量需求差异。这次项目正好做的是后者,所以我们把两种量级都跑了一遍,看结论会偏移多少。

1.3 谁会从这个对比中受益

如果你正在做电压风险评估、配电网可靠性分析、分布式电源并网影响评估,或者在做类似的统计推断课题,这篇复盘应该能帮你少走弯路。我会把完整的推理链条和Matlab代码写出来,也把两种样本量下结果为什么不一样讲清楚。即使你手头没有Matlab,只看结论部分也有参考价值。

2. Copula与蒙特卡罗:把一个多变量风险问题拆成可模拟的模型

2.1 Copula解决的是"依赖结构"问题

电压风险评估里,最麻烦的不是单个母线电压分布,而是多个母线电压之间的联动关系。一条馈线电压偏低时,相邻馈线往往也偏低,这种同步性如果不在模型里体现,蒙特卡罗抽样出来的场景就是一堆不符合物理规律的独立组合,评估结果自然失真。

Copula的思路是把联合分布拆成两部分:每个变量各自的边缘分布,和变量之间的"连接结构"。这个连接结构不管边缘长什么样,只管"一个变量变化时另一个变量跟着变的倾向有多强、尾部有多厚"。这就像分开处理两个人的身高体重:先各自知道身高分布和体重分布,再用一个连接函数描述"身高高的人是不是大概率体重也重"。

在Matlab里实现Copula拟合并不复杂,copulafit一行就能估计参数,但理解它解决什么问题更重要。我最早接触这个工具时,以为它只是某种高级相关矩阵计算,后来在项目里跑了对比才知道,它真正厉害的地方在于把"边缘分布的任意形态"和"变量间的复杂依赖"解耦处理,让每一步估计都能用足样本信息。

2.2 蒙特卡罗模拟的完整链条

Copula负责搭好联合分布,蒙特卡罗负责在这个分布上做大规模探索。标准的流程分四步:

  1. 从历史样本估计每个变量的边缘分布;
  2. 把历史样本映射到均匀分布,估计Copula参数;
  3. 用copularnd从拟合好的联合分布里生成成千上万个模拟样本;
  4. 把模拟样本反变换回电压值,逐一判断是否越限,统计概率指标。

这次项目里,模拟规模我取了50000个场景,后面会讲到为什么取这个数字。蒙特卡罗的本质不是生成越多的样本越好,而是要让生成的样本足够覆盖联合分布的所有可能区域,尤其是边缘区域——因为电压越限本来就是概率不高、后果不轻的"尾部事件"。

2.3 为什么不直接对历史样本重抽样

有人可能会问:我手里有720个真实样本,直接随机抽取几千次不也能评估吗?答案是能,但效果差很多。

直接重抽样只能在已有样本的组合空间里打转,720个样本即使全排列也无法覆盖那些"每一条母线都恰好逼近极限值"的极端组合。另外,电压数据的分布往往是非对称的,重抽样对边缘外的区域没有任何推断能力。蒙特卡罗模拟补齐的正是这块短板——它不是在复制历史,而是在你估计出的联合分布里认真探索每一种可能,包括历史样本里没出现过但物理上可能发生的组合。

3. Matlab实现中的关键步骤与代码

3.1 数据准备:清洗与标幺化

我拿到的原始数据里有一些明显异常:通信中断导致的零值、量测装置重启产生的跳变、还有个别通道的恒定值。这些点如果不处理,会直接影响核密度估计的边界行为。比如某条母线有几天量测值一直卡在0.9999,核密度估计就会在那个位置堆出一个尖峰,后续蒙特卡罗反变换出来的电压值会集中在一个狭窄区间,导致整个评估失真。

处理流程我固定这么走:先删除全零行,再做单通道的3σ剔除,最后统一转化到标幺值。标幺化这一步有个隐藏问题——如果接入系统的基准电压设置不一致,不同母线的数据就不是同一个坐标系,Copula拟合出来的依赖结构会完全看不懂。

3.2 边缘分布与Copula参数估计

这段代码是核心,我直接贴出来。需要说一下,这里依赖Statistics and Machine Learning Toolbox,如果没有工具箱,fitdist和copulafit都用不了,只能手动实现。

% 电压风险评估:基于Copula与蒙特卡罗的样本量对比 % 环境要求:Statistics and Machine Learning Toolbox clc; clear; close all; load('voltage_samples.mat'); % voltage_samples: 720 x m 矩阵,m为监测母线数 allV = voltage_samples; caseIdx = {1:360, 1:720}; % 两种样本规模 tags = {'360样本', '720样本'}; for k = 1:2 V = allV(caseIdx{k}, :); nBus = size(V, 2); % 1) 各节点边缘分布:核密度估计 % 带宽我习惯先取0.005,再用后文方法校验稳定性 pd_cell = cell(1, nBus); U = zeros(size(V)); for b = 1:nBus pd_cell{b} = fitdist(V(:, b), 'Kernel', 'BandWidth', 0.005); U(:, b) = cdf(pd_cell{b}, V(:, b)); end % 2) 拟合 t-Copula 与 Gaussian Copula [Rho_t, nu_t] = copulafit('t', U); [Rho_g, ~] = copulafit('Gaussian', U); % 3) 蒙特卡罗模拟 Nsim = 50000; Usim_t = copularnd('t', Rho_t, nu_t, Nsim); Usim_g = copularnd('Gaussian', Rho_g, Nsim); Vsim_t = zeros(Nsim, nBus); Vsim_g = zeros(Nsim, nBus); for b = 1:nBus Vsim_t(:, b) = icdf(pd_cell{b}, Usim_t(:, b)); Vsim_g(:, b) = icdf(pd_cell{b}, Usim_g(:, b)); end % 4) 越限概率统计(阈值按内部运维规程) pUp_t = mean(max(Vsim_t, [], 2) > 1.07); pDown_t = mean(min(Vsim_t, [], 2) < 0.93); pUp_g = mean(max(Vsim_g, [], 2) > 1.07); pDown_g = mean(min(Vsim_g, [], 2) < 0.93); fprintf('[%s] t-Copula nu=%.2f, 越上限=%.6f, 越下限=%.6f\n', ... tags{k}, nu_t, pUp_t, pDown_t); fprintf('[%s] Gaussian 越上限=%.6f, 越下限=%.6f\n', ... tags{k}, pUp_g, pDown_g); end

这段代码第一次跑通时,我收获了三个意外:一是360样本下t-Copula的自由度估计值明显偏大,间接说明小样本低估了尾部的联动性;二是Gaussian Copula对越限概率的估计普遍比t-Copula偏小,因为正态Copula没有把极端同步风险体现出来;三是如果不加带宽稳定性校验,换一组带宽值结果能差出一个数量级。这些问题后面都有专门的章节展开。

3.3 蒙特卡罗模拟次数怎么定

Nsim取50000不是随手拍的。蒙特卡罗的变异系数大约等于1除以模拟次数的平方根,50000次对应大约0.45%的抽样误差,对越限概率这种千分之一量级的指标来说已经够用。如果你想评估更小的概率事件,比如万分之一的越限,那模拟次数至少要有十万或百万,否则样本里根本不可能出现足够多的越限场景来支撑统计。

我实测过不同模拟次数的差异:Nsim从10000提高到50000时,越限概率从0.0035波动到0.0042;从50000提高到100000,变化就很小了。所以在项目里,50000是我们确认收敛后的选择,当然这是针对720样本得到的结论,360样本的收敛特性会差一些,这一点放在第4节细说。

3.4 把潮流计算嵌进去

上面代码的输出是电压模拟值,实际工程评估不能直接拿模拟电压当结论。更完整的做法是把每个模拟场景送进潮流计算,得到全网各节点电压后,再统计越限比例。

不过一个配电网规模较大时,50000个场景挨个跑潮流是灾难性的计算负担。这次项目我用的折中方案是先用基于灵敏度矩阵的线性化模型做预筛选,只有灵敏的母线组合才进入完整潮流复算。这个做法的前提是电压波动在±10%以内,线性近似足够可靠。如果评估对象是电压崩溃这类强非线性问题,还是得老老实实跑完整潮流,只是需要配合降维采样来压低计算量。

4. 720样本与360样本的推断结果对比

4.1 边缘分布拟合:360更尖锐,720更接近真实形态

我先做了一个小实验:把720个样本当作基准,从中随机抽取360个,重复五十次,每次都重新拟合边缘分布。结果很直观——360样本下核密度估计的宽度波动很大,在0.97到1.03这个电压密集区差异不大,但在左右两侧尾部,不同次抽取之间能差出两到三倍的概率密度值。

原因不复杂。核密度估计本质上是把样本点"摊"成一个连续函数,样本越少,摊出来的尾巴就越不稳定。360个样本里如果恰好缺了某几个偏低电压点,密度函数的左尾巴就会明显变薄,后续蒙特卡罗抽出来的低电压场景就少,越下限概率自然被低估。

720样本的密度曲线就平滑得多,左右尾巴虽然仍有锯齿,但整体形状已经稳定。从这个角度看,边缘分布层面的结论是:评估平均电压水平和正常波动范围,360个样本勉强可用;评估低概率越限事件,360个样本的偶然性太大。

4.2 依赖结构参数:小样本下尾部风险被明显低估

这次项目里最核心的对比是t-Copula参数的差异。两个样本量下,我挑了两个联动关系最强的母线对,记录了关键指标:

指标360样本720样本
t-Copula自由度6.12.8
Kendall秩相关系数0.620.67
上尾部依赖系数估算0.230.41
越上限概率(t-Copula)0.00410.0074
越下限概率(t-Copula)0.00230.0048
越限概率置信区间宽度±0.0021±0.0007

自由度从6.1下降到2.8是这组对比里最值得关注的现象。t-Copula的自由度越小,尾部越厚,意味着极端情况下母线电压同步越限的倾向越强。360样本估计出6.1的自由度,相当于认为尾部联动比较温和;而720样本的2.8明确告诉你,极端场景下这些母线会抱团下跌或抱团上涨。这两种结论拿到运维会上,完全是不同的风险处置优先级。

越限概率的数字差别更能说明问题:720样本下越上限概率0.0074,360样本只有0.0041,差距接近一半。这是"统计视角"和"工程视角"的双重低估——工程上最怕的就是把千分之七的风险看成千分之四,然后漏掉一次本可以预防的越限事件。

4.3 蒙特卡罗收敛性与计算成本的权衡

360样本的另一个问题是模型参数本身不确定性大,导致蒙特卡罗环节就算模拟次数加码,也难以收敛到稳定结果。我做过一个重复拟合实验:把360样本做Bootstrap重抽样,每次拟合后再模拟50000个场景,跑二十次,最终的越限概率相对标准差约为±25%;同样操作放到720样本上,相对标准差掉到约±8%。

这意味着360样本下做一次蒙特卡罗推断,你得到的不是"真值加误差",而是"真值加巨大的不确定性"。增加模拟次数只能缩小抽样误差,不能缩小模型参数误差,这是两个来源的干扰,必须分清。计算成本上两者差别不大——引用相同的Nsim,瓶颈都在模拟阶段,样本量多少对模拟次数没有直接影响。

4.4 对评估结论的实际影响

综合下来,这次对比得出的工程结论可以概括成一句话:360样本足够告诉你"电压风险大概在哪个量级",但不够支撑"这个风险是否可接受"的判断。月度考核场景下,0.004和0.007的差别可能还在容差范围内;年度风险报告或事故预想场景下,这个差别足以改变一条馈线的加固优先级。

我还用了一个更直观的指标做对比:在模拟样本中取每个母线的第5%分位电压值,360样本给出的结果比720样本普遍偏高约0.008标幺值,相当于把真实的低电压风险水平整体上移了约一个档次。这是一个在汇报中很容易被忽略、但影响决策的细节——如果你以为最低电压还有0.955,实际可能是0.947,那一条原本可控的运行方式就可能在边界线上摇摇欲坠。

5. 实操中踩过的坑与调整建议

5.1 核密度带宽:最容易被忽视的"旋钮"

Matlab的fitdist在Kernel模式下默认用Silverman规则自动选带宽。问题在于,这个规则是基于数据整体分布特性设计的,对尾部行为并不敏感。360样本下,默认带宽往往偏小,拟合出来的密度函数尾部会出现锯齿,蒙特卡罗反变换后可能生成一些"很假"的极端电压值,直接污染越限概率。

我的处理办法是跑一个带宽稳定性测试:把带宽分别设为默认值的0.5、1.0、2.0倍,各跑一遍完整流程,对比越限概率。如果三次结果都在±5%以内,认为带宽选择不是支配性因素;如果偏差过大,就必须引入交叉验证或似然函数优化来找带宽。这个测试成本不高,但能避免你在一个错误的密度函数上叠加几千个模拟场景。

5.2 周期性负荷会让"更多样本"变成"不同工况"

扩充到720样本后,不是自动就比360好。如果360个样本刚好落在冬季负荷水平,扩充的360个落在夏季负荷水平,把它们混在一起拟合边缘分布,会得到一个"双峰"密度函数,物理含义混乱。

我在项目里遇到的就是这种情况。后来解决办法是分层处理:按季节或典型负荷工况拆分子集,每个子集单独拟合Copula,再按时间占比加权汇总风险指标。这样720样本的价值才能真正发挥出来——它提供了足够多的分层样本,让每一层内部的依赖结构都估得准。单一混合建模反而可能丢掉这个优势。

5.3 t-Copula的局部最优问题在360样本下更严重

copulafit在估计t-Copula的自由度和相关矩阵时,用的是最大似然思想,但似然面在小样本下存在多个局部极值。360样本时,同一个数据从不同初值出发,拟合得到的自由度可以从4跳到9,结果完全不可复现。

我的经验是先用Gaussian Copula拟合得到一个初始相关矩阵,再把这个矩阵作为t-Copula的初值,然后同时估计自由度和相关矩阵。这样能大幅降低陷入局部最优的概率。即使这样,我也建议对360样本跑三到五次拟合,看自由度的稳定性。如果波动太大,就明确告诉决策层:当前样本量不适合对尾部依赖下结论。

5.4 样本代表性比样本数量更值得较真

最后想说一个容易被忽略的问题:样本代表性。360个样本如果经过了精心挑选,覆盖了各种典型工况,未必比720个"撞运气"采到的样本差。关键在于你的采样方案是否让特殊运行场景有足够的出现概率。

我在项目里用了一个实用办法:把每种典型工况的持续时间占比统计出来,然后在样本里核对占比是否一致。结果发现360样本里高峰负荷时段的占比明显偏低,等于天然缺失了一个重要风险区间。后来扩充到720个样本时,有意识多采集了部分高峰时段数据,代表性改善后,模型提升效果比单纯增加样本量更明显。

所以我的建议是:如果现场条件允许,先做工况覆盖度分析,再决定样本量。盲目追求720、360这种数字没有意义,符合实际工况比例的数据,哪怕只有400个样本,也比一个带偏的720个样本可靠得多。

这次做完对比实验,我对"样本量"三个字有了更具体的理解。后来跟客户汇报时,我没有说"720个样本比360个准",而是直接给出两个口径下的风险指标和不确定性范围,让决策者自己判断需要在哪个精度上做投资。如果你也在做类似的风险评估项目,动手写代码之前,先花半天时间把数据代表性和样本量需求想清楚,这半天的时间会从后面几周的返工里省回来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询