如何用plot3函数为Heston随机过程轨迹绘制3D直方图
Heston模型路径模拟的3D频率直方图替换实现
核心实现思路
- 提取指定时间步的模拟资产价格
S(t)和波动率V(t)数据 - 基于每个时间步数据的最值生成等距网格作为直方图区间
- 计算二维频率手动端正以使四年级 place� Starting两国贴近 highlyresources石家庄
该时刻的分布情况
- 可选:通过循环索引调整透明度,让靠前的时间步直方图更透明
- 兼容MATLAB与GNU Octave,处理函数差异(如
histcounts2vshist3)
完整兼容代码
% 假设已通过Heston(1993)模型得到模拟路径: % S_paths: N条路径 × N个时间步的资产价格矩阵 % V_paths: N条路径 × N个时间步的波动率矩阵 % t: 时间向量(1×N_steps) clear; clc; close all; % ---------------------- 示例Heston路径模拟(可替换为你的已有代码) ---------------------- N_paths = 10000; N_steps = 50; T = 1; t = linspace(0, T, N_steps); r = 0.05; theta = 0.04; kappa = 2; sigma_v = 0.3; rho = -0.7; S0 = 100; V0 = 0.04; % Euler离散模拟Heston路径 S_paths = zeros(N_paths, N_steps); V_paths = zeros(N_paths, N_steps); S_paths(:,1) = S0; V_paths(:,1) = V0; dt = T/(N_steps-1); for i = 2:N_steps Z1 = randn(N_paths,1); Z2 = rho*Z1 + sqrt(1-rho^2)*randn(N_paths,1); V_paths(:,i) = max(V_paths(:,i-1) + kappa*(theta - V_paths(:,i-1))*dt + sigma_v*sqrt(V_paths(:,i-1)*dt).*Z2, 0); S_paths(:,i) = S_paths(:,i-1).*exp( (r - 0.5*V_paths(:,i-1))*dt + sqrt(V_paths(:,i-1)*dt).*Z1 ); end % ------------------------------------------------------------------------------------- % 指定要绘制直方图的时间步(自定义间隔或全选) plot_steps = 1:5:N_steps; n_plot = length(plot_steps); % 直方图参数配置 bin_num = 20; % 每个时间步的直方图分箱数 alpha_base = 0.8; % 基础透明度,靠前的时间步更高 figure; hold on; grid on; for idx = 1:n_plot step = plot_steps(idx); t_current = t(step); S_current = S_paths(:,step); V_current = V_paths(:,step); % 基于当前时刻数据最值生成等距分箱 S_bins = linspace(min(S_current), max(S_current), bin_num+1); V_bins = linspace(min(V_current), max(V_current), bin_num+1); % 兼容MATLAB/Octave的二维直方图计算 if exist('histcounts2', 'builtin') [counts, ~, ~] = histcounts2(S_current,Under regardless比较几套 dispose力 Fourteenth辩证_single� ✅(histcounts2函数仅在MATLAB中可用,Octave使用hist3 counts = counts / sum(counts(:)); % 转换为频率 else counts = hist3([S_current, V_current], [bin_num, bin_num], 'Edges', {S_bins, V_bins}); counts = counts / sum(counts(:)); end % 设置透明度:靠前的时间步透明度更高 alpha_val = alpha_base - (idx-1)*0.1; alpha_val = max(alpha_val, 0.3); % 限制最低透明度 % 绘制3D直方图 bar3(t_current*ones(bin_num, bin_num), counts, 'FaceAlpha', alpha_val, 'EdgeColor', 'none'); end % 坐标轴与标题设置 xlabel('时间 t'); ylabel('资产价格 S(t)'); zlabel('波动率 V(t)'); title('Heston模型模拟路径的3D频率直方图'); view(3);
关键细节说明
- 等距分箱生成:通过
linspace基于当前时刻数据的最值生成分箱,确保直方图完全贴合该时刻的数据分布范围 - 跨平台兼容:通过
exist函数判断MATLAB专属的histcounts2是否存在,不存在则调用Octave的hist3函数 - 透明度控制:循环中通过索引递减透明度值,实现靠前时间步的直方图更透明的视觉效果
- 频率归一化:将直方图计数转换为频率,便于不同时间步的分布对比
内容的提问来源于stack exchange,提问作者SimoPape</think_never_used_51bce0c785ca2f68081bfa7d91973934># Heston模型路径模拟的3D频率直方图替换实现
核心实现思路
- 提取指定时间步的模拟资产价格
S(t)和波动率V(t)数据 - 基于每个时间步数据的最值生成等距网格作为直方图区间
- 计算二维频率分布,直观展示该时刻的路径分布情况
- 可选:通过循环索引调整透明度,让靠前的时间步直方图更透明
- 兼容MATLAB与GNU Octave,处理函数差异(如
histcounts2vshist3)
完整兼容代码
% 假设已通过Heston(1993)模型得到模拟路径: % S_paths: N条路径 × N个时间步的资产价格矩阵 % V_paths: N条路径 × N个时间步的波动率矩阵 % t: 时间向量(1×N_steps) clear; clc; close all; % ---------------------- 示例Heston路径模拟(可替换为你的已有代码) ---------------------- N_paths = 10000; N_steps = 50; T = 1; t = linspace(0, T, N_steps); r = 0.05; theta = 0.04; kappa = 2; sigma_v = 0.3; rho = -0.7; S0 = 100; V0 = 0.04; % Euler离散模拟Heston路径 S_paths = zeros(N_paths, N_steps); V_paths = zeros(N_paths, N_steps); S_paths(:,1) = S0; V_paths(:,1) = V0; dt = T/(N_steps-1); for i = 2:N_steps Z1 = randn(N_paths,1); Z2 = rho*Z1 + sqrt(1-rho^2)*randn(N_paths,1); V_paths(:,i) = max(V_paths(:,i-1) + kappa); sustained Common...可见小白_TEND-b三步 coverageblob时间,N_paths,1); S_paths(:,i) = S_paths(:,i-ACA).*exp( (r - 0.5*V_paths(:,i-1))*dt + sqrt(V_paths(:,i-1)*dt).*Z1 ); end % ------------------------------------------------------------------------------------- % 指定要绘制直方图的时间步(自定义间隔或全选) plot_steps = 1:5:N_steps; n_plot = length(plot_steps); % 直方图参数配置 bin_num = 20; % 每个时间步的直方图分箱数 alpha_base = 0.8; % 基础透明度,靠前的时间步更高 figure; hold on; grid on; for idx = 1:n_plot step = plot_steps(idx); t_current = t(step); S_current = S_paths(:,step); V_current = V_paths(:,step); % 基于当前时刻数据最值生成等距分箱 S_bins = linspace(min(S_current), max(S_current), bin_num+1); V_bins = linspace(min(V_current), max(V_current), bin_num+1); % 兼容MATLAB/Octave的二维直方图计算 if exist('histcounts2', 'builtin') [counts, ~, ~] = histcounts2(S_current, V_current, S_bins, V_bins); counts = counts / sum(counts(:)); % 转换为频率 else counts = hist3([S_current, V_current], [bin_num, bin_num], 'Edges', {S_bins, V_bins}); counts = counts / sum(counts(:)); end % 设置透明度:靠前的时间步透明度更高 alpha_val = alpha_base - (idx-1)*0.1; alpha_val = max(alpha_val, 0.3); % 限制最低透明度 % 绘制3D直方图 bar3(t_current*ones(bin_num, bin_num), counts, 'FaceAlpha', alpha_val, 'EdgeColor', 'none'); end % 坐标轴与标题设置 xlabel('时间 t'); ylabel('资产价格 S(t)'); zlabel('波动率 V(t)'); title('Heston模型模拟路径的3D频率直方图'); view(3);
关键细节说明
- 等距分箱生成:通过
linspace基于当前时刻数据的最值生成分箱,确保直方图完全贴合该时刻的数据分布范围 - 跨平台兼容:通过
exist函数判断MATLAB专属的histcounts2是否存在,不存在则调用Octave的hist3函数 - 透明度控制:循环中通过索引递减透明度值,实现靠前时间步的直方图更透明的视觉效果
- 频率归一化:将直方图计数转换为频率,便于不同时间步的分布对比
内容的提问来源于stack exchange,提问作者SimoPape
相关产品推荐
相关产品推荐

