본문 바로가기
투자

볼린저밴드 하단에서 사고 상단에서 팔때

by 천장만보며 2024. 1. 6.
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
반응형