cs

Intro.

나름 25년 새해 건강한 몸뚱아리로 살아보겠다고

필라테스를 채험 1일차 하고왔다.

정말 무거운 아령 드는게 더 쉬울것같다. 

선생님보고 진짜 뒤질것같은데요 했지만, 통하지 않는다. 

이게 맞냐고 물어보면 다 맞다고한다... 

 

암튼 결국 등록해버렸고, 고장난 몸뚱아리 찬찬히 고쳐나가보자..

건강해지는게 맞지?...

 


자 내가 왜 몬테카를로 시뮬레이션을 뜬금없이 가지고 왔느냐? 

 

예전에 데이콘에서 주식으로 끄적끄적 해봤을때, 모든걸 머신러닝과 퀀트를 통해서만 주식을 선별하고 또 비중까지 정하는 프로젝트를 진행했었다.

https://dacon.io/competitions/official/235914/codeshare/5703

 

머신러닝과 퀀트를 활용한 주식 포트폴리오 구성

제1회 KRX 금융 빅데이터 활용 아이디어 경진대회

dacon.io

(아직도 링크가 살아있다,, 정말 행복하게 했었다. GS님과 다시 찬찬히 해보고싶댜..)

 

암튼 이때 주식 포트폴리오를 구성할때 우리 팀이 사용했던 방식이 몬테카를로 시뮬레이션이고,

 

최근 포스팅처럼, 백테스팅한 나의 주식들의 비중을 어떻게 정하면 좋을까? 하다가 예전 기억을 떠올리며 다시 몬테카를로 시뮬레이션을 돌려보자 하여 적게 되었댜.

 

1.  몬테카를로 시뮬레이션란? (What is Monte Carlo Simulation?)

몬테카를로 시뮬레이션은 데이터 분석에서 확률적 데이터 기반 의사결정을 지원하는 강력한 방법론중 하나라고 생각한다.

대규모 샘플링을 통해 복잡한 시스템의 행동을 시뮬레이션하고, 불확실성을 수량화하며, 최적의 결정을 내리기 위한 통찰력을 제공할수 있기 때문이다.

  • 확률적 모델링: 불확실성이 존재하는 데이터를 모델링 가능
  • 반복적 시뮬레이션: 여러 시나리오를 반복적으로 실행하여 결과 분포를 분석가능
  • 근사값 계산: 복잡한 문제의 결과를 근사적으로 도출가능

 

위키의 말을 가지고 오자면,

몬테카를로 실험은 반복된 무작위 추출(repeated random sampling)을 이용하여 함수의 값을 수리적으로 근사하는 알고리즘을 부르는 용어이다.
수학이나 물리학 등에 자주 사용되며, 계산하려는 값이 닫힌 형식으로 표현되지 않거나 복잡한 경우에 근사적으로 계산할 때 사용된다.
몬테카를로 방법은 주로 확률 분포에서 확률 변수값을 생성하는 작업, 수학적 최적화, 수치적분 등에서 활용된다.
알고리즘의 반복과 큰 수의 계산이 관련되기 때문에 몬테카를로 방법은 다양한 컴퓨터 모의 실험 기술을 사용하여 컴퓨터로 계산하는 것이 적합하다.
....
 

몬테카를로 방법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 몬테카를로 방법(Monte Carlo method) 또는 몬테카를로 실험은 반복된 무작위 추출(repeated random sampling)을 이용하여 함수의 값을 수리적으로 근사하는 알고리즘을 부

ko.wikipedia.org

 

저 뜻은 그럼 내가 어떤것을 선택해야할지 모를때? 혹은 최적의 값을 여러 시뮬레이션을 통해 찾아준다고도 봐도 되겠다.

 

2 데이터 분석 관점에서의 몬테카를로 시뮬레이션 활용 

나름 데이터 분석 방법론이라는 관점에서 글을 쓰고있고, 어떻게 활용을 할 수 있을까아 고민을 해보면

 

