본문 바로가기
투자

볼린저 밴드 백테스트 (01)

by 천장만보며 2023. 12. 26.
728x90
반응형

볼린저 밴드를 사용하여 주식을 거래하는 백테스트를 파이썬을 이용하여 구현해보고자 한다.

백테스트 코드가 작동하게 하는데에도 한참 걸렸다.

 

import pandas as pd
import FinanceDataReader as fdr
import pandas_ta as ta

 

라이브러리는 3개를 사용했다.

가격정보를 불러오기 위해 FinanceDataReader를 사용하였고,

지표 계산을 위해서 pandas_ta를 사용하였다.

 

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를 사용하여 볼린저밴드 지표를 계산하였다.

 

 

stock_cnt=0 # 보유주식수
own_day = 0 # 보유일수
total_asset=10000 # 총자산 (시드)
stock_own=False # 보유여부

 

시드는 10000불로 시작하고, 보유일수를 계산해서 전체 기간중 보유기간을 알아보고자 했다.

for i in range(len(df)):
    if df.iloc[i-1]['BBP_20_2.0'] < 0 and df.iloc[i]['BBP_20_2.0'] > 0 and stock_own==False:
        stock_cnt = total_asset // df.iloc[i]['BBL_20_2.0']
        total_asset = total_asset - (df.iloc[i]['BBL_20_2.0'] * stock_cnt)
        stock_own = True
        print (i, df.iloc[i]['BBP_20_2.0'], stock_cnt, total_asset)
    elif df.iloc[i-1]['BBP_20_2.0'] > 1 and df.iloc[i]['BBP_20_2.0'] < 1 and stock_own == True:
        total_asset = total_asset + (df.iloc[i]['BBU_20_2.0'] * stock_cnt)
        stock_cnt = 0
        stock_own = False
        print (i, df.iloc[i]['BBP_20_2.0'], stock_cnt, total_asset)
    if stock_own == True:
        own_day += 1

 

반복문을 만드는데에 어려움이 많았다. (자세한 내용은 별도의 포스팅으로 남기겠다.)

전일 %b가 0아래이고, 금일 0위로 상향돌파하는 날 매수하고, 전일이 1이상이고, 금일이 1 이하로 하향돌파하면 매도하는 간단한 로직이다. 

 

총 거래일 894일 중에서 462일을 보유하고 있었고, 최종자산은 11822, 118% 수익률이었다.

21.98이 50.34로 단순보유 수익률 229%에 아주 많이 부족하다. 

 

359일쯤에서는 27186까지 갔다가 8431까지 떨어진것을 보니 MDD가 상당하다. 

 

다음 목표는 일자별 거래 내역을 기록하는 것이다. 

 

728x90
반응형