NAVER

질문 몬테카를로 기법
over**** 조회수 13,901 작성일2008.04.09

몬테카를로 기법을 Matlab을 통해 적용한 구체적 문제 풀이 예와 그 설명이 필요해요

 

원래 제가 해야되지만 Matlab도 어떻게 해야되는지 잘모르겠고 시간이 부족하고 힘들어요

 

딱 한가지 예시만 들어주세요 부탁합니다(예시가 간단해도 됩니다)(ex pi구하기)

프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
탈퇴한 사용자 답변

시나리오분석과는 달리 몬테카를로 시뮬레이션방법은 변수들이 취할수 있는 모든 가치를 고려할 수 있으며, 또한 상관관계도 완벽하게 반영할 수 있습니다.

이 방법은 목표일의 포트폴리오 가치를 여러 다양한 상황에서 평가하고자 하는 기법으로서 유연성이 우수하여 현재까지 VaR를 계산하는 방법 중에서 가장 효과적 방법으로 평가되고 있습니다.

이 방법은 다양한 위험, 즉 가격위험, 변동성위험, 신용위험 등을 고려 할 수 있습니다.

다양한 위험을 고려함으로써 가장 다루기 어려운 위험은 모형위험까지도 고려할수 있으므로 재무위험을 측정하는 가장 종합적인 분석방법이라고 할 수 있습니다.

그러나 이 방법을 자체 개발하는 것은 하드웨어의 가격이 급속히 하락하고 있음에도 불구하고 매우 어렵고
막대한 개발비가 소요되고 있으며 결과의 검증이 매우 어렵습니다.
VaRworks 는 비선형 가격위험, 변동성위험, 그리고 모형위험까지를 포함하는 다양한 유형의 위험을 고려하여 포트폴리오를 위해 완전한 몬테카를로 시뮬레이션을 지원합니다.

VaR 와 VaR 표준오차, 시장가격, 기대가치(평균), 포트폴리오 수익률의 분산 표준편차를 계산하고,

전체 몬테카를로 분포가 보기 쉬운 차트로 보여지게 됩니다.

주택저당채권과 같이 옵션의 성격을 많이 내포하고 있는 포트폴리오의 경우
몬테카를로 시뮬레이션과 같은 완전가치평가방법이 적절합니다.

파이 구하기는

 

설명 http://www.modula2.org/projects/pi_by_montecarlo.php

가로 세로가 각각 R인 정사각형을  생각할 때
이 사각영역 안에는 대략 R*R(정확히는 (R+1)*(R+1)이지만 R을 무한히 크게한다면
 (R+1)/R == 1 이됩니다)개의 점들이 존재합니다.

이 사각영역안에 있는 점좌표를 (X,Y)라고 한다면
0 <= X <= R, 0 <= Y <= R 인 조건을 만족하는 점들일 것입니다.

 

난수 발생기를 사용해서 위 조건을 만족하는 X,Y값을 생성하여
해당 좌표에 점들을 찍는다면
사각 영역안에 존재하는 모든 점들 각각이 선택될 확률은 모두
같고 1/(사각영역안의 점의 수)이 될 것입니다.

 

이 때 이 정사각형 영역안에 사분원(四分圓)을 생각한다면 

사각영역안의 점들의 수만큼의 횟수에 걸쳐

난수로 좌표를 생성하여 점들을 찍는다고 한다면


이론적으로는 이 사분원의 넓이크기만큼 수의 점들이
이 사분원 안에 찍힐 것을 기대할 수 있습니다.

 

실제로는 난수로 발생된 한쌍의 좌표 (X,Y)가

사분원안에 존재하는지여부( X^2 + Y^2 <= R*R)를 검사하여
그 수 n를 계수(카운트)하면 아래와 같은 식이 성립합니다.

 

사분원 안에 찍힌 점의수(=n) / 난수발생회수(=N) = 사분원의 넓이(=s) / 정사각형의

넓이(=S)


s = PI*R*R/4, S = R*R
n/N = s / S = PI/4


PI에 관하여 풀면
PI = 4*n/N 이라는 식을 얻게 되어서 PI계산이 가능하게됩니다.

*/

 

#include "stdio.h"
#include "time.h"
#include "stdlib.h"

 

// 흐름도는 아래 #의 순번을 참고하시기를 바랍니다.
int main(void)
{
   int R, R2, X, Y;
   double PI;

   int N, n;
   int i;
   int query;

 

   // 초기화
   srand( (unsigned int)time(NULL) );

   while( 1 )
   {
      // #1. 입력
      n = 0;
      printf( "\n정사각 영역의 크기 R 입력 : " );
      scanf( "%d", &R );
      R2 = R*R;

      printf( "시행 횟수 N 입력          : " );
      scanf( "%d", &N );

 

      // #2. 계산
      // N회에 걸쳐 난수발생으로 점좌표(X,Y)를 생성합니다.
      for( i = 0; i < N; i++ )
      {
         X = rand() % (R+1);  // 0부터 R
         Y = rand() % (R+1);

 

         // 그 좌표가 사분원안에 존재하는지를 검사하고 카운트합니다.
         if( X*X + Y*Y <= R2 )
            n++;
      }

 

      // #3. 출력( 시행으로 얻어진 결과값을 이용하여 PI값을 계산합니다. )
      PI = 4. * n / N;
      printf( "사각형 R : %d, 시행회수 : %d일 때 PI = %lf\n", R, N, PI );

      printf( "종료하시려면 Q/q키를 계속하시려면 그 밖의 아무키나 누르십시오 : " );
      fflush(stdin);

 

      if( (query = getchar())==(int)'Q' || query == (int)'q' )
       break;
   }
  return 0;
 }

 

/*

실행예 ( 시행횟수(반복회수) N의 크기를 증가하면서 테스트한 결과 )

 

function fname

NUM=1000;
in=0;
for i=1:NUM
    x(i)=rand();
    y(i)=rand();
    if((x(i)^2+y(i)^2)<=1)
        in = in +1;
    end
end
pai = 4.*in./NUM;
        disp('pi = ');
        disp(pai);
       
 ezplot('x^2+y^2-1')
 axis equal;
 hold on
 plot(x,y,'r:')
 axis([0 1 0 1]);

 

===========================================

% 또 다른 방법

 

function monte(NUM)

 

a=rand(NUM,2);
b=sqrt(a(:,1).^2+a(:,2).^2);
c=find(b<1);
d=length(c);
phi=4*(d/NUM)

 

ezplot('x^2+y^2-1')
axis equal;
hold on
plot(a(:,1),a(:,2),'r:')
axis([0 1 0 1]);

2008.04.10.

  • 채택

    질문자가 채택한 답변입니다.

도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.