Simulating stock returns as normally distributed to run through a copula
Show older comments
I am trying to model stock index returns for 4 different indices as normally distributed, to then run these distributions through a copula to obtain their correlation structure. I keep encountering the error ,
Error using copulafit (line 75)
U must contain values strictly between 0 and 1.
I know this is because the normal cdf of each set of returns varies between [0,1] , but when I model the returns as having a kernel distribution, the code runs fine, so how do I get a normal distribution cdf estimate for each set of returns that is between (0,1), so that the returns are able to be inputted to copulafit.m ?
Here's the code for a normal distribution estimate, that doesn't work.
% returns_N(:,1234) = returns for each of the 4 indices
u= normcdf(returns_N(:,1),mean(returns_N(:,1)),std(returns_N(:,1)));
v= normcdf(returns_N(:,2),mean(returns_N(:,2)),std(returns_N(:,2)));
w= normcdf(returns_N(:,3),mean(returns_N(:,3)),std(returns_N(:,3)));
x= normcdf(returns_N(:,4),mean(returns_N(:,4)),std(returns_N(:,4)));
correlation_gaussian_normal = copulafit('Gaussian',[u v w x]);
%Error using copulafit (line 75)
%U must contain values strictly between 0 and 1.
Heres the code for a kernel distribution estimate, that works fine
u = ksdensity(returns_N(:,1),returns_N(:,1),'function','cdf');
v = ksdensity(returns_N(:,2),returns_N(:,2),'function','cdf');
w = ksdensity(returns_N(:,3),returns_N(:,3),'function','cdf');
x = ksdensity(returns_N(:,4),returns_N(:,4),'function','cdf');
correlation_gaussian_kernel = copulafit('Gaussian',[u v w x]);
3 Comments
Jeff Miller
on 11 Apr 2022
Change normcdf values of 0 to eps and of 1 to 1-eps?
Phillip McCart
on 3 Jun 2022
Did you ever find the answer to this?
I'm having a the same problem but I'm using ecdf instead of normcdf
[fx,~]=ecdf(x);
[fy,~]=ecdf(y);
u = [x,y];
[rhohat,nuhat,nuci]=copulafit(u)
Error using copulafit (line 75)
U must contain values strictly between 0 and 1.
I've verified that the values of fx and fy lie between 0 and 1 or are 0 and 1. I've tried deleting the zeroes and the beginning of fx, fy and same goes for the 1s and the end.
I'm so confused! U doesn't contain any values greater than 1 or less than zero!!
Kausthub
on 31 Jan 2024
Hi Phillip, shouldn't it be u = [fx,fy] instead of u = [x,y] since you have verified the values of fx and fy lie between (0,1)?
Answers (1)
Hi Pete and Phillip,
I understand that you are facing issues regarding the "normcdf" function. The range of "normcdf" and "ecdf" is [0,1] which is inclusive of both 0 and 1, whereas "copulafit" requires values strictly between (0,1) i.e., exclusive of both 0 and 1. Since, there is possiblity of "normcdf" and "ecdf" returning 0 or 1, the "copulafit" function errors when it recieves an input containing either of 0 or 1. For example:
x = [-2,-1,0,1,11];
mu = 2;
sigma = 1;
u = normcdf(x,mu,sigma)
correlation_gaussian_kernel = copulafit('Gaussian', [u]);
To solve to issue, as rightly suggested by Jeff you could try to subtract or add a small value (epsilon) to make 0 to 0+ and 1 to 1-.
Hope this helps!
Categories
Find more on Copula Distributions and Correlated Samples in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!