요전 포스팅에서 적정 레버리지 비율에 대해서 알아봤는데요.
이번 포스팅에서는 이제 레버리지 비율을 2배로 고정시켜 놓고 우리가 얼마나 수익을 얻을 수 있는지 한 번 계산해보도록 하겠습니다. "NSD.csv" 파일 받는 방법은 위에 있으니 위 링크에서 참고해 주세요. 마찬가지로 필요한 패키지들을 불러오고 데이터를 읽고 나스닥이 하루에 얼마만큼 변했는지 저장을 해줍니다.
import numpy as np
import pandas as pd
import random as rd
import matplotlib.pyplot as plt
data = pd.read_csv("./NSD.csv")
print(data)
nsd = data['Adj Close']
rate = np.zeros((len(nsd)-1))
for i in range(len(rate)):
rate[i] = (nsd[i+1]-nsd[i])/nsd[i]
자 이러면 나스닥의 현재가와 변화량은 구해졌죠? 그렇다면 이제 1년의 영업일 (254일) 기준으로 평균 수익을 계산해보겠습니다. 계산식은 아래와 같고요.
$$ (1+x)^{\text{period}/254} = \text{current value}/\text{initial value}$$
계산을 해보면
tsf = len(nsd)/254
prf = (nsd[len(nsd)-1])/nsd[0]
print(prf)
print((np.exp(np.log(prf)/tsf)-1)*100)
nsd_qld = 1
for i in range(len(rate)):
nsd_qld *= (1 + 2*rate[i])
print(nsd_qld)
print((np.exp(np.log(nsd_qld)/tsf)-1)*100)
약 17.3948%의 수익이 매년 평균적으로 난 것을 할 수 있습니다. (참고로 레버리지 없는 나스닥은 10퍼센트 정도) 자 그러면 이제 수익률을 가지고 이 중에 난수로 마구 숫자를 뽑아서 몬테카를로 시뮬레이션을 해보도록 하겠습니다. 크게 보면 두 가지 방법으로 몬테카를로를 할 수 있는데요.
1. 표본의 숫자가 충분히 많다고 가정하면 그냥 표본 중에 무작위를 선택해서 돌리는 방법이 있고요.
2. 표본의 숫자가 좀 적은 것 같지만 (많더라도 괜찮음) 대략적으로 정규분포를 따른다고 가정하고 정규분포로부터 표본을 생성하는 방법이 있습니다.
이번 포스팅에서는 두 번째 방법으로 진행해 보겠습니다. 첫 번째 방법을 사용하더라도 결과값에는 큰 차이가 없더라고요. 먼저 원본 데이터를 이용해 히스토그램을 그려보고 원본 데이터를 이용하여 정규분포를 근사한 그래프를 먼저 그려보겠습니다.
avg = np.mean(rate)
std = np.std(rate)
print(avg,std)
plt.hist(rate, density=True, bins = 20)
x_axis = np.arange(-0.15, 0.15, 0.001)
plt.plot(x_axis, norm.pdf(x_axis, avg, std))
plt.show()
위의 그림과 같이 나오는 군요. 평균은 약 0.000473 정도로 하루에 얻을 수 있는 기대수익을 말합니다. 그리고 표준편차는 0.0125 정도로 실제 값은 꾀나 큰 오차를 가지고 있다고 근사를 할 수 있었습니다. 먼저 1년치만 시뮬레이션을 돌려서 과연 시뮬레이션이 어느정도 예측을 잘 할 수 있는지 검증을 해보도록 하겠습니다.
total = []
for j in range(10000):
s = np.random.normal(avg, std, 254)
ep = 1
for i in range(s.shape[0]):
ep *= (1 + 2*s[i])
total.append(ep)
print((np.quantile(total, 0.5)-1)*100)
10,000개의 미래를 예측하는 코드를 돌려봤고요. 결과값은 매번 조금씩은 다르겠지만 17.3268퍼센트가 나왔네요. 이 값은 10,000개의 예측된 미래 중에서 중위값을 선택한 결과입니다. 위의 실제 데이터는 17.3948퍼센트 정도의 평균 수익을 낸다고 계산한 것과 많이 비슷하죠? 이제는 더 넓은 기간 약 50년 정도로 잡고 하위 25퍼센트, 중위값, 상위 25퍼센트를 한 번 그려보도록 하겠습니다.
total = []
for j in range(10000):
s = np.random.normal(avg, std, 254*50)
ep = 1
for i in range(s.shape[0]):
ep *= (1 + 2*s[i])
if i%254 == 253:
total.append(ep)
total = np.array(total).reshape((-1,50))
qtile = []
for j in range(3):
for i in range(50):
qtile.append(np.quantile(total[:,i], 0.25*(j+1)))
qtile = np.array(qtile).reshape((-1,50))
for i in range(3):
plt.semilogy(np.arange(1,51),qtile[2-i,:])
plt.grid(True)
plt.xlabel("Time (years)")
plt.ylabel("Expected profit")
plt.title("Expected QLD Profit over Time")
plt.legend(["Top 25%", "Median", "Low 25%"])
plt.show()
위의 코드를 실행시켜서 그려보면 아래와 같이 나올겁니다. (조금씩은 다를 수 있음)
이 그래프는 조금씩 다를 수 있는게,
1. 독자분들이 가져온 데이터가 제가 가져올 때보다 더욱 최신이고 최근에 특이하게 많이 오르거나 많이 내렸을 경우 평균과 표준편차에 영향을 줬을 수도 있고요.
2. 몬테카를로는 표본의 숫자가 많을수록 근사치에 가까워 지는데 제가 선택한 10,000개라는 표본이 부족했거나 독자분들이 선택한 표본의 수가 부족했을 수도 있어요.
어쨋든 우리가 궁금한 것들은 이런게 아니고 결과잖아요? 이게 y축은 로그스케일로 그렸기 때문에 생각하는 것보다 숫자가 커요. 여튼 결과를 보면, 10년이 지났을 때, 하위 25퍼센트도 2배 정도가 되었고요. 장기로 봐도 50년이 지나면 461배 정도가 되네요. 이 결과는 있을법한 일중 거의 최악의 상황으로 가정한 겁니다. 긍정적인 상황은 어떨까요? 상위 25퍼센트는 10년 뒤에 11배 정도가 되었고요. 50년뒤에는 2만배가 됩니다. 정말 행복하죠. 근데 이건 방금 하위 25퍼센트 결과와 달리 있을법한 일중 거의 제일 좋은 상황을 말하는 거에요. 현실적인 결과는 아마 중위값을 봐야겠죠. 그러면 우리는 10년뒤에 약 5배 50년 뒤에는 약 3000배 정도를 얻을 수 있다고 기대가 되네요. 물론 물가 상승률도 고려해야 겠지만 이 정도면 물가상승률을 가볍게 뛰어 넘으니 해볼만 하죠?
아래 구글 콜랩 코드 링크를 남겨 놓았으니 쓰실 분들은 쓰세요. 출처 남겨주시면 감사하겠습니다.
https://colab.research.google.com/drive/1yGnjKNf0oNj6Cx57HILSjEknLZtODxdO?usp=sharing
한 마디 결론
오늘 알아본 것들은 기대되는 수익입니다. 결국 오랜 시간이 지난다면 그 쪽으로 수렴하겠죠. 하지만 본인이 언제 들어가고 언제 빠지냐에 따라 조금 다를 수 있습니다. 아무래도 노이즈 (표준편차)가 좀 크기 때문이죠. 그래도 전문가도 아닌 저희가 투자 시기를 판단하기엔 무리가 있고요. 아무 생각없이 적립식으로 넣던지 아니면 그냥 오늘이 제일 주가가 싼 날이라고 생각하고 들어가도 충분히 괜찮다는 생각이 듭니다. 모두 부자되세요!
'각종 돈 관련 > 주식 관련' 카테고리의 다른 글
한국주식 & 미국주식 세금 (feat. 금투세) (2) | 2024.05.28 |
---|---|
[투자] 주식을 해야하는 이유 (0) | 2022.06.06 |
[투자] 지금이라도 시작해야 하는 이유 (0) | 2021.09.13 |
[투자] 적정 레버리지 비율 (1) | 2021.09.07 |
주린이의 주식 공부 (2) | 2021.09.06 |