경험적 데이터에서 임의의 다변량 값 생성 분포가없는 실제 데이터

부분적으로 상관 관계가있는 수익으로 여러 자산을 평가하기 위해 Monte Carlo 함수를 작업 중입니다. 현재 공분산 행렬을 생성하고 rmvnorm()R 의 함수에 피드합니다 (상관 된 임의의 값 생성).

그러나 자산의 수익 분배를 보면 일반적으로 분배되지 않습니다.

이것은 실제로 두 부분으로 된 질문입니다.
1) 알려진 분포가없는 실제 데이터 일 때 PDF 또는 CDF를 어떻게 추정 할 수 있습니까?

2) rmvnorm과 같은 상관 값을 생성하지만이 알 수없는 (정규적이지 않은) 분포에 대해 어떻게 할 수 있습니까?

감사!


분포가 알려진 분포에 맞지 않는 것 같습니다. 파라 메트릭을 가정 한 다음 몬테카를로 추정에 사용하는 것이 매우 위험하다고 생각합니다.

내가 볼 수있는 일종의 부트 스트랩이나 “임시 몬테 카를로”방법이 없습니까?



답변

(1) 시뮬레이션 된 시계열을 생성하는 데 필요한 CDF입니다. 그것을 구축하려면 먼저 가격 변경 / 반품을 히스토그램으로 표시하십시오. 가장 왼쪽에있는 빈부터 시작하여 누적 된 빈 인구 집단을 가져옵니다. 총 빈 모집단으로 나누어 새 기능을 정규화하십시오. 남은 것은 CDF입니다. 트릭을 수행하는 몇 가지 numpy 코드는 다음과 같습니다.

# Make a histogram of price changes

counts,bin_edges = np.histogram(deltas,numbins,normed=False) # numpy histogram

# Make a CDF of the price changes

n_counts,bin_edges2 = np.histogram(deltas,numbins,normed=True)
cdf = np.cumsum(n_counts)  # cdf not normalized, despite above
scale = 1.0/cdf[-1]
ncdf = scale * cdf

(2) 상관 된 픽을 생성하려면 copula를 사용하십시오. 상관 시계열 생성에 대한 이전 질문에 대한 이 답변 을 참조하십시오 .


답변

첫 번째 질문과 관련하여 데이터 리샘플링을 고려할 수 있습니다. 데이터가 동시 적으로 상관되는 것이 아니라 시간이 지남에 따라 상관 된 경우 문제가있을 수 있으며,이 경우 블록 부트 스트랩과 같은 것이 필요합니다. 그러나 반환 데이터의 경우 간단한 부트 스트랩이 좋습니다.

두 번째 질문에 대한 답은 목표 분포에 크게 의존한다고 생각합니다.


답변

첫 번째 질문에 대한 답은 모델을 작성한다는 것입니다. 귀하의 경우 이는 분포를 선택하고 모수를 추정하는 것을 의미합니다.

분포가 있으면 Gibbs 또는 Metropolis 알고리즘을 사용하여 분포를 샘플링 할 수 있습니다.

참고로,이 분포에서 표본 추출해야합니까? 일반적으로 관심은 분포의 일부 특성에 있습니다. 부트 스트랩을 통한 경험적 분포를 사용하여 추정하거나이 특성에 대한 모델을 다시 작성할 수 있습니다.


답변

나는 또한 당신이 모델이 필요하다고 생각한다는 점에서 @mpiktas와 함께 있습니다.

여기에서 표준 방법은 다른 자산 사이의 의존성 구조를 포착하고 다른 자산에 대한 비정규 정규 분포 또는 t 분포 한계 분포를 사용하는 copula를 추정하는 것입니다. 그것은 당신에게 당신의 종류의 작업에 거의 표준 인 매우 일반적인 모델 클래스를 제공합니다 (예를 들어, 다변량 t- 분포를 가정하면 더 일반적입니다) . 있다 copulaR.위한 패키지


답변

ecdf()함수를 사용하여 R을 사용하여 질문의 첫 번째 부분에 가능한 대답

# simulate some data...
N <- 1000
fdata <- c( rnorm(N %/% 2, mean=14), rnorm(N %/% 2, mean=35))

# here's the Empirical CDF of that data...
E1 <- ecdf(fdata)
plot(E1)

# now simulate 1000 numbers from this ECDF...
ns <- 1000
ans <- as.numeric(quantile(E1, runif(ns)))
hist(ans,pro=T,nclass=113,col='wheat2')