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

Matlab中Sobol序列重复采样的欧式期权方差计算问题

欧式期权方差计算:randn与Sobol序列的样本抽取问题

一、randn的实现逻辑

我通过以下代码用randn生成随机样本,完成重复试验计算期权方差:

num_steps = 100;
num_paths = 10;
z = randn(num_steps, num_paths); % 生成10条路径的随机数

for exp_num = 1: 20
    for col = 1: 10
        price_vec = z(:, col);
        % 基于price_vec计算期权价格
    end
end

每次试验都会获取全新的随机变量集,能顺利完成重复试验对比。

二、Sobol序列的采样困惑

但用Sobol序列时遇到了问题:我可以创建固定维度的Sobol矩阵,第一次试验能正常遍历列计算,但第二次试验会重新获取相同数值,导致定价结果无差异。我猜测需要随机化每次试验的列起始位置,但不知道最优实现方式,尝试的代码如下:

data1 = sobolset(1000, 'Skip', 1000, 'Leap', 100)
data2 = net(data1, 10)

for exp_num = 1: 20
    % 如何修改列的起始位置,让每次试验的data3都不同?
    for col = 1:10
         data3(:, col) = data2(2:, col)
         % 执行定价计算
     end
end

三、尝试的代码及异常结果

8/21更新尝试了以下代码,但生成的100个期权价格方差反而高于标准伪随机数,不符合预期,说明采样逻辑仍有错误:

num_runs = 100
num_samples = 1000

for j = 1: num_runs
for i = 1 : num_samples
 
            sobol_set = sobolset(num_samples,'Skip',j*50,'Leap',1e2);
            sobol_set = net(sobol_set, 5);
            sobol_seq = sobol_set(:, i)';
            z_uncorr = norminv(sobol_seq, 0, 1)
            % 用z_uncorr通过函数F计算期权价格
end
end

解决方案

1. 核心思路:利用Sobol序列的确定性特性划分独立块

Sobol是确定性低差异序列,无法像randn那样生成全新随机集,但可以通过预先生成足够大的序列,划分不重叠的连续块来模拟多次独立试验,既保证每个试验样本的低差异特性,又避免重复采样。

2. 修正后的代码示例

num_runs = 100;          % 试验次数
num_samples_per_run = 1000; % 每次试验的路径数
num_steps = 100;         % 期权定价的时间步数

% 预先生成足够大的Sobol序列:总点数 = 试验次数 × 每次试验路径数 × 时间步数
total_points = num_runs * num_samples_per_run;
sobol_set = sobolset(num_steps, 'Skip', 1000); % 跳过前1000个初始点(提升均匀性)
sobol_set = net(sobol_set, total_points);      % 生成指定数量的点
sobol_matrix = sobol_set';                     % 转置为 [num_steps, total_points] 格式

% 一次性转换为标准正态分布,提升效率
z_matrix = norminv(sobol_matrix, 0, 1);

% 执行多次试验
price_results = zeros(num_runs, 1);
for j = 1:num_runs
    % 计算当前试验对应的样本索引范围
    start_idx = (j-1)*num_samples_per_run + 1;
    end_idx = j*num_samples_per_run;
    % 提取当前试验的所有路径:[num_steps, num_samples_per_run]
    current_z = z_matrix(:, start_idx:end_idx);
    
    % 替换为你的期权定价函数,输入路径矩阵返回该试验的平均价格
    price_results(j) = your_option_pricing_function(current_z);
end

% 计算方差并对比
sobol_var = var(price_results);
disp(['Sobol序列的期权价格方差:', num2str(sobol_var)]);

3. 原代码错误原因

  • 每次循环重新创建sobolset,且Skip参数用j*50,导致不同试验的序列可能重叠,破坏了低差异特性,反而提升了方差。
  • 嵌套循环中每次仅取单个样本,没有利用Sobol序列的多维均匀性,相当于把低差异序列当成普通伪随机数使用,无法体现方差优势。

4. 关键注意事项

  • 必须跳过Sobol序列的前1000+个点,初始点的均匀性较差。
  • 每次试验使用连续且不重叠的序列块,保证样本独立性。
  • 一次性生成所有需要的序列并转换分布,避免重复创建对象的开销和错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:54:25