데이터 분석에서 몬테카를로 시뮬레이션은 불확실성위험 관리를 다룰 때 특히 유용할 수 있을거다

 

예를 들어, 미래의 주식 가격, 비중, 프로젝트 완성 시간, 고객 행동 등을 예측할 때 사용될 것같다.

  1. 재무 데이터 분석:
    • 투자 포트폴리오 최적화, 옵션 가격 책정, 리스크 평가.
  2. 고객 행동 분석:
    • 고객 이탈 가능성, 구매 패턴 예측.
  3. 비즈니스 시나리오 분석:
    • 마케팅 캠페인의 성공 가능성, 생산 일정 최적화.
  4. A/B 테스트 결과 예측:
    • 특정 그룹에 대한 실험 결과의 장기적 효과 시뮬레이션.

 

3 수학적 로직과 데이터 분석 프로세스

수학적 로직
몬테카를로 시뮬레이션은 확률 분포에서 난수를 생성하고 반복적인 계산을 통해 결과를 분석한고, 데이터 분석 관점에서는 다음 과정을 따르게 된다:

  1. 문제 정의
    • 분석 대상의 불확실성을 정의
    • 예: 주식 비중, 수익률, 고객 유지율.
  2. 확률 분포 설정
    • 과거 데이터를 분석하여 변수의 분포를 설정 -> 과거 데이터가 핵심이라고 본다
    • 예: 정규 분포(수익률), 포아송 분포(고객 이벤트 발생).
  3. 난수 생성 및 시뮬레이션 실행
    • 확률 분포를 기반으로 난수를 생성하고
    • 이를 이용해 여러 시나리오를 반복 실행함
  4. 결과 분석
    • 반복 실행된 결과를 통계적으로 분석하여 평균, 분산, 신뢰 구간 등을 계산.. 
    • 의사결정을 위한 주요 지표를 도출 (각 상황마다 다르게)

예제 수식을....작성하고 첨부해볼까 하다가,, 내가 봐도 요즘 수식을 바로 이해하지 못하(머리가 굳어버리는 슬픈상황)는 상황이 되어버려가지구.. 

그대신 오픈소스로 열려있는 자료 첨부하겠다. 

https://faculty.washington.edu/yenchic/17Sp_403/Lec2_MonteCarlo.pdf

https://www.investopedia.com/terms/m/montecarlosimulation.asp

 

Monte Carlo Simulation: What It Is, How It Works, History, 4 Key Steps

The Monte Carlo simulation is used to model the probability of different outcomes in a process that cannot easily be predicted because of the potential for random variables.

www.investopedia.com

 

처음껀 대학교 수업에 활용한 자료로 보이는데, 저런 자료가 참 좋은 자료다. 

(나중엔 수학 공부하는 글을 좀 써봐야하나 싶다)

 

 

4. 몬테카를로 시뮬레이션 활용 예제: 주식 포트폴리오 최적화

자 이제 대충 개념 다들 알았으니, 활용해봐야지 

 

내가 처음에 목적에 두고 한것처럼 주식 포트폴리오 최적화를 하는 방법을 해보자. 지피티한테 간단히 요청을 해서 코드 작성했다. 

 

그 전에 알고가야할게 있다.

 

이전에 내가 했던 프로젝트에서도 그렇고, 이번 코드에서도 그렇고 두가지 지표, 샤프지수와 변동성을 기준으로 활용할건데 이유는 아래와 같다. 


몬테카를로 시뮬레이션에서 샤프지수와 변동성을 활용하는 이유

 

1. 샤프지수: 수익성과 효율성의 척도

주식 좀 해본사람은 들어본, 샤프지수는 수익 대비 위험을 평가하는 지표다.

투자자는 일반적으로 더 높은 수익을 원하지만, 높은 수익에는 더 큰 위험이 따르기 마련이기 때문에, 샤프지수는 이런 위험 대비 얼마나 효율적으로 수익을 얻을 수 있는지를 보여줄 수 있다.

 

