├── .DS_Store ├── Amcrr.m ├── AsianMC.m ├── AssetPaths.m ├── DownOutPut.m ├── Get_delta.m ├── Get_gamma.m ├── Get_rho.m ├── Get_theta.m ├── Get_vega.m ├── KnockMC.m ├── LookbackMC.m ├── README.md ├── UpExpl.m ├── XIRReturn.m ├── bisection.m ├── crr.m ├── garchfunction.m ├── ito.m ├── part 1 ├── part 2 ├── part 3 ├── part 4 ├── part 5 ├── picture_AsianMC.m ├── picture_stock.m └── usabyfd.m /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/39mikufans/Matlab-personal-notes/587b3ae5aed998084a91d81b097fa57388a4fbec/.DS_Store -------------------------------------------------------------------------------- /Amcrr.m: -------------------------------------------------------------------------------- 1 | function price=Amcrr(S0,K,r,T,sigma,N) 2 | %二叉树模型计算美式看跌期权的价格 3 | %使用已知变量计算后续不变量的值 4 | deltaT=T/N; 5 | %N越大,期数越多,最后的价格越精确 6 | u=exp(sigma*sqrt(deltaT)); 7 | d=1/u; 8 | p=(exp(r*deltaT)-d)/(u-d); 9 | discount=exp(-r*deltaT); 10 | p_u=discount*p; 11 | p_d=discount*(1-p); 12 | %设置期权二叉树的增长、下跌模型 13 | SVals=zeros(2*N+1,1); 14 | SVals(N+1)=S0; 15 | for i=1:N 16 | SVals(N+1+i)=u*SVals(N+i); 17 | SVals(N+1-i)=d*SVals(N+2-i); 18 | end 19 | %计算最后一阶段各节点的期权现值 20 | PVals=zeros(2*N+1,1); 21 | for i=1:2:2*N+1 22 | PVals(i)=max(K-SVals(i),0); 23 | end 24 | %比较每个节点的持有价值和内在价值 25 | for tau=1:N 26 | for i=(tau+1):2:(2*N+1-tau) 27 | hold=p_u*PVals(i+1)+p_d*PVals(i-1); 28 | PVals(i)=max(hold,K-SVals(i)); 29 | end 30 | end 31 | price=PVals(N+1); -------------------------------------------------------------------------------- /AsianMC.m: -------------------------------------------------------------------------------- 1 | function p=AsianMC(S0,r,T,sigma,pf,N,M,isA) 2 | %%用蒙特卡洛模拟亚式期权,并画出期权价格与仿真参数(路径数量)之间的关系 3 | %pf:支付函数;T:到期时间;r:无风险利率;sigma:波动率 s0:期初价格 4 | %N:时间维度上的分割点数;M:空间维度上的分割点数 5 | %isA=1,算数平均;isA=0,几何平均 6 | dt=T/N; 7 | s=zeros(M,N+1); 8 | s(:,1)=S0; 9 | for i=1:N 10 | s(:,i+1)=s(:,i).*exp((r-sigma^2/2)*dt+sigma.*sqrt(dt).*randn(M,1)); 11 | end 12 | SB=zeros(M,1);%建立空矩阵 13 | if isA 14 | SB=mean(s,2);%计算算术平均 15 | % disp(SB) 16 | size(SB) 17 | else 18 | SB=exp(mean(log(s),2));%计算几何平均 19 | end 20 | p=exp(-r*T)*mean(pf(SB));%代入公式计算 21 | end -------------------------------------------------------------------------------- /AssetPaths.m: -------------------------------------------------------------------------------- 1 | function Spaths=AssetPaths(S0,mu,sigma,T,Nsteps,Nrepl) 2 | %给予蒙特卡洛生成的资本价格路径,初始价格为S0,飘移mu,波动率sigma,时间长度T,时间 3 | %阶段数量Nsteps,以及重复计算的次数Nrepl,绘制出价格时间路径 4 | Spaths=zeros(Nrepl,1+Nsteps); 5 | Spaths(:,1)=S0; 6 | dt=T/Nsteps; 7 | %计算步长 8 | nudt=(mu-0.5*sigma^2)*dt; 9 | %根据Ito公式表达的几何布朗运动形式 10 | sidt=sigma*sqrt(dt); 11 | for i=1:Nrepl 12 | for j=1:Nsteps 13 | Spaths(i,j+1)=Spaths(i,j)*exp(nudt+sidt*randn); 14 | %用randn表示服从标准正态分布的随机变量,上式是几何布朗运动随时间变化性质 15 | end 16 | end 17 | x=1:1:Nsteps; 18 | for k=1:Nrepl 19 | hold on 20 | plot(x,Spaths(k,x)) 21 | %将Nrepl次模拟的结果同时绘制在一张图上 22 | end 23 | hold off -------------------------------------------------------------------------------- /DownOutPut.m: -------------------------------------------------------------------------------- 1 | function price=DownOutPut(T,N,sigma,S,r,K,H) 2 | %二叉树方法计算敲出期权的定价模型,H为障碍价格 3 | pf=@(x) max(x-K,0); 4 | %此处是看涨期权的情况 5 | dt=T/N; 6 | u=exp(dt*sigma); 7 | d=1/u; 8 | R=1+r*dt; 9 | p0=(R-d)/(u-d); 10 | q0=1-p0; 11 | if R>=u||R<=d 12 | error(''); 13 | price=[]; 14 | return 15 | end 16 | v0=zeros(N+1,1); 17 | v1=zeros(N+1,1); 18 | for i=0:N 19 | v1(i+1)=pf(S*u^i*d^(N-i)); 20 | end 21 | for j=N-1:-1:0 22 | for i=0:j 23 | ex=S*u^i*d^(j-i); 24 | disp(ex) 25 | if ex>=H 26 | v0(i+1)=0; 27 | else 28 | v0(i+1)=(q0*v1(i+1)+p0*v1(i+2))/R; 29 | end 30 | end 31 | v1=v0; 32 | end 33 | price=v1(1); 34 | end -------------------------------------------------------------------------------- /Get_delta.m: -------------------------------------------------------------------------------- 1 | syms s x t sigma r %定义为符号 2 | d1=(log(s/x)+(r+sigma^2/2)*t)/(sigma*sqrt(t)); 3 | d2=(log(s/x)+(r-sigma^2/2)*t)/(sigma*sqrt(t)); 4 | c=s*normcdf(d1)-x*exp(-r*t)*normcdf(d2); 5 | delta=diff(c,s); %求导 6 | f1=matlabFunction(delta); 7 | %@(r,s,sigma,t,x) 8 | df1=@(s) f1(0.04,s,0.2,0.6,100); 9 | figure(1); 10 | title('delta'); 11 | fplot(df1,[10,150]);%在区间内绘制函数图像 -------------------------------------------------------------------------------- /Get_gamma.m: -------------------------------------------------------------------------------- 1 | %gamma是Delta对标的资产价格的敏感度 2 | syms s x t sigma r 3 | d1=(log(s/x)+(r+sigma^2/2)*t)/(sigma*sqrt(t)); 4 | d2=(log(s/x)+(r-sigma^2/2)*t)/(sigma*sqrt(t)); 5 | c=s*normcdf(d1)-x*exp(-r*t)*normcdf(d2); 6 | gamma=diff(c,s,2); 7 | f2=matlabFunction(gamma); 8 | %@(r,s,sigma,t,x) 9 | df2=@(s) f2(0.04,s,0.2,0.6,100); 10 | figure(2); 11 | title('gamma'); 12 | fplot(df2,[10,150]);%在区间内绘制函数图像 -------------------------------------------------------------------------------- /Get_rho.m: -------------------------------------------------------------------------------- 1 | %rho是期权价格对收益率的敏感度 2 | syms s x t sigma r 3 | d1=(log(s/x)+(r+sigma^2/2)*t)/(sigma*sqrt(t)); 4 | d2=(log(s/x)+(r-sigma^2/2)*t)/(sigma*sqrt(t)); 5 | c=s*normcdf(d1)-x*exp(-r*t)*normcdf(d2); 6 | rho=diff(c,r); 7 | f5=matlabFunction(rho); 8 | %@(r,s,sigma,t,x) 9 | df5=@(s) f5(0.04,s,0.2,0.6,100); 10 | figure(5); 11 | title('rho'); 12 | fplot(df5,[10,150]);%在区间内绘制函数图像 -------------------------------------------------------------------------------- /Get_theta.m: -------------------------------------------------------------------------------- 1 | %theta是标的资产价格对时间的敏感度 2 | syms s x t sigma r 3 | d1=(log(s/x)+(r+sigma^2/2)*t)/(sigma*sqrt(t)); 4 | d2=(log(s/x)+(r-sigma^2/2)*t)/(sigma*sqrt(t)); 5 | c=s*normcdf(d1)-x*exp(-r*t)*normcdf(d2); 6 | theta=diff(c,t); 7 | f3=matlabFunction(theta); 8 | %@(r,s,sigma,t,x) 9 | df3=@(s) f3(0.04,s,0.2,0.6,100); 10 | figure(3); 11 | title('theta'); 12 | fplot(df3,[10,150]);%在区间内绘制函数图像 -------------------------------------------------------------------------------- /Get_vega.m: -------------------------------------------------------------------------------- 1 | %vega是期权价格对波动率的敏感度 2 | syms s x t sigma r 3 | d1=(log(s/x)+(r+sigma^2/2)*t)/(sigma*sqrt(t)); 4 | d2=(log(s/x)+(r-sigma^2/2)*t)/(sigma*sqrt(t)); 5 | c=s*normcdf(d1)-x*exp(-r*t)*normcdf(d2); 6 | vega=diff(c,sigma); 7 | f4=matlabFunction(vega); 8 | %@(r,s,sigma,t,x) 9 | df4=@(s) f4(0.04,s,0.2,0.6,100); 10 | figure(4); 11 | title('vega'); 12 | fplot(df4,[10,150]);%在区间内绘制函数图像 -------------------------------------------------------------------------------- /KnockMC.m: -------------------------------------------------------------------------------- 1 | function price=KnockMC(s0,r,T,sigma,pf,N,M,H) 2 | %用蒙特卡洛模拟向上敲出期权 3 | %14917118 何祎航 4 | %pf:支付函数;T:到期时间;r:无风险利率;sigma:波动率 5 | %N:时间维度上的分割点数;M:空间维度上的分割点数 6 | %14917110唐雯洁 7 | dt=T/N; 8 | s=zeros(M,N+1); 9 | s(:,1)=s0;%初始价格 10 | if s0>H %初始价格大于障碍H 11 | error('初始值大于障碍,请重新输入'); 12 | return; 13 | end 14 | for i=1:N 15 | s(:,i+1)=s(:,i).*exp((r-sigma^2/2)*dt+sigma.*sqrt(dt).*randn(M,1));%根据波动计算 16 | for j=1:M 17 | if s(j,i+1)>H 18 | s(j,i+1)=0;%价格大于障碍H,合同提前终止 19 | end 20 | end 21 | end 22 | price=exp(-r*T)*mean(pf(mean(s,2))); %先求行均值,再计算 23 | end -------------------------------------------------------------------------------- /LookbackMC.m: -------------------------------------------------------------------------------- 1 | function price=LookbackMC(s0,r,T,sigma,pf,N,M) 2 | %用蒙特卡洛模拟回望看涨期权 3 | %14917118 何祎航 4 | %pf:支付函数;T:到期时间;r:无风险利率;sigma:波动率 5 | %N:时间维度上的分割点数;M:空间维度上的分割点数 6 | dt=T/N; 7 | s=zeros(M,N+1);%建立空矩阵 8 | %将每次模拟的值存在矩阵中 9 | s(:,1)=s0;%初始价格 10 | for i=1:N 11 | s(:,i+1)=s(:,i).*exp((r-sigma^2/2)*dt+sigma.*sqrt(dt).*randn(M,1)); 12 | end 13 | price=exp(-r*T)*mean(pf(max(s,[],2)));%先算每一路径的最大值,再代入求价格的公式 14 | end -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Matlab-personal-notes 2 | Pricing procedures for various basic financial derivatives written in Matlab 3 | -------------------------------------------------------------------------------- /UpExpl.m: -------------------------------------------------------------------------------- 1 | function price=UpExpl(S0,K,r,T,sigma,Smax,dS,dt) 2 | %有限差分法计算欧式看涨期权定价 3 | M=round(Smax/dS); 4 | dS=Smax/M; 5 | N=round(T/dt); 6 | dt=T/N; 7 | matval=zeros(M+1,N+1); 8 | vetS=linspace(0,Smax,M+1)'; 9 | veti=0:M; 10 | vetj=0:N; 11 | %set up boundary conditions 12 | matval(:,N+1)=max(vetS-K,0); 13 | %此处是支付函数 14 | matval(1,:)=K*exp(-r*dt*(N-vetj)); 15 | matval(M+1,:)=0; 16 | %set up coefficients 17 | a=0.5*dt*(sigma^2*veti-r).*veti; 18 | b=1-dt*(sigma^2*veti.^2+r); 19 | c=0.5*dt*(sigma^2*veti+r).*veti; 20 | %solve backward in time 21 | for j=N:-1:1 22 | for i=2:M 23 | matval(i,j)=a(i)*matval(i-1,j+1)+b(i)*matval(i,j+1)+... 24 | c(i)*matval(i+1,j+1); 25 | end 26 | end 27 | %return price,possibly by linear interpolation outside the grid 28 | price=interp1(vetS,matval(:,1),S0); -------------------------------------------------------------------------------- /XIRReturn.m: -------------------------------------------------------------------------------- 1 | function xirr=XIRReturn(Cashflow,Cashflowtime) 2 | %计算时间不均匀的现金流的内部收益率 3 | %14917118 何祎航 4 | %Cashflow=[-10000, 2500, 2000, 3000, 4000]; 5 | %Cashflowtime=['01/12/2007' 6 | % '02/14/2008' 7 | % '03/03/2008' 8 | % '06/14/2008' 9 | % '12/01/2008'] 10 | function f=root2d(r) 11 | f=pvvar(Cashflow,r,Cashflowtime); 12 | end 13 | fun=@root2d; 14 | r0=0; 15 | r=fsolve(fun,r0); 16 | xirr=r; 17 | end -------------------------------------------------------------------------------- /bisection.m: -------------------------------------------------------------------------------- 1 | function x0=bisection(f,int1,int2,err) 2 | %二分法求函数的根,其中f是函数表达式,int1和int2是区间端点,err是精度要求 3 | %14917118 何祎航 4 | fl=f(int1);fr=f(int2); 5 | if fl==0 %判断两端点是否为零点 6 | x0=int1; 7 | return; 8 | elseif fr==0 9 | x0=int2; 10 | return; 11 | end 12 | if fl*fr>0 %判断两端点是否同号 13 | error('两端点同号'); 14 | end 15 | while (int2-int1>err) %主循环 16 | mid=0.5*(int1+int2); 17 | fm=f(mid); 18 | if fm*fl>0 19 | int1=mid; 20 | elseif fm*fr>0 21 | int2=mid; 22 | else %fm恰好为零点的情况 23 | break; 24 | end 25 | end 26 | x0=mid; 27 | end -------------------------------------------------------------------------------- /crr.m: -------------------------------------------------------------------------------- 1 | function price=crr(T,N,sigma,S,r,K) 2 | %二叉树定价法绘制欧式看涨期权价格与二叉树期数变化的图形 3 | %14917118 何祎航 4 | V2=zeros(N,1); 5 | pf=@(x) max(x-K,0); 6 | for m=1:N 7 | t=T/m; 8 | u=exp(sigma*t); 9 | d=1/u; 10 | R=1+r/m; 11 | p=(R-d)/(u-d); 12 | V0=zeros(m+1,1); 13 | V1=zeros(m+1,1); 14 | if R>=u||R<=d 15 | error(''); 16 | price=[ ]; 17 | return 18 | end 19 | 20 | for i=0:m 21 | V0(i+1)=pf(S*u^i*d^(m-i)); 22 | end 23 | for j=m-1:-1:0 24 | for i=0:j 25 | V1(i+1)=(p*V0(i+2)+(1-p)*V0(i+1))/R; 26 | end 27 | V0=V1; 28 | end 29 | V2(m)=V1(1); 30 | end 31 | price=V2(N); 32 | %期数为N时候根据二叉树定价得到的期权价格 33 | x=1:1:N; 34 | plot(x,V2(x)) -------------------------------------------------------------------------------- /garchfunction.m: -------------------------------------------------------------------------------- 1 | function garchfun() 2 | %14917118 何祎航 3 | [data,txt]=xlsread('601857.csv'); 4 | m=txt(2:49,1); 5 | t=datetime(m); 6 | nr=xlsread('601857.csv','D2:D49'); 7 | table1=timetable(t,nr); 8 | Mdl = garch('GARCHLags',1,'ARCHLags',1,'Offset',NaN); 9 | EstMdl = estimate(Mdl,nr); 10 | numObs=numel(nr); 11 | numpaths=100; 12 | rng(1); 13 | [VSim,YSim] = simulate(EstMdl,numObs,'NumPaths',numpaths); 14 | VSimBar = mean(VSim,2); 15 | VSimCI = quantile(VSim,[0.025 0.975],2); 16 | YSimBar = mean(YSim,2); 17 | YSimCI = quantile(YSim,[0.025 0.975],2); 18 | figure; 19 | subplot(2,1,1); 20 | h1 = plot(t,VSim,'Color',0.8*ones(1,3)); 21 | hold on; 22 | h2 = plot(t,VSimBar,'k--','LineWidth',2); 23 | h3 = plot(t,VSimCI,'r--','LineWidth',2); 24 | hold off; 25 | title('Simulated Conditional Variances'); 26 | ylabel('Cond. var.'); 27 | xlabel('Year'); 28 | subplot(2,1,2); 29 | h1 = plot(t,YSim,'Color',0.8*ones(1,3)); 30 | hold on; 31 | h2 = plot(t,YSimBar,'k--','LineWidth',2); 32 | h3 = plot(t,YSimCI,'r--','LineWidth',2); 33 | hold off; 34 | title('Simulated Nominal Returns'); 35 | ylabel('Nominal return (%)'); 36 | xlabel('Year'); 37 | legend([h1(1) h2 h3(1)],{'Simulated path' 'Mean' 'Confidence bounds'},... 38 | 'FontSize',7,'Location','NorthWest'); 39 | end -------------------------------------------------------------------------------- /ito.m: -------------------------------------------------------------------------------- 1 | function [mu,sigma]=ito(data) 2 | %给定Ito过程的数据,估计其参数 3 | n=numel(data); 4 | z=zeros(n,1); 5 | for i=1:n 6 | z(i)=log(data(i))/log(data(1)); 7 | %服从Ito过程的股票价格满足:股票价格的变化服从对数正态分布 8 | end 9 | sigma=std(z); 10 | mu=mean(z)+(sigma^2)/2; -------------------------------------------------------------------------------- /part 1: -------------------------------------------------------------------------------- 1 | 一般的运算指令都在命令行窗口中进行 2 | 常见的运算符号: + - * / ^ 遵循运算法则 3 | 4 | 常见的函数命令 5 | 三角函数:sin() cos() tan() 6 | 对数函数:log()——计算自然底数的对数 log10()——以10为底的对数 7 | 指数函数:exp() sqrt() 8 | 9 | 复杂算式可以分布计算 10 | sin(cos(pi))等效于 11 | cos(pi);sin(ans) 12 | 13 | 赋值命令“=” 14 | 想要对某变量直接进行赋值可以使用 A=10 15 | Matlab中可以不需要宣告(default)变量的类型,默认的变量类型是double 16 | 可使用的变量类型有: 17 | multidimensional array:logical(逻辑型)、char(字符型)、numeric(数值型)、cell(胞元数组)、struct(结构型) 18 | scalar:function handle(函数句柄) 19 | 其中numeric包括从int8到int64,uint8到uint64以及single和double类型,常用 20 | 21 | 部分常用关键字(keywords)有 22 | ans:answer 23 | i,j:complex number虚数 24 | Inf:∞ 25 | eps:趋于0的极小数 26 | NaN:not a number,表示结果无法被表示为数值 27 | pi:圆周率π 28 | 29 | 如果代码为 30 | cos='This string.'; 31 | cos(8) 32 | 输出结果为r,因为在这里cos从function变成了字符变量,cos(8)输出第8个位置的字符 33 | *所以要注意变量和关键字不能混淆* 34 | 35 | Matlab中的命名使用规则: 36 | 如果命名相同,程序会优先使用高层级的类型来处理。层级从高到低为: 37 | variable → built-in function → subfunction → private function(如MEX-file,P-file,M-file) 38 | 其中built-in function就包括了关键字 39 | 40 | 格式(format)种类: 41 | short小数点后显示四位;long小数点后显示十五位; 42 | shortE显示四位小数的科学记数法;longE显示十五位小数的科学记数法 43 | hex十六进制;rat有理数(分数) 44 | 45 | 语句后跟符号;不显示运算结果,最后一次性输出 46 | 按方向键 ⬆️可寻找上一条指令(command) 47 | 48 | who ———— 查看工作区(workspace)中所有的变量 49 | whos ———— 查看工作区中所有的变量及其具体信息 50 | help * ———— 查看对*的帮助文档 51 | iskeyword ———— 查看所有的关键字 52 | clear * ———— 把*的定义和信息清空 53 | clear ———— 清空工作区中所有变量 54 | clc ———— 清空命令行窗口(command windows)中所有已显示内容 55 | format * ———— 将输出结果的格式更改为* 56 | -------------------------------------------------------------------------------- /part 2: -------------------------------------------------------------------------------- 1 | 在Matlab中,中括号[]的作用是宣告矩阵或者向量 2 | 3 | 定义向量 4 | A=[1 2 3 4] 行向量(row vector) 5 | B=[1;2;3;4] 列向量(column vector) 6 | A*B计算内积,B*A计算外积 7 | 组合起来定义矩阵(matrix) 8 | C=[1 2;3 4;5 6] 9 | 查找矩阵a任意位置的数值,使用a(2,1),输出结果3;使用a(3)输出5 10 | 11 | 用分号便捷输出(colon operator)等差级数 12 | 如要输出从1到100的行矩阵,只需要: 13 | a=[1:100] 14 | 如果等差为2,不输出行矩阵而是数列,可改为: 15 | b=1:2:99 16 | 还可以在输出字符的时候将其看为广义的等差级数如: 17 | c='a':2:'z' 18 | 19 | 分号在Matlab中还可以被看作“全部”来处理。如使用 20 | C(3,:) 21 | 输出结果为5 6,即把矩阵C第三行的数值全部输出 22 | 23 | 删除矩阵的一行: 24 | C(3,:)=[] 25 | 则把C矩阵的第三行全部删除,同理可以删除第二列: 26 | C(:,2)=[] 27 | 使用F=[A B]来组合矩阵也可以 28 | 29 | 矩阵运算: 30 | 除了正常的+,-,*,/及^外,还有点乘.*和点除./及点幂.^ 31 | 如[3 5].^[2 4]=[3^2 5^4] 32 | 33 | 一些特殊矩阵: 34 | eye(n):一个n*n的单位矩阵 35 | zeros(n1,n2):一个n1*n2的零矩阵 36 | ones(n1,n2):一个n1*n2所有元素为1的矩阵 37 | diag([2 3 4]):对角线元素为2,3,4其他元素为0的矩阵 38 | 39 | 一些矩阵特殊值的查找: 40 | max(A)矩阵A中的最大元素 41 | min(A)矩阵A中的最小元素 42 | sum(A)分别输出矩阵A每一列元素的和 43 | mean(A)矩阵A中所有元素的平均值 44 | 45 | 矩阵值的操作: 46 | sort(A)将矩阵A每一列从小到大排列后输出矩阵A 47 | sortrows(A)将矩阵A的每一行按第一列的元素从小到大重新排列(第一列中最小元素的那一行成为第一行) 48 | size(A)输出矩阵的row和colunm数量 49 | length(A) 50 | find(A==*)查找矩阵A中数值等于5的数值所在位置 51 | 52 | A(row,column) ———— 输出矩阵A第row行第column列的数值 53 | A(*) ———— 输出矩阵A从上到下,从左到右顺位第*个位置的数值(先竖在横) 54 | A([row1 col1],[row2 col2]) ——— 按矩阵A第row1行第col1列的行值和row2行col2列的列值输出A矩阵内容 55 | A([1 3;2 3]) ———— 输出矩阵1位置和3位置的数值为第一行,矩阵2位置和3位置为第二行的矩阵 56 | A(*)=[#] ———— 对矩阵A任意位置赋值# 57 | A 58 | -------------------------------------------------------------------------------- /part 3: -------------------------------------------------------------------------------- 1 | matlab脚本一般被保存为.m形式,matlab依照行顺序执行脚本程序 2 | 脚本命名限制:不能以数字开头,大小写有差别 3 | 可以通过%进行把改行改为注解而不执行,通过%%将程序分块执行,只执行两个%%符号之间的脚本 4 | 5 | 编写脚本的一些小tips: 6 | 每次编写和修改前使用clear all和close all指令来清楚所有变量的记忆值和所有图形,以及用clc清空命令台 7 | 在不希望执行结果被显示的语句后加 ; 符号 8 | 使用 ... 在语句结尾来换行 9 | 执行程序宕机时用ctrl+c来强制停止继续执行(matlab左下角持续显示busy时大概率宕机了) 10 | 11 | 结构化程序语言: 12 | if,elseif,else 13 | for 14 | switch,case 15 | while 16 | break 17 | continue 18 | end 19 | pause 20 | return 21 | 22 | 逻辑判断语言: 23 | <,<=,>,>=,==,~=(≠),&&(且),||(或) 返回值只有1(true)和0(false)两种情况 24 | 25 | 【if,elseif,else】 26 | if condition1 %condition是判断,statement是执行 27 | statement1 28 | elseif condition2 %如果if的判断结果为false,且elseif的判断结果为true,则执行statement2 29 | statement2 30 | else %如果if和elseif的判断结果都为false,则执行else下的内容 31 | statement3 32 | end 33 | 34 | 【for】 35 | for variable=start:increment:end %从变量为start的值开始,步长为increment,一直执行直到变量值为end为止 36 | commands %根据步长跳过的值会被记录为0,如果想不显示0,可以最后disp(variable(start:increment:end)) 37 | end 38 | 39 | 【switch】 40 | switch expression %以expression的变量,检测其对应哪个case代表的值,来决定执行什么操作 41 | case value1 42 | statement1 43 | case value2 44 | statement2 45 | otherwise 46 | statement 47 | end 48 | 49 | 【while】 50 | while condition %一直执行statement直到condition结果为false 51 | statement %(当condition为false时,statement不会再执行一次,直接end!) 52 | end 53 | 54 | 【例1】 55 | for i=1:10 56 | x=linspace(0,10,101); 57 | plot(x,sin(x+i)); 58 | print(gcf,'-deps',strcat('plot',num2str(i),'.ps')); 59 | end 60 | 【例2】 61 | input_num=1; 62 | switch input_num 63 | case -1 64 | disp('negative 1'); 65 | case 0 66 | disp('zero'); 67 | case 1 68 | disp('positive 1'); 69 | otherwise 70 | disp('other value'); 71 | end 72 | 【例三】 73 | tic %(tic-toc)指令用于计算运行该程序所需要的时间 74 | A=zeros(2000,2000); %预宣告(为了节约程序计算的时间,在程序中预先宣告变量的规模) 75 | for ii=1:size(A,2) 76 | for jj=1:size(A,2) 77 | A(ii,jj)=ii+jj 78 | end 79 | end 80 | toc 81 | -------------------------------------------------------------------------------- /part 4: -------------------------------------------------------------------------------- 1 | 可以使用edit(which(function.m))指令打开matlab内置函数function的脚本查看 2 | 内置函数的function name都和file name一致 3 | 4 | 此处以内置均值函数为例,一个完整的函数脚本应该有: 5 | function y = mean(x) 一定要有‘function’作为关键字,y是output,mean是function name,x是input 6 | %MEAN函数,用于计算平均值或期望值 写注解是好习惯! 7 | …… 8 | if nargin==2 && ischar(dim) 函数脚本的code 9 | flag = dim 10 | elseif nargin < 3 11 | flag = 'default'; 12 | …… 13 | 14 | 函数指针 15 | 可以利用指针,直接将某个变量指向某个特定函数 16 | 这样可以在后面直接使用该变量作为函数 17 | 一般形式是: 函数句柄 = @(输入变量) 输出变量 18 | 19 | 【例1】计算自由落体的坐标 20 | function x = freebody(x0,v0,t) 21 | %计算从x0位置,以初速度v0下落t时间后的位置坐标 22 | x = x0 + v0.*t + 1/2*9.8*t.*t; 23 | %在这里使用点乘是为了方便同时计算多组数据得到结果 24 | 【例2】 25 | function [a F] = acc(v2,v1,t2,t1,m) 26 | %计算匀变速直线运动中的加速度及合外力大小 27 | a = (v2-v1)./(t2-t1); 28 | F = m.*a; 29 | 30 | [Acc Force] = acc(20,10,5,4,1) 31 | %为得到相应的output,input也要用函数脚本中的形式给出 32 | 【例3】 33 | f = @(x) exp(-2*x); 34 | %这里的@(x)指明input,并将f指向函数exp(-2*x) 35 | x = 0:0.1:2; 36 | plot(x,f(x)); 37 | -------------------------------------------------------------------------------- /part 5: -------------------------------------------------------------------------------- 1 | 【plot】 2 | plot(x,y)用于把每个(x,y)绘制到坐标轴上连接成图像 3 | plot(y)默认从x=0开始绘制横坐标依次为1,2,……的图像 4 | plot(y,'str')可用于更改默认图像上的元素,部分如下: 5 | .绘制点图 *点图变为六星图标 X点图变为x图标 o点图变为空心圆图标 6 | -绘制虚线图 --更密的虚线图 :密集点轨迹图 -.虚线+密集点轨迹图 7 | k黑线 b蓝线 c青线 g绿线 r红线 w白线 y黄线 8 | 9 | title('')用于添加图像标题 10 | xlabel('')用于添加x轴的标签,要打出π可以在Matlab中使用“\pi”,打出指数可以用e^{x}得到特殊字源 11 | 12 | 【例1】 13 | hold on %hold指令用于在同一坐标轴上同时绘制多个轨迹图像 14 | plot(cos(0:pi/20:2*pi),'or--'); 15 | plot(sin(0:pi/20:2*pi),'xg.'); 16 | hold off 17 | 【例2】 18 | x=0:0.5:4*pi; 19 | y=sin(x);h=cos(x);w=x; 20 | plot(x,y,'bd-',x,h,'gp:',x,w,'ro-'); %多个函数图像呈现在一个图中也可以用一个plot指令解决 21 | legend('sin(x)','cos(x)','f(x)'); %legend指令用于添加图例 22 | -------------------------------------------------------------------------------- /picture_AsianMC.m: -------------------------------------------------------------------------------- 1 | %绘制亚式期权价格和仿真参数的关系 2 | p1=zeros(1001,1); 3 | %构建空矩阵存放蒙特卡洛模拟出的值 4 | for i=100:1:1100 5 | p1(i)=AsianMC(S0,r,T,sigma,pf,N,M,isA); 6 | end 7 | plot(p1(100:1100)); 8 | xlabel('M'); 9 | ylabel('p'); 10 | title('亚式期权价格与仿真参数的关系'); -------------------------------------------------------------------------------- /picture_stock.m: -------------------------------------------------------------------------------- 1 | T=Untitled; 2 | %此处输入要使用的table变量名,记得把table改成n*2的形式 3 | TT=table2timetable(T,'Rowtimes','data'); 4 | %在data处输入table内时间序列的变量名称 5 | candle(TT); 6 | %画蜡烛图 7 | index=rsindex(TT); 8 | plot(index,Time,index.RelativeStrengthIndex); 9 | %画RSI图 10 | [MACDLine,signalLine]=macd(TT); 11 | plot(MACDLine.Time,MACDLine.Close,signalLine.Time,signalLine.Close); 12 | legend('MACDLine','NinePerMA'); 13 | %画MACD图 -------------------------------------------------------------------------------- /usabyfd.m: -------------------------------------------------------------------------------- 1 | function price=AMDownPDE(T,S0,K,sigma,r,N,M) 2 | %显格式有限差分求美式看跌的价格 3 | %14917118 何祎航 4 | dt=T/N; 5 | ds=(K+S0)/M; 6 | %确定股票价格步长和时间步长,估计价格越接近理论真实值 7 | tf=@(i) i*dt; 8 | sf=@(j) S0+j*ds; 9 | %根据已知条件计算不变参数 10 | price=zeros(N+1,M+1); 11 | p2=zeros(N+1,M+1); 12 | ex=zeros(1,M+1); 13 | %预宣告,节约计算时间 14 | for j=0:M 15 | pf=@(x) max(K-x,0); 16 | %美式看跌期权的边界条件 17 | price(end,j+1)=pf(sf(j)); 18 | %到期日当天最后阶段的情况生成 19 | end 20 | uf=@ 21 | df=@ 22 | % 23 | for i=0:N-1 24 | price(i+1,end)=uf(tf(i),sf(M)); 25 | price(i+1,1)=df(tf(i),sf(0)); 26 | end 27 | for i=N-1:-1:0 28 | for j=1:M-1 29 | price(i+1,j+1)=price(i+2,j+1)/(r*dt+1)+dt/(r*dt+1)*(r*sf(j)*(price(i+2,j+2)-... 30 | price(i+2,j))/(2*ds)+0.5*sigma^2*sf(j)^2*((price(i+2,j+2)+price(i+2,j)... 31 | -2*price(i+2,j+1))/ds^2)); 32 | %利用边界条件解该方程 33 | ex(j+1)=pf(sf(j+1)); 34 | end 35 | end 36 | for i=N-1:-1:0 37 | for j=1:M-1 38 | if price(i+1,j+1)<=ex(j+1) 39 | price(i+1,j+1)=ex(j+1); 40 | p2(i+1,j+1)=ex(j+1); 41 | %从后往前迭代计算不同时间点的价值 42 | end 43 | end 44 | end --------------------------------------------------------------------------------