我正在努力做以下事情:
我对股票价格进行了模拟,并将数字保存在矩阵中(每个模拟都按列,行中有时间)。
这是我用来设置模拟参数的代码的第一部分,我将轨迹保存在矩阵STORE_SIM中
r=0.05 %parameters
mu = r; sigma = 0.5; S0 = 12;
T = 1;
TIME = 10;
Dt = 1/TIME;
SIM=50
BARR=8
STORE_SIM=zeros(TIME+1,SIM);
我添加了一个额外的行来插入股票价格S0 = 12的起始值,以便从起点进行绘图。
现在我在这里做的是: 如果在这些向量(列)中至少有一个向量值低于阈值,则保存在一个名为STORE_SIM_1 的矩阵中(价格可能会超过阈值的次数,但这已经足够了一次。
另一方面,如果在其中一个向量(列)中,没有值低于阈值,则保存在名为NOTACTIVE的矩阵
for i=1:SIM
DW = sqrt(Dt)*randn(1,TIME);
W = cumsum(DW);
Strue = S0*exp((mu-0.5*sigma^2)*([Dt:Dt:T])+sigma*W);
STORE_SIM(1,i)=S0
STORE_SIM(2:TIME+1,i)=Strue
idx = STORE_SIM>BARR;
to_del=all(idx,1);
STORE_SIM_1=STORE_SIM;
STORE_SIM_1(:,to_del)=0;
index = STORE_SIM<BARR
logic=any(index)
NOTACTIVE=STORE_SIM
NOTACTIVE(:,logic)=0
end
现在我完成了这两个矩阵,我按以下方式绘制:
figure(1)
hold on
xlim([1 12])
for i=1:SIM
plot(NOTACTIVE(:,i),'--')
end
hold on
for i=1:SIM
plot(STORE_SIM_1(:,i),'k')
end
hold on
plot([1,12],[8,8],'r','LineWidth',3)
现在我要做的是在此图中添加一些红线代表每一个第一次向量(列)中的值超出阈值。
顺便说一句。如果您对代码有一般建议,请告诉我。
答案 0 :(得分:2)
实际上,有很多改进可以应用于你的代码......但是我不是一步一步地调整它,而是决定将它完全改变为整个过程。因此,我认为列出所有内容都是毫无意义的,因为它们已经不复存在......但我会关注剩下的内容:
以下是最终代码:
% Define the simulation parameters...
mu = 0.05;
sigma = 0.5;
s0 = 12;
n = 50;
thr = 8;
% Define the time parameters...
tn = 1;
t = 10;
dt = 1 / t;
tl = t + 1;
% Perform the simulation...
s0_all = repmat(s0,1,n);
t_all = repmat((dt:dt:tn).',1,n);
sim = [s0_all; repmat(s0_all,t,1) .* exp(((mu - 0.5 * sigma^2) .* t_all) + (sigma .* cumsum(sqrt(dt) .* randn(t,n))))];
% Split the simulations into two groups based on the threshold...
idx = any(sim < thr,1);
bad = sim(:,idx);
sim(:,idx) = [];
% Find the spots where the thresholds are violated...
[bad_rows,bad_cols] = find(bad < thr);
[~,bad_rows_uni_idx] = unique(bad_cols,'first');
bad_x = unique(bad_rows(bad_rows_uni_idx));
% Plot the figure...
figure();
xlim([1 tl]);
hold on;
for ii = 1:size(bad,2)
plot(bad(:,ii),'Color',[0.5 0.5 0.5],'LineStyle','--');
end
for ii = 1:size(sim,2)
plot(sim(:,ii));
end
for ii = 1:numel(bad_x)
line(repelem(bad_x(ii),2),[0 thr],'Color','r','LineWidth',3);
end
line([1 tl],[thr thr],'Color','r','LineWidth',3);
hold off;
这是最终输出: