2016-06-10 13 views
1

Ich muss auch die Schiefe und die Kurtosis der Verteilung berücksichtigen und diese müssen sich in den simulierten Werten widerspiegeln.Wie simuliere ich Renditen aus einer empirisch abgeleiteten Verteilung in MATLAB (oder Python)?

Meine Erfahrungswerte sind vergangene Aktienrenditen (Nicht-Standard-Normalverteilung).

Gibt es ein bestehendes Paket, das das für mich tun wird? Alle Pakete, die ich online sehe, haben nur die ersten zwei Momente.

+0

Per Definition, wenn es verzerrt ist, ist es nicht normal, wenn es normal ist, ist es nicht verzerrt. Also was ist es? Haben Sie darüber nachgedacht, Ihre empirischen Daten einfach zu erfassen? – pjs

+0

Es ist verzerrt. Ich kann die vier Momente aus meiner Probe perfekt herausfinden, aber ich habe Schwierigkeiten, eine Funktion zu finden, die die vier Momente als Argumente nimmt und mir eine Reihe von simulierten Werten gibt. Danke! –

Antwort

1

Was Sie beschreiben, ist die Verwendung der method of moments, um eine Verteilung zu definieren. Solche Methoden sind im Allgemeinen in der Statistik unbeliebt. Sie können jedoch pearsonrnd auschecken, was abhängig von Ihren Daten gut funktionieren kann.

Stattdessen würde ich empfehlen, die empirical CDF für die Daten mit ecdf direkt zu finden und diese in Verbindung mit inverse sampling zu verwenden, um Zufallsvariablen zu generieren. Hier ist eine grundlegende Funktion, die das tun:

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'); 

Sie können mit den Optionen für interp1 spielen, wenn Sie mögen. Und hier ist ein schneller Test:

% 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');