八度运行正常但绘图不显示?

发布于 2024-11-07 11:44:22 字数 2754 浏览 1 评论 0原文

你好呀 我正在使用 Octave 2.3.4 和绘图命令。我是八度的新人。由于某种原因该图没有显示。这是我的 M 文件示例:

        1;

clear all;

%%%%%%%%% parameters setting  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r=0.01; %risk free rate
S0=50; %underlying price 1

%create an implied volatiltiy surface using below parameters:
basevol=0.25; %implied volatility at time t=0 and in center of strike axis
skewT=-0.001; %icrease in vol for one unit increase in maturity
v1=0.1; %defines how much a smile is raised at left end from base vol
v3=0.2; %defines how much a smile is raised at right end from base vol

nK=100; %no. of strike steps
nT=10; %no. of time steps
Tmax=1; %maximum value in time axis
Kmin=1; %minimum value in strike price axis 
Kmax=150; %maximum value of strike price axis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 


dt=Tmax/(nT-1);
Tvec=0:dt:1;
dk=(Kmax-Kmin)/(nK-1);
Kvec=Kmin:dk:Kmax;
Tvec=Tvec';
Kvec=Kvec';
nK=size(Kvec,1);
nT=size(Tvec,1);
dvolT=ones(nK,nT)*(skewT*dt);
dvolT=cumsum(dvolT,2);

SmileVec=GetSmile(Kvec,v1,0,v3);
dvolK=ones(nK,nT);
dvolK=repmat(SmileVec,1,nT);

ImpliedVolSurface=ones(nK,nT)*basevol+dvolT+dvolK;

%use formula mentioned by John Elder in "Hedging for Financial Derivatives"
%this formula gives local volatility using implied volatility 
function ret=GetLocalVolSurface(ImpliedVolSurface, S, r, Kvec, Tvec)
  [m,n]=size(ImpliedVolSurface);
  LocalVolSurface=zeros(m,n);
  dk=Kvec(2)-Kvec(1);
  dt=Tvec(2)-Tvec(1);
  x=ImpliedVolSurface;
  for i=3:m-2, %loop over strikes
    for j=1:n-1, %loop over time steps
      dv_dk=(x(i+1,j)-x(i-1,j))/(2*dk);
      dv2_dk2=(x(i-1,j)-2*x(i,j)+x(i+1,j))/(dk*dk);
      dv_dt=(x(i,j+1)-x(i,j))/dt;
      K=Kvec(i);
      T=Tvec(j+1);
      rT=T^0.5;
      sig=x(i,j);
      h1=(log(S/K)+r*T+0.5*sig*sig*T)/(sig*rT);
      numer=sig*sig + 2*T*sig*dv_dt + 2*r*K*T*sig*dv_dk;
      denom=(1+K*h1*rT*dv_dk)^2 + K*K*T*sig*sig*(dv2_dk2-h1*dv_dk*dv_dk*rT);
      LocalVolSurface(i,j)=(numer/denom)^0.5;
    end
  end
  ret=LocalVolSurface;
endfunction


LocalVol_Surface=GetLocalVolSurface(ImpliedVolSurface,S0,r,Kvec,Tvec);

AsyImplVols=zeros(nK,1);
T=Tvec(nT-1);
F=S0*exp(r*T);

for i=3:nK-2,
    % use formula sigBS(F,K)=sigLoc( (F+K)/2 )
    K=Kvec(i);
    lookupK=(F+K)/2;
    kdiff=abs(Kvec-lookupK); %try to find nearest point in grid
    kidx=min(find(kdiff==min(kdiff)));
    if ( (kidx > 3) && (kidx < nK-2) ),
        AsyImplVols(i)=LocalVol_Surface(kidx);
    else
        AsyImplVols(i) = NaN;
    end
end
figure(1);
plot(Kvec(3:nK-2),[ImpliedVolSurface(3:nK-2,nT-1) LocalVol_Surface(3:nK-2,nT-1) AsyImplVols(3:nK-2)]);

当我在 Octave 中运行且没有错误时,绘图永远不会显示。它确实包括 gnuplot 1.0.1,我理解该图吗?有什么我没有做或错过的事情吗?我也在 Windows 2003 Server 上运行它。 谢谢

HI there
I am using Octave 2.3.4 with a plot command. I am new at Octave. This plot does not display for some reason. Here is my M file sample:

        1;

clear all;

%%%%%%%%% parameters setting  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r=0.01; %risk free rate
S0=50; %underlying price 1

%create an implied volatiltiy surface using below parameters:
basevol=0.25; %implied volatility at time t=0 and in center of strike axis
skewT=-0.001; %icrease in vol for one unit increase in maturity
v1=0.1; %defines how much a smile is raised at left end from base vol
v3=0.2; %defines how much a smile is raised at right end from base vol

nK=100; %no. of strike steps
nT=10; %no. of time steps
Tmax=1; %maximum value in time axis
Kmin=1; %minimum value in strike price axis 
Kmax=150; %maximum value of strike price axis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 


dt=Tmax/(nT-1);
Tvec=0:dt:1;
dk=(Kmax-Kmin)/(nK-1);
Kvec=Kmin:dk:Kmax;
Tvec=Tvec';
Kvec=Kvec';
nK=size(Kvec,1);
nT=size(Tvec,1);
dvolT=ones(nK,nT)*(skewT*dt);
dvolT=cumsum(dvolT,2);

