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
相关产品推荐
相关产品推荐

