1. buyandhold : 매수 후 일정 기간 동안 유지한 뒤 매도하여 수익률 구하기
* Adj Close를 사용하는 이유:
adjusted close는 기업의 주식 분할, 배당금 지급 등의 이벤트를 반영해서 조정한 가격이다. 과거 주식의 수익률을 계산하거나 시계열 데이터 분석 및 포트폴리오 수익률 계산 시 사용되어지고 배당과 주식분할 등의 이벤트를 반영한 '실제 투자자가 체감한 수익률 기준'의 가격이다.
* 일별 수익률 구할때 주의점:
오늘의 수정종가/ 전날의 수정종가 식으로 구할때 첫번째 데이터는 이전날의 데이터가 없기때문에 결측치 발생
->
AAPL['daily_rtn'] = \
(AAPL['Adj Close'] / AAPL['Adj Close'].shift()).fillna(1)
* 수익률/ 누적수익률 구하는 법
수익률 -> pct_change() 함수 혹은 shift() 함수 이용하기
# pct_change() 함수를 이용하여 일별 수익율
AAPL['daily_rtn2'] = \
(AAPL['Adj Close'].pct_change() + 1).fillna(1)
AAPL['daily_rtn'] = \
(AAPL['Adj Close'] / AAPL['Adj Close'].shift()).fillna(1)
누적 수익률-> for문 혹운 cumprod()함수 이용하기
rtn = 1
for i in range(len(AAPL)):
# i가 의미하는것은? 데이터프레임의 위치
rtn *= AAPL.iloc[i, 1]
rtn
# cumprod() : 누적곱 함수
AAPL['daily_rtn2'].cumprod()
* 시계열 데이터로 필터링
start_time = "2010-01-01"
end_time = "2015-12-31"
start = pd.to_datetime(start_time)
end = datetime.strptime(end_time, '%Y-%m-%d')
AAPL.loc[start : end, ['Adj Close']]
2. buyandhold 함수 생성하기
일정기간 유지후 누적수익률을 되돌려 주는 함수를 생성
def buyandhold(_df, start="2010-01-01", end=datetime.now(), col = 'Adj Close'):
df = _df.copy()
if 'Date' in df.columns:
df.set_index('Date', inplace = True)
df.index = pd.to_datetime(df.index)
try:
start = pd.to_datetime(start)
if isinstance(end,str):
end = datetime.strptime(end, "%Y-%m-%d")
except:
print("잘못된 형식임")
return ""
df = df.loc[start:end, [col]]
df['daily_rtn'] = (df[col].pct_change()+1).fillna(1)
df['acc_rtn'] = df['daily_rtn'].cumprod()
acc_rtn = df.iloc[-1,2]
print(f"""
From {start.strftime('%Y-%m-%d')} to {end.strftime('%Y-%m-%d')},
your accumulated return is {df.iloc[-1,2]}.
""")
return df, acc_rtn
* 시작시간과 종료시간에 try , except 구문을 사용하는 이유 ->
시작시간과 종료시간이 올바른 날짜 형식인지 확인하고 잘못됐을 경우 사용자에게 메세지를 보여주기 위해서. 또한 사용자가 이미 datetime객체인 end값을 문자열로 전달하면 datetime객체로 변환해주어 에러 방지
bnh_amzn, rtn_amzn = buyandhold(amzn, start = '2015-01-01')

결과값 잘나옴!
'Data Analysis > Python for DA' 카테고리의 다른 글
| [Invest Class] 3. Halloween 투자 전략 함수 생성 (0) | 2025.03.29 |
|---|---|
| [Invest Class] 2. Bollinger 함수 생성 (0) | 2025.03.28 |
| [pymysql] SQL과 Python 연결 (1) | 2025.03.19 |
| [pandas] 데이터분석 복습 3 (0) | 2025.03.18 |
| [데이터 수집] Requests/ BeautifulSoup (1) | 2025.03.14 |