SmileVec=GetSmile(Kvec,v1,0,v3);
dvolK=ones(nK,nT);
dvolK=repmat(SmileVec,1,nT);

ImpliedVolSurface=ones(nK,nT)*basevol+dvolT+dvolK;

%use formula mentioned by John Elder in "Hedging for Financial Derivatives"
%this formula gives local volatility using implied volatility 
function ret=GetLocalVolSurface(ImpliedVolSurface, S, r, Kvec, Tvec)
  [m,n]=size(ImpliedVolSurface);
  LocalVolSurface=zeros(m,n);
  dk=Kvec(2)-Kvec(1);
  dt=Tvec(2)-Tvec(1);
  x=ImpliedVolSurface;
  for i=3:m-2, %loop over strikes
    for j=1:n-1, %loop over time steps
      dv_dk=(x(i+1,j)-x(i-1,j))/(2*dk);
      dv2_dk2=(x(i-1,j)-2*x(i,j)+x(i+1,j))/(dk*dk);
      dv_dt=(x(i,j+1)-x(i,j))/dt;
      K=Kvec(i);
      T=Tvec(j+1);
      rT=T^0.5;
      sig=x(i,j);
      h1=(log(S/K)+r*T+0.5*sig*sig*T)/(sig*rT);
      numer=sig*sig + 2*T*sig*dv_dt + 2*r*K*T*sig*dv_dk;
      denom=(1+K*h1*rT*dv_dk)^2 + K*K*T*sig*sig*(dv2_dk2-h1*dv_dk*dv_dk*rT);
      LocalVolSurface(i,j)=(numer/denom)^0.5;
    end
  end
  ret=LocalVolSurface;
endfunction


LocalVol_Surface=GetLocalVolSurface(ImpliedVolSurface,S0,r,Kvec,Tvec);

AsyImplVols=zeros(nK,1);
T=Tvec(nT-1);
F=S0*exp(r*T);

for i=3:nK-2,
    % use formula sigBS(F,K)=sigLoc( (F+K)/2 )
    K=Kvec(i);
    lookupK=(F+K)/2;
    kdiff=abs(Kvec-lookupK); %try to find nearest point in grid
    kidx=min(find(kdiff==min(kdiff)));
    if ( (kidx > 3) && (kidx < nK-2) ),
        AsyImplVols(i)=LocalVol_Surface(kidx);
    else
        AsyImplVols(i) = NaN;
    end
end
figure(1);
plot(Kvec(3:nK-2),[ImpliedVolSurface(3:nK-2,nT-1) LocalVol_Surface(3:nK-2,nT-1) AsyImplVols(3:nK-2)]);

When I run in Octave with no error, the plot is never displayed. It does include gnuplot 1.0.1 which I understand does the graph? Is there something I am not doing or missing? I am also running this on Windows 2003 Server.
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陈独秀 2024-11-14 11:44:22

我在此处得到了答案。 Octave 默认使用 fltk 进行绘图等,但无法正常工作,使用 gnuplot 在这里工作。只需将以下行添加到主目录中的 .octaverc 文件中即可。

graphics_toolkit("gnuplot")

这样,每次 Octave 启动时,它都会将绘图的默认包设置为 gnuplot

I got the answer here. Octave by default uses fltk for plotting etc, which is failing to work, using gnuplot works here. Just add below lines to .octaverc file in your home directory.

graphics_toolkit("gnuplot")

So that every time octave starts it will set the default package for plotting to gnuplot

不交电费瞎发啥光 2024-11-14 11:44:22

我确实知道这是一个老问题,但由于我昨天遇到了完全相同的错误,也许这也可以帮助其他人:

根据 Octave wiki 页面,绘图和“oct2mat”库似乎存在问题。对我来说,在八度命令提示符下运行此命令并重新启动八度后,问题就解决了

pkg rebuild -noauto oct2mat

。当您需要使用“oct2mat”时,请输入:

pkg load oct2mat

希望有帮助!

I do know that's an old question but since I ran into quite the same error yesterday, maybe this can help someone else, too:

According to the Octave wiki pages, there seems to be a problem with plotting and the "oct2mat"-library. For me, the problem was solved after I ran this at the octave command prompt:

pkg rebuild -noauto oct2mat

and restarted octave. When you need to use "oct2mat", type:

pkg load oct2mat

Hope that helps!

巴黎盛开的樱花 2024-11-14 11:44:22

我在配备英特尔显卡的 Windows 7 64 位笔记本电脑 (HP 630) 上安装时遇到同样的问题。每次你绘图时,它都不会做任何事情,但如果你再次绘图,它就会出现。这是某种刷新错误。这很烦人,但如果你绘制两次,第二次就可以了。

我想知道这是否是某种双缓冲错误,因为它在我自己的带有专用显卡的运行 Windows 7 的笔记本电脑上正常工作。

无论如何,请尝试连续绘制两次,我敢打赌它会起作用,请让我知道机器和显卡是什么,因为我已将此报告给八度开发。

I get the same problem installing on a windows 7 64 bit laptop (HP 630) with intel graphics. Every time you plot, it fails to do anything, but if you plot again, it shows up. It's some kind of refresh bug. It's annoying, but if you plot twice, the second time it works.

I am wondering if it is some kind of double buffering bug, because it works correctly on my own laptop running windows 7 with a dedicated graphics card.

In any case, try plotting twice in a row, I'll bet it works, and please let me know what the machine and video card are, because I've reported this to octave development.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文