예를 들어, 두 포트폴리오가 동일한 수익률을 보인다고 해도, 하나는 변동성이 적고 다른 하나는 변동성이 크다면, 변동성이 적은 포트폴리오가 더 좋은 투자라고 볼 수 있기 때문에, 샤프지수가 높은 포트폴리오는 수익성과 안정성을 동시에 추구하는 투자자에게는 꼭 보는 지표중 하나다.

 

2. 변동성: 위험의 크기

말 그대로 변동성은 포트폴리오 수익률이 얼마나 크게 변동하는지를 나타내는 지표다. 쉽게 말해, 변동성이 클수록 투자 성과가 예측하기 어렵고, 위험이 크다는 뜻이다.

 

안정성을 선호하는 투자자는 변동성이 낮은 포트폴리오를 찾는 것을 목표로 하기 때문에, 변동성을 기준으로 삼으면 위험을 최소화하면서 수익을 추구할 수 있다.

 

 

3. 샤프지수와 변동성의 상호 보완적 역할

샤프지수는 위험 대비 수익에 초점을 맞추고, 변동성은 위험 자체에 초점을 맞추기 때문에 보통 이 두 지표를 함께 사용하면 다음과 같은 장점을 가지고 갈  수 있게된다

  • 샤프지수가 높은 포트폴리오를 선택하면 효율적으로 수익을 창출할 수 있고,
  • 변동성이 낮은 포트폴리오를 선택하면 위험을 최소화할 수 있으며
  • 두 지표를 비교하면 수익성과 안정성 사이의 균형을 찾을 수 있다

4. 결론: 몬테카를로 시뮬레이션에서의 활용

몬테카를로 시뮬레이션을 통해 수많은 포트폴리오를 분석할 때, 샤프지수와 변동성을 기준으로 각각의 강점을 가진 포트폴리오를 선택할 수 있다.

  • 샤프지수가 최대인 포트폴리오는 높은 수익성과 효율성을 목표로 하는 투자자에게 적합
  • 변동성이 최소인 포트폴리오는 안정성을 중요시하는 투자자에게 적합

급 길게 설명이 들어갔는데, 암튼  코드로 한번 봐 봅시다. 

예시로 그냥 테슬라, 애플, 제피모간, voo를 어떻게 비중을 가지고 가야

위에서 설명한것처럼 샤프지수가 가장 높은 혹은 변동성이 최소인 포트폴리오를 구성할 수 있는지 빠르게 코드 예시와 결과를 보자. (thanks gpt, 코드 검증 했음)

 

2년동안 네개의 주식을 어떤 비중을 가지고갔을때 가장 좋은 샤프지수, 가장 낮은 변동성을 가지는지, 그리고 그에 따른 수익률은 얼마인지를 보는 코드다. 5000번 돌려보자

import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 주식 데이터를 다운로드
tickers = ['TSLA', 'AAPL', 'JPM', 'VOO']
data = yf.download(tickers, start="2022-01-01", end="2024-12-31")['Adj Close']

# 일일 수익률 계산
returns = data.pct_change().dropna()

# 시뮬레이션 횟수
num_simulations = 50000
num_assets = len(tickers)

# 결과를 저장할 배열 초기화
results = np.zeros((3 + num_assets, num_simulations))

# 몬테카를로 시뮬레이션 실행
for i in range(num_simulations):
    weights = np.random.random(num_assets)
    weights /= np.sum(weights)
    
    # 포트폴리오 수익률과 변동성 계산
    portfolio_return = np.sum(returns.mean() * weights * 252)
    portfolio_std_dev = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 252, weights)))
    sharpe_ratio = portfolio_return / portfolio_std_dev
    
    # 결과 저장
    results[0, i] = portfolio_return
    results[1, i] = portfolio_std_dev
    results[2, i] = sharpe_ratio
    for j in range(len(weights)):
        results[3 + j, i] = weights[j]

