matlab 如何使用plot3函数在3D图中绘制直方图

pu3pd22g  于 2023-06-30  发布在  Matlab
关注(0)|答案(1)|浏览(185)

我试图使用plot3函数和一个绘制直方图的函数绘制特定随机过程轨迹的直方图。
我简单解释一下逻辑。
专注于这一点是重要的部分。

y = @(x,T) lognpdf(x,log(S0)+(r-0.5*sigma^2)*T,sigma*sqrt(T));
T = linspace(0,T,5);
for i = 1:length(T)
    ind = find(t>=T(i),1,'first');
    x_arg = linspace(min(S(:,ind))-20, max(S(:,ind))+40, 100);
    plot3(T(i)*ones(length(x_arg),1),x_arg,y(x_arg,T(i)),'k','linewidth',2)
end

这个想法是通过从最小值到最大值取一个等间距网格,以一定的时间间隔绘制频率直方图。
为了显示结果应该是什么样子,我假设我的过程以对数正态分布演化(完全没有意义,但它是为了给予结果的想法),并绘制了不同时间步长的分布。现在我想做同样的事情,但是对于过程S(t)和V(t)使用直方图(因为我实际上不知道这个分布)。
输出结果应与此类似(但具有直方图)
S(t) process
V(t) process
我留下下面的代码(它也应该与GNU Octave兼容,Matlab克隆)。
我提前感谢任何想帮助我或给予我建议的人。祝大家有个愉快的一天:)

%% Simulation of the Heston (1993) Stochastic Volatility Process
clear variables
close all
clc

% fixing seed of for replicability
rng(37,"twister")

%%% Parameters - Simulation dependent
M = 25; % number of paths
N = 252; % number of days
T = 1.0; % Time in years

% Parameters - Heston dependent
r = 0.02; % risk free rate
S0 = 100; % initial asset price value
V0 = 0.30; % initial variance value
kappa = 4; % rate of mean reversion of variance under risk-neutral dynamics 
theta = 0.04; % long-term mean of variance under risk-neutral dynamics 
eta = 0.45; % vol-of-vol
rho = -0.3; % correlation between returns and variances under risk-neutral dynamics     

%%% Heston simulation
[S,V] = pathsheston(S0,V0,r,kappa,theta,eta,rho,T,M,N);

%%% Plot Heston model paths for S(t)
t = 0:T/N:T;
% figure(1)
% plot(t,S,'linewidth',1.5)
% grid on
% xlabel('time')
% ylabel('S(t)')

%%% Plot Heston model paths for V(t)
% figure(2)
% plot(t,V,'linewidth',1.5)
% grid on
% xlabel('time')
% ylabel('V(t)')

%----------------------------------------------------
% Paths and PdF for S(t) and V(t)
%----------------------------------------------------
sigma = 0.4;

%%% for S(t)
figure3 = figure;
axes4 = axes('Parent',figure3);
hold(axes4,'on');

% density plot for S(t)
plot(t,S,'linewidth',1,'color',[0 0.45 0.74])
y = @(x,T) lognpdf(x,log(S0)+(r-0.5*sigma^2)*T,sigma*sqrt(T));
T = linspace(0,T,5);

for i = 1:length(T)
    ind = find(t>=T(i),1,'first');
    x_arg = linspace(min(S(:,ind))-20, max(S(:,ind))+40, 100);
    plot3(T(i)*ones(length(x_arg),1),x_arg,y(x_arg,T(i)),'k','linewidth',2)
end

axis([0,T(end),0,max(max(S))])
grid on;
xlabel('t')
ylabel('S(t)')
zlabel('density')
view(axes4,[-68.8 40.08]);

%%% for V(t)
figure4 = figure;
axes4 = axes('Parent',figure4);
hold(axes4,'on');

% density plot for S(t)
plot(t,V,'linewidth',1,'color',[0 0.45 0.74])
y = @(x,T) lognpdf(x,log(V0)+(r-0.5*sigma^2)*T,sigma*sqrt(T));

for i = 1:length(T)
    ind = find(t>=T(i),1,'first');
    x_arg = linspace(min(V(:,ind))-0.5, max(V(:,ind))+0.5, 100);
    plot3(T(i)*ones(length(x_arg),1),x_arg,y(x_arg,T(i)),'k','linewidth',2)
