我试图使用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中使用颜色;这将是伟大的直方图更多的前面有很多透明度比一个更远的回来(我写得很糟糕,但我希望你明白我在说什么,无论如何,这是没有必要的,我只需要能够绘制直方图的路径)
1条答案
按热度按时间3pmvbmvn1#
你可以使用
histogram2
来实现。我没有 * 统计和机器学习工具箱 *。没有这个,我就不能访问函数
lognpdf
,所以我不能使用你的确切数据。我可以运行你的代码直到第56行,在那里你调用S(t)
的第一个图:从那里,而不是使用
lognpdf
来生成直方图,我必须使用模拟数据,松散地调整到您的数据范围,以便可视化保持相关性。一旦我有了可以生成直方图的数据,你就可以像这样以切片的方式在3D中显示它们:
这将使您获得以下显示:
正如你所看到的,我的分布并不完全代表你的数据,但你应该得到的想法。对直方图进行“切片”的要点在于调用函数的方式。我使用了call语法:
histogram2(X,Y,Xedges,Yedges, ...)
:X
是一个向量,仅包含该直方图应该位于的t
值。重复此值,使向量具有与y
相同的点数。Y
是要在直方图中进行分箱的实际数据(使用您的数据而不是我的样本数据)。Xedges
将定义直方图切片的位置和厚度。在本例中,其厚度为0.02,以每个t
值为中心。根据数据的需要进行调整。Yedges
不太重要,但我们必须在这个调用语法中提供一些东西,它确保所有直方图都以相同的方式绑定。最后几个参数控制可选的透明度,
FaceAlpha
和EdgeAlpha
。alpha值必须介于0(=完全透明)到1(=完全不透明)之间。我使alpha水平从0.25(第一个直方图,非常透明)变化到最后一个直方图的0.75(几乎不透明)。同样,可以随意调整这些级别以获得更好的可视化效果(特别是如果您使用另一种颜色作为直方图,则需要调整保持图形清晰所需的透明度级别)。