我还必须记住分布的偏度和峰度,这些都必须反映在模拟值中。
我的经验值是过去的股票收益(非标准正态分布)。
是否有现有的软件包可以为我做到这一点?我在网上看到的所有包裹都只有前两个时刻。
我还必须记住分布的偏度和峰度,这些都必须反映在模拟值中。
我的经验值是过去的股票收益(非标准正态分布)。
是否有现有的软件包可以为我做到这一点?我在网上看到的所有包裹都只有前两个时刻。
您所描述的是使用矩方法来定义分布。这种方法在统计学中普遍失宠。但是,您可以签出pearsonrnd
,这可能会根据您的数据正常工作。
相反,我建议直接找到数据的经验 CDF,并将ecdf
其与逆采样结合使用以生成随机变量。这是一个可以做到这一点的基本功能:
function r=empiricalrnd(y,varargin)
%EMPIRICALRND Random values from an empirical distribution
% EMPIRICALRND(Y) returns a single random value from distribution described by the data
% in the vector Y.
%
% EMPIRICALRND(Y,M), EMPIRICALRND(Y,M,N), EMPIRICALRND(Y,[M,N]), etc. return random arrays.
[f,x] = ecdf(y);
r = rand(varargin{:});
r = interp1(f,x,r,'linear','extrap');
interp1
如果您愿意,您可以使用这些选项。这是一个快速测试:
% Generate demo data for 100 samples of log-normal distribution
mu = 1;
sig = 1;
m = 1e2;
rng(1); % Set seed to make repeatable
y = lognrnd(mu,sig,m,1);
% Generate 1000 random variates from data
n = 1e3;
r = empiricalrnd(y,n,1);
% Plot CDFs
ecdf(y);
hold on;
ecdf(r);
x = 0:0.1:50;
plot(x,logncdf(x,mu,sig),'g');
legend('Empirical CDF','CDF of sampled data','Actual CDF');