end

axis([0,T(end),0,max(max(V))])
grid on;
xlabel('t')
ylabel('V(t)')
zlabel('density')
view(axes4,[-68.8 40.08]);

%% Generate Paths from Heston
function [S,V] = pathsheston(s0,v0,r,kappa,theta,eta,rho,T,nPaths,nSteps)

dt = T/nSteps; % time step

% Cholesky decomposition
Corr = [1, rho; rho, 1]; 
A = chol(Corr,"Upper");     % Corr = A x A^(T)  

TT = randn(nPaths,nSteps,2);  
Z = zeros(nPaths,nSteps+1); % for log(S) increments
V = zeros(nPaths,nSteps+1); % for variance increments
V(:,1) = v0;            

for i = 2 : nSteps+1
    C = squeeze(TT(:,i-1,:))*A;
    V(:,i) = abs(V(:,i-1) + kappa*(theta-V(:,i-1))*dt + eta*sqrt(V(:,i-1)*dt).*C(:,1));
    Z(:,i) = Z(:,i-1)+(r-V(:,i-1)/2)*dt + sqrt(dt*V(:,i-1)).*C(:,2);
end

S = s0*exp(Z);

end

**(非常可选)**如果你知道如何在MatLab中使用颜色;这将是伟大的直方图更多的前面有很多透明度比一个更远的回来(我写得很糟糕,但我希望你明白我在说什么,无论如何,这是没有必要的,我只需要能够绘制直方图的路径)

3pmvbmvn

3pmvbmvn1#

你可以使用histogram2来实现。
我没有 * 统计和机器学习工具箱 *。没有这个,我就不能访问函数lognpdf,所以我不能使用你的确切数据。我可以运行你的代码直到第56行,在那里你调用S(t)的第一个图:

plot(t,S,'linewidth',1,'color',[0 0.45 0.74])

从那里,而不是使用lognpdf来生成直方图,我必须使用模拟数据,松散地调整到您的数据范围,以便可视化保持相关性。

%% Generate 5 datasets at different t (called xs to not interfere)
xs = 0:.25:1;
nx = numel(xs) ;
np = 5000 ;
y = zeros( nx , np ) ;
for k=1:nx
    y(k,:) = ( randn(1,5000) * 20*k/nx ) + 100 ;
end

一旦我有了可以生成直方图的数据,你就可以像这样以切片的方式在3D中显示它们:

hold on
for k = 1:nx
    alphaLevel = k/nx/2+0.25 ; % Will vary alpha from 0.25 to 0.75    
    hh(k) = histogram2( repmat(xs(k),1,np), y(k,:) , xs(k)+[-0.01 0.01] , 0:2:200, ...
        'FaceColor',[.7 .7 .7], 'FaceAlpha',alphaLevel, 'EdgeAlpha',alphaLevel );     
end
% hold off
view(-60,30)

这将使您获得以下显示:

正如你所看到的,我的分布并不完全代表你的数据,但你应该得到的想法。对直方图进行“切片”的要点在于调用函数的方式。我使用了call语法:histogram2(X,Y,Xedges,Yedges, ...)

  • 第一个参数X是一个向量,仅包含该直方图应该位于的t值。重复此值,使向量具有与y相同的点数。
  • 第二个参数Y是要在直方图中进行分箱的实际数据(使用您的数据而不是我的样本数据)。
  • 第三个参数Xedges将定义直方图切片的位置和厚度。在本例中,其厚度为0.02,以每个t值为中心。根据数据的需要进行调整。
  • 第四个参数Yedges不太重要,但我们必须在这个调用语法中提供一些东西,它确保所有直方图都以相同的方式绑定。

最后几个参数控制可选的透明度,FaceAlphaEdgeAlpha。alpha值必须介于0(=完全透明)到1(=完全不透明)之间。我使alpha水平从0.25(第一个直方图,非常透明)变化到最后一个直方图的0.75(几乎不透明)。同样,可以随意调整这些级别以获得更好的可视化效果(特别是如果您使用另一种颜色作为直方图,则需要调整保持图形清晰所需的透明度级别)。

相关问题