Simulating stock returns as normally distributed to run through a copula

2 次查看(过去 30 天)
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 个评论
Phillip McCart
Phillip McCart 2022-6-3
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
Kausthub 2024-1-31
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)?

请先登录,再进行评论。

回答(1 个)

Kausthub
Kausthub 2024-1-31
编辑:Kausthub 2024-1-31
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)
u = 1×5
0.0000 0.0013 0.0228 0.1587 1.0000
correlation_gaussian_kernel = copulafit('Gaussian', [u]);
Error using copulafit
U must contain values strictly between 0 and 1.
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!

类别

Help CenterFile Exchange 中查找有关 Probability Distributions 的更多信息

产品


版本

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by