Charlotte324 / matlab-programming-and-numerical-method

1 stars 0 forks source link

雪球定价code #2

Open Charlotte324 opened 1 year ago

Charlotte324 commented 1 year ago
function SE=Compute_SE
day=243;     %总天数
p=0.5;       %增长概率
u=0.984901285;      %u
d=1.016551669;      %d
n=5000;       %总模拟次数
ynmax=1.05;   %敲出判定线
ynmin=0.8;   %敲入判定线
R=0.25;      %标准年化收益率
ob=[41,62,85,105,122,144,165,187,202,224,0]; %观察日
Switch=[64,93,126,154,187,217,246,279,307,338];%对应转化的敲出情况下的真实计息日期
y=zeros(n,day);  %变量初赋值
Bx=1:1:day;
S=zeros(2,n);
y(:,1)=12.97;%初始股价,即2020/4/30日的股价
ymax=ynmax*y(:,1);
ymin=ynmin*y(:,1);
k1=0;
k2=0;
k3=0;
A=[];
B=[];
for j=1:n
    m=1;
    Case=1; %Case记录状态:1为未敲入且未敲出,2为敲入且未曾敲出,3为敲出
    for i=1:day-1
        q=rand(1);
        if q<p
            y(j,i+1)=y(j,i)*u;%增长
        else
            y(j,i+1)=y(j,i)*d;%跌落
        end

        if (y(j,i+1)<ymin)%判定是否敲入
            Case=2;
        end

        %判定是否敲出
        if i==ob(m)&&Case~=3&&Case~=2

            if y(j,i+1)>ymax
                An=Switch(m);
                Case=3;
                A=[A,An];
            end
            m=m+1;
        end

    end
    %plot(Bx,y(j,:));%绘图
    %hold on;

    if Case==1
        S(1,j)=R*360/365;
        S(2,j)=1;
        k1=k1+1;
    elseif Case==2
        S(1,j)=-max(0,(y(1,1)-y(j,day))/y(1,1));
        S(2,j)=2;
        k2=k2+1;
        B=[B,S(1,j)];
    else
        S(1,j)=An*R/365;
        S(2,j)=3;
        k3=k3+1;
    end
    %xlabel('天');
    %ylabel('股价');
end

%disp(S);  %输出S状态矩阵
SE=mean(S(1,:)); %计算S期望
P1=k1/n;%未敲入敲出概率
P2=k2/n;%敲入概率
P3=k3/n;%敲出概率
averageAn=mean(A);%平均敲出天数
averageB=mean(B);%平均敲入收益(仅计算敲入的情况下的平均收益)
averagey243=mean(y(:,243));%最终股价均值
disp(P1);%输出未敲入且未敲出
disp(P2);%输出敲入概率
disp(P3);%输出敲出概率
disp(averageAn);%输出平均敲出天数
disp(averageB);%输出平均敲入收益
disp(averagey243);%输出最终股价均值

end