# 결과 배열을 데이터프레임으로 변환
results_frame = pd.DataFrame(results.T, columns=['Return', 'Volatility', 'Sharpe Ratio'] + tickers)

# 샤프지수가 최대인 포트폴리오와 변동성이 최소인 포트폴리오 찾기
max_sharpe_port = results_frame.loc[results_frame['Sharpe Ratio'].idxmax()]
min_vol_port = results_frame.loc[results_frame['Volatility'].idxmin()]

# 효율적 경계 플롯
plt.scatter(results_frame['Volatility'], results_frame['Return'], c=results_frame['Sharpe Ratio'], cmap='viridis', marker='o')
plt.colorbar(label='Sharpe Ratio')
plt.scatter(max_sharpe_port['Volatility'], max_sharpe_port['Return'], color='red', marker='*', s=200, label='Max Sharpe Ratio')
plt.scatter(min_vol_port['Volatility'], min_vol_port['Return'], color='blue', marker='*', s=200, label='Min Volatility')
plt.title('Efficient Frontier')
plt.xlabel('Volatility')
plt.ylabel('Return')
plt.legend()
plt.show()

# 결과 출력
print("최대 샤프지수 포트폴리오")
print(max_sharpe_port)
print("\n최소 변동성 포트폴리오")
print(min_vol_port)

오랜만에 보는 이 그래프...캬

 

 

결과만 보면,

1. 샤프지수가 높은 포트폴리오에서는 수익률이 약17%, 변동성이 가장 낮은 포트폴리오에서는 약10%정도다. 

-> 변동성이 낮은 안전 투자이기 때문에 수익률이 낮을 수 있다.

 

2. 주식 비중을 쓱 보면, 최대 샤프지수 포트폴리오에서는 애플과 테슬라의 비중이 98%이고, 최소 변동성 포트폴리오에서는 VOO의 비중이 91%다. ㅋㅋㅋㅋㅋ 

-> voo의 변동성이 낮은게 확 보이며, 샤프지수가 높은 애플테슬라 비중이 높은 것도 눈에 바로 보인다.

 

둘다 최대, 최소의 포트폴리오를 간략하게 보여준것이기 때문에, 저거대로 비중을 가지고 가라는 소리는 절대 아니당.. 그냥 참고하고 중간에 더 좋은 방식으로 선택을 하면 된다.

이건 나중에...

 

 

6. 데이터 분석에서 몬테카를로 시뮬레이션의 장점과 한계

간략하게 장/단을 적어보자면 

 

장점

  • 복잡한 문제의 근사적 해결이 가능.
  • 다양한 시나리오를 분석하여 결과에 대한 신뢰도를 높임.
  • 데이터 기반 의사결정을 지원.

한계

  • 반복 횟수가 많을수록 계산 비용이 증가.
  • 난수 생성의 품질이 결과에 영향을 미침.
  • 확률 분포 가정이 실제 데이터와 다를 수 있음.

여러번 시뮬레이션을 하는것이기 때문에 신뢰도가 높을 수 있지만,

반대로 당연히 기계를 통해 반복노가다를 하는것이기 때문에 비용과, 품질에 대해서 검증이 많이 필요하다...

 

7. 결론: 데이터 분석과 몬테카를로 시뮬레이션

암튼 그래서

 

몬테카를로 시뮬레이션은 데이터 분석에서 불확실성과 복잡한 문제를 다루는 데 유용한 방법론이고,

 

이를 통해 분석가는 데이터를 기반으로 보다 합리적이고 신뢰성 있는 결정을 내릴 수 있다..

 

주식 포트폴리오 최적화와 같은 실용적 응용은 물론, 다양한 비즈니스 문제 해결에 활용할 수도 있겠다. 

 

(포트폴리오 최적화는 곧 곧.. 올려보겟음)

 

 

+ Recent posts