728x90
반응형
볼린저밴드 투자기법이라는 책을 읽고 있다.
볼린저밴드 하단에서 사고 상단에서 팔때의 수익률을 파이썬을 이용해서 백테스트 하고자 한다.
import pandas as pd
import FinanceDataReader as fdr
import pandas_ta as ta
import matplotlib.pyplot as plt
라이브러리는 pandas, FinanceDataReader, pantas_ta, matplotlib를 사용하였다.
stock_cnt=0
own_day = 0
total_cash=10000
total_asset =10000
stock_own=False
book = []
보유주식수 (stock_cnt), 보유일수 (own_day), 현금 (total_cash), 자산 (total_asset), 보유여부 (stock_own)의 기본값을 정의하였다.
book 리스트는 백테스트를 통해 위의 값들을 저장하기 위해 지정했다.
ticker = 'TQQQ'
df=fdr.DataReader(ticker,'2020')
df.ta.bbands(length=20, std=2.0, append=True)
df.dropna(inplace=True)
종목은 TQQQ로 하였고, 2020년부터의 가격데이터로 작업하였다.
pandas_ta로 볼린저밴드를 20일 기준 표준편차 2.0으로 작업하였다.
빈 값을 정리하였다. (dropna)
for i in range(len(df)):
day_list=[]
if df.iloc[i]['BBP_20_2.0'] < 0 and stock_own==False:
stock_cnt = total_cash // df.iloc[i]['Adj Close']
total_cash = total_cash - (df.iloc[i]['Adj Close'] * stock_cnt)
stock_own = True
print (i, df.iloc[i]['Adj Close'], stock_cnt, total_cash)
elif df.iloc[i]['BBP_20_2.0'] > 1 and stock_own == True:
total_cash = total_cash + (df.iloc[i]['Adj Close'] * stock_cnt)
stock_cnt = 0
stock_own = False
print (i, df.iloc[i]['Adj Close'], stock_cnt, total_cash)
if stock_own == True:
own_day += 1
total_asset = total_cash + stock_cnt * df.iloc[i]['Adj Close']
day_list = [df.index[i],stock_cnt,total_asset,stock_own,own_day]
book.append(day_list)
book_df = pd.DataFrame(book, columns=['date','stock_cnt','total_asset','stock_own','own_day'])
볼린저밴드의 위치는 BBP로 판단하였다. 0 이하에서 주식을 보유하고 있지 않을때 매수하고, 1이상에서 주식을 보유하고 있을때 매도하였다.
매수/매도 가격은 종가를 기준으로 했다.
990 거래일 기준, 490을 보유하였고, 전체 수익률은 65%로 35% 손실을 기록하였다.
거침없는 하락이 명확히 보인다.
일단 백테스트를 할 수 있었다는 데에 만족한다.
본 포스팅에는 표현되어 있지 않지만, 파이썬에 문외한인 나에게 반복문과 조건문 부분에 많은 도전이 있었다.
728x90
반응형
'투자' 카테고리의 다른 글
2개의 데이터 프레임을 합치는 방법 (0) | 2024.01.06 |
---|---|
볼린저 밴드 하단에서 매수하고 일정비율에서 익절할때 (1) | 2024.01.06 |
백테스트 시 거래기록 만들기 (2) | 2023.12.26 |
볼린저 밴드 백테스트 (01) (0) | 2023.12.26 |
코인 볼린저밴드 매매 (1) (0) | 2023.12.01 |