Friends, please use this version (still very raw) of the function code for good results. It works well for very high volatilities for cev .55, .65 or even .75. Mostly until 1D density of Ydecorr remains stable.
Start with zeros on first row of YCoeffHH(1,:) of Ydecorr (Decorrelated part of Y). (This first row will be later replaced with correlated part of Y from Zx)
Start with one dimensional Hermite-Series (YdCoeffH(2:6)) on first column of 2D Hermite-Series YCoeffHH(2:6,1) of Ydecorr (Decorrelated part of Y).
Start with zeros in the rest of the body of YCoeffHH of Ydecorr.
Please do not use any 2D least squares regression that we were previously using. Just start iterations from the initial guess as described in above few lines.
YdCoeffZ,YdCoeffH are arguments from one dimensional Z-series and Hermite-Series of Ydecorr.
MomentsYX0 are cross moments between Ydecorr and X.
Even if you have another good working program, be sure to include the following lines from this function. These lines mean that 2D hermite series variance(actually SD) of any row is not allowed to increase the 1D Variance of that hermite polynomial of Y from YdCoeffH. It is only allowed to increase by a very small factor of .005 as in 1.005.
YSD(nn)=sqrt(YCoeffHHnew(nn,1).^2+YCoeffHHnew(nn,2).^2+YCoeffHHnew(nn,3).^2*2+YCoeffHHnew(nn,4).^2*6+YCoeffHHnew(nn,5).^2*24+YCoeffHHnew(nn,6).^2*120);
if(YSD(nn)>YdCoeffH(nn)*1.005)
YCoeffHHnew(nn,:)=YCoeffHHnew(nn,:).*YdCoeffH(nn)./YSD(nn)*1.005;
end
.
.
.
Code: Select all
function [YCoeffHH,ObjFunc] = HSeriesCoeffsFromCrossMomentsIterative2D2nd(YCoeffHH,XCoeffZ,MomentsYX0,YdCoeffZ,YdCoeffH,MaxIter,w2D)
SeriesOrder=6;
NMoments=6;
Order=5;
VarY(2:Order+1)=0.0;
for nn=2:Order+1
VarY(nn)=YCoeffHH(nn,1).^2+YCoeffHH(nn,2).^2+YCoeffHH(nn,2).^2*2+YCoeffHH(nn,4).^2*6+YCoeffHH(nn,5).^2*24+YCoeffHH(nn,6).^2*120;
if(VarY(nn)>YdCoeffH(nn)^2)
YCoeffHH(nn,1:Order+1)=YCoeffHH(nn,1:Order+1).*sqrt(YdCoeffH(nn).^2./VarY(nn));
end
end
%[YdMoments]=CalculateMomentsOfZSeries(YdCoeffZ(1),YdCoeffZ(2:6),5,6);
% %Below, we calculate first and 2nd moment of 2D Hermite series
% [MeanHH,M2HH] = CalculateMeanAndVarOf2DHSeriesY(YCoeffHH,Order,Order);
% %VarHH is model variance .
% VarHH=M2HH-MeanHH.^2;
% %VarIn is input variance
% VarIn=YMoments(2)-YMoments(1).^2;
% %Variance correction is applied below to all rows but not to first row of hermite series.
% %YCoeffHH(2:6,1:6)=YCoeffHH(2:6,1:6).*sqrt(VarIn/VarHH);
% %YCoeffHH(1,2:6)=YCoeffHH(1,2:6).*sqrt(VarIn/VarHH);
% %We convert final 2D Hermite series to 2D Z-series
[YCoeffZZ] = Convert2DHermitesInto2DSeriesNew(YCoeffHH,Order,Order);
for nn=1:SeriesOrder
for mm=1:SeriesOrder
DeltaX(nn,mm)=.00125*2/(factorial(nn+1))/(factorial(mm+1));%/2^((nn-1)/2)/2^((mm-1)/2);
DeltaXMax(nn,mm)=DeltaX(nn,mm)*10;
end
end
ObjFunc1=0;
ObjFunc2=0;
%%%Weights on objective function that shows fit to moments
w2D(NMoments,NMoments)=1;
for nn=NMoments-1:-1:1
for mm=NMoments-1:-1:1
w2D(nn,mm)=w2D(nn+1,mm+1)*(nn+1).^0*(mm+1).^0;
end
end
[AMat] = CalculateCrossMomentsofTwo2Dand1DZSeries(YCoeffZZ,XCoeffZ,Order,Order);
[BMat] = CalculateMomentsOf2DZSeriesY(YCoeffZZ,Order,Order,Order+1);
for pp1=1:Order+1
for qq1=1:Order+1
Moments2D(pp1,qq1)=AMat((pp1-1)*(Order+1)+qq1,1);
Moments2D0(pp1,qq1)=MomentsYX0((pp1-1)*(Order+1)+qq1,1);
end
% Moments1D(pp1)=AMat((Order+1)*(Order+1)+pp1,1);
end
[ObjFuncBest] = CalculateObjMoment2D1D(Moments2D0,Moments2D,w2D,Order+1,Order+1);
%ObjFuncBest=ObjFuncBest+sum((BMat-YdMoments).^2);
%[ObjFuncBest] = CalculateObjMoment(sMu,Moments,w,mOrder);
ObjFuncBest
str=input("Look objFuncBest");
%cBest=c;
ImproveFlag(1:SeriesOrder,1:SeriesOrder)=1;
ImproveFlagPrev(1:SeriesOrder,1:SeriesOrder)=0;
ImproveCount(1:SeriesOrder,1:SeriesOrder)=0;
SeriesOrderM=6;
kk=0;
while ((kk<MaxIter)&&(ObjFuncBest>.001))
kk=kk+1;
%We only iteratively alter c(2:7), first and second moments are
%retrieved automatically in our set up
for nn=2:6%SeriesOrder
for mm=1:6%SeriesOrder
if((nn==1))
% ;
else
ImproveFlagPrev(nn,mm)=ImproveFlag(nn,mm);
YCoeffHHnew=YCoeffHH;
YCoeffHHnew(nn,mm)=YCoeffHHnew(nn,mm)+DeltaX(nn,mm);
YSD(nn)=sqrt(YCoeffHHnew(nn,1).^2+YCoeffHHnew(nn,2).^2+YCoeffHHnew(nn,3).^2*2+YCoeffHHnew(nn,4).^2*6+YCoeffHHnew(nn,5).^2*24+YCoeffHHnew(nn,6).^2*120);
if(YSD(nn)>YdCoeffH(nn)*1.005)
YCoeffHHnew(nn,:)=YCoeffHHnew(nn,:).*YdCoeffH(nn)./YSD(nn)*1.005;
end
%
% if(nn>1)
% VarY(nn)=YCoeffHHnew(nn,1).^2+YCoeffHHnew(nn,2).^2+YCoeffHHnew(nn,2).^2*2+YCoeffHHnew(nn,4).^2*6+YCoeffHHnew(nn,5).^2*24+YCoeffHHnew(nn,6).^2*120;
% if(VarY(nn)>1.15^2*YdCoeffH(nn).^2)
% YCoeffHHnew(nn,1:Order+1)=YCoeffHHnew(nn,1:Order+1).*sqrt(YdCoeffH(nn).^2./VarY(nn))*1.15;
% end
% end
%Below, we calculate first and 2nd moment of 2D Hermite series
% [MeanHH,M2HH] = CalculateMeanAndVarOf2DHSeriesY(YCoeffHHnew,Order,Order);
%VarHH is model variance .
% VarHH=M2HH-MeanHH.^2;
%VarIn is input variance
% VarIn=YMoments(2)-YMoments(1).^2;
%Variance correction is applied below to all rows but not to first row of hermite series.
% YCoeffHHnew(2:6,1:6)=YCoeffHHnew(2:6,1:6).*sqrt(VarIn/VarHH);
% YCoeffHHnew(1,2:6)=YCoeffHHnew(1,2:6).*sqrt(VarIn/VarHH);
%We convert final 2D Hermite series to 2D Z-series
[YCoeffZZnew] = Convert2DHermitesInto2DSeriesNew(YCoeffHHnew,Order,Order);
[AMat] = CalculateCrossMomentsofTwo2Dand1DZSeries(YCoeffZZnew,XCoeffZ,Order,Order);
for pp1=1:Order+1
for qq1=1:Order+1
Moments2D(pp1,qq1)=AMat((pp1-1)*(Order+1)+qq1,1);
Moments2D0(pp1,qq1)=MomentsYX0((pp1-1)*(Order+1)+qq1,1);
end
end
[ObjFunc1] = CalculateObjMoment2D1D(Moments2D0,Moments2D,w2D,Order+1,Order+1);
[BMat] = CalculateMomentsOf2DZSeriesY(YCoeffZZnew,Order,Order,Order+1);
%ObjFunc1=ObjFunc1+sum((BMat-YdMoments).^2);
[DValue1] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,-3.0,Order);
[DValue2] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,3.0,Order);
[DValue3] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,-2.5,Order);
[DValue4] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,2.5,Order);
[DValue5] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,-2.0,Order);
[DValue6] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,2.0,Order);
DFlag1=(DValue1>0)&&(DValue2>0)&&(DValue3>0)&&(DValue4>0)&&(DValue5>0)&&(DValue6>0);
[DValue1] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,-3.0,Order);
[DValue2] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,3.0,Order);
[DValue3] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,-2.5,Order);
[DValue4] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,2.5,Order);
[DValue5] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,-2.0,Order);
[DValue6] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,2.0,Order);
DFlag2=(DValue1>0)&&(DValue2>0)&&(DValue3>0)&&(DValue4>0)&&(DValue5>0)&&(DValue6>0);
%DValue1=1;
%DValue2=1;
%DFlag1=1;
%DFlag2=1;
if((ObjFunc1<ObjFuncBest)&&(DFlag1==1)&&(DFlag2==1))
%if(ObjFunc1<ObjFuncBest)
ObjFuncBest=ObjFunc1;
YCoeffHH=YCoeffHHnew;
ImproveFlag(nn,mm)=1;
else
YCoeffHHnew=YCoeffHH;
YCoeffHHnew(nn,mm)=YCoeffHHnew(nn,mm)-DeltaX(nn,mm);
YSD(nn)=sqrt(YCoeffHHnew(nn,1).^2+YCoeffHHnew(nn,2).^2+YCoeffHHnew(nn,3).^2*2+YCoeffHHnew(nn,4).^2*6+YCoeffHHnew(nn,5).^2*24+YCoeffHHnew(nn,6).^2*120);
if(YSD(nn)>YdCoeffH(nn)*1.005)
YCoeffHHnew(nn,:)=YCoeffHHnew(nn,:).*YdCoeffH(nn)./YSD(nn)*1.005;
end
%
% if(nn>1)
% VarY(nn)=YCoeffHHnew(nn,1).^2+YCoeffHHnew(nn,2).^2+YCoeffHHnew(nn,2).^2*2+YCoeffHHnew(nn,4).^2*6+YCoeffHHnew(nn,5).^2*24+YCoeffHHnew(nn,6).^2*120;
% if(VarY(nn)>1.15^2*YdCoeffH(nn).^2)
% YCoeffHHnew(nn,1:Order+1)=YCoeffHHnew(nn,1:Order+1).*sqrt(YdCoeffH(nn).^2./VarY(nn))*1.15;
% end
% end
%Below, we calculate first and 2nd moment of 2D Hermite series
% [MeanHH,M2HH] = CalculateMeanAndVarOf2DHSeriesY(YCoeffHHnew,Order,Order);
%VarHH is model variance .
% VarHH=M2HH-MeanHH.^2;
%VarIn is input variance
% VarIn=YMoments(2)-YMoments(1).^2;
%Variance correction is applied below to all rows but not to first row of hermite series.
% YCoeffHHnew(2:6,1:6)=YCoeffHHnew(2:6,1:6).*sqrt(VarIn/VarHH);
% YCoeffHHnew(1,2:6)=YCoeffHHnew(1,2:6).*sqrt(VarIn/VarHH);
%We convert final 2D Hermite series to 2D Z-series
[YCoeffZZnew] = Convert2DHermitesInto2DSeriesNew(YCoeffHHnew,Order,Order);
[AMat] = CalculateCrossMomentsofTwo2Dand1DZSeries(YCoeffZZnew,XCoeffZ,Order,Order);
for pp1=1:Order+1
for qq1=1:Order+1
Moments2D(pp1,qq1)=AMat((pp1-1)*(Order+1)+qq1,1);
Moments2D0(pp1,qq1)=MomentsYX0((pp1-1)*(Order+1)+qq1,1);
end
end
[ObjFunc2] = CalculateObjMoment2D1D(Moments2D0,Moments2D,w2D,Order+1,Order+1);
[BMat] = CalculateMomentsOf2DZSeriesY(YCoeffZZnew,Order,Order,Order+1);
% ObjFunc2=ObjFunc2+sum((BMat-YdMoments).^2);
[DValue1] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,-3.0,Order);
[DValue2] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,3.0,Order);
[DValue3] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,-2.5,Order);
[DValue4] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,2.5,Order);
[DValue5] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,-2.0,Order);
[DValue6] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,-3.0,2.0,Order);
DFlag1=(DValue1>0)&&(DValue2>0)&&(DValue3>0)&&(DValue4>0)&&(DValue5>0)&&(DValue6>0);
[DValue1] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,-3.0,Order);
[DValue2] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,3.0,Order);
[DValue3] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,-2.5,Order);
[DValue4] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,2.5,Order);
[DValue5] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,-2.0,Order);
[DValue6] = EvaluateDerivativeOf2DZSeries(YCoeffZZnew,3.0,2.0,Order);
DFlag2=(DValue1>0)&&(DValue2>0)&&(DValue3>0)&&(DValue4>0)&&(DValue5>0)&&(DValue6>0);
%DValue1=1;
%DValue2=1;
%DFlag1=1;
%DFlag2=1;
if((ObjFunc2<ObjFuncBest)&&(DFlag1==1)&&(DFlag2==1))
% if(ObjFunc2<ObjFuncBest)
ObjFuncBest=ObjFunc2;
YCoeffHH=YCoeffHHnew;
ImproveFlag(nn,mm)=-1;
else
ImproveFlag(nn,mm)=0;
end
end
end
end
end
if(rem(kk,1)==0)
kk
ObjFunc1
ObjFunc2
ObjFuncBest
DeltaX
ImproveCount
end
ImproveFlag0=0;
for nn=1:SeriesOrder
for mm=1:SeriesOrder
if(ImproveFlag(nn,mm)==0)
DeltaX(nn,mm)=DeltaX(nn,mm)*.88;
%ImproveFlag0=1;
end
if((ImproveFlag(nn,mm)==1)||(ImproveFlag(nn,mm)==-1))
DeltaX(nn,mm)=DeltaX(nn,mm)*1.1;
%ImproveFlag0=1;
end
if(DeltaX(nn,mm)>DeltaXMax(nn,mm))
DeltaX(nn,mm)=DeltaXMax(nn,mm);
end
end
end
end
ObjFunc=ObjFuncBest;
end