buy and hold

jh_k·2023년 2월 5일
0

투자전략

목록 보기
1/7
import pandas as pd
import numpy as np

buy and hold

  1. 결측치 및 이상치를 조회 및 삭제
  2. 종가를 기준으로 수익율 측정
  3. 일별 수익율 파생변수
  4. CAGR, MDD, VOL, sharpe를 출력
## 데이터 로드 

df = pd.read_csv("../csv/AAPL.csv", index_col='Date')
df.head(2)
## 결측치 및 이상치를 조회
## any를 하면 인덱스 당 true  False 가 나오지만
## any 가 없으면 전체 데이터프레임에 각 셀별로 True Flase 가 나옴
# any(0) 은 컬럼을 기준 any(1)은 행기준 

df[df.isin([np.nan, np.inf, -np.inf]).any(1)]

## 결측치 및 이상치를 제외한 데이터를 출력
df = df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]
## 종가만 사용 (Adj Close) 
price_df = df.loc[:, ["Adj Close"]]

## 일별 수익율 생성
## (오늘 날짜의 종가 - 어제 날짜의 종가) / 어제 날짜의 종가
# daily_rtn 파생변수로 생성
price_df['daily_rtn'] = price_df['Adj Close'].pct_change()
## 일별 수익율 가지고 총 수익율을 구하려면?
## 누적곱 cumprod()
## st_rtn 파생변수 생성
price_df['st_rtn'] = (1 + price_df['daily_rtn']).cumprod()
## 종가를 기준으로 수익율 계산
# 마지막 데이터의 종가 / 처음 데이터의 종가
# 데이터프레임.index --> list 형태의 데이터가 출력
# list형태의 데이터에서 첫번째 원소가 구매일, list 마지막 원소가 판매일
# 데이터프레임 필터링 판매일에 종가 / 구매일의 종가 --> 수익율 
price_df.index
first_date = price_df.index[0]
last_date = price_df.index[-1]

## 구매일에 종가 출력
price_df.loc[last_date, 'Adj Close'] / price_df.loc[first_date, 'Adj Close']
# backtesting 

# cummax() - 기준 값에서 최고가 저장
# cummin() - 기준 값에서 최저가 저장

historical_max = price_df['Adj Close'].cummax()
daily_drawdown = price_df["Adj Close"] / historical_max - 1.0
## 최대 낙폭 
historical_min =  daily_drawdown.cummin()
historical_min.plot()
## CAGR, MDD, VOL, sharpe 출력
## CAGR : 일별 date 사용 -> 
# 전체 연도를 계산하는 경우 영업일 기간을 252일 기준으로 나눈 역수 제곱한 후 -1
## MDD : 최대 낙폭
## VOL : 연 주가 수익율 표준편차 = 일별 주가 수익율 * 252일 제곱근
## sharpe : 총 위험 1단위당 초과 수익율
CAGR = price_df.loc[last_date, 'st_rtn'] ** (252/len(price_df)) - 1
MDD = historical_min.min()
VOL = np.std(price_df["daily_rtn"] * np.sqrt(252))
sharpe = np.mean(price_df["daily_rtn"]) / np.std(price_df["daily_rtn"])*np.sqrt(252)
print('CAGR : ', round(CAGR*100, 2), '%')
print('Sharpe : ', round(sharpe, 2))
print('VOL : ', round(VOL*100, 2), '%')
print('MDD : ', round(-1*MDD*100, 2), '%')
profile
Just Enjoy Yourself

0개의 댓글