添加要绘制的功能

时间:2018-02-10 18:42:37

标签: matlab plot

我正在努力做以下事情:

我对股票价格进行了模拟,并将数字保存在矩阵中(每个模拟都按列,行中有时间)。

这是我用来设置模拟参数的代码的第一部分,我将轨迹保存在矩阵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)

现在我要做的是在此图中添加一些红线代表每一个第一次向量(列)中的值超出阈值

  1. 我不知道如何设置一个矩阵,我可以在其中保存与第一次传递阈值相对应的行号,
  2. 我不知道如何将这些功能添加到我的情节中,就像我的照片一样。
  3. Simulated Trajectories

    顺便说一句。如果您对代码有一般建议,请告诉我。

1 个答案:

答案 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;

这是最终输出:

Output