백테스트

특정 투자 전략을 과거 데이터로 검증하는 작업.

백테스트 라이브러리

1. 집라인(Zipline): 대중적으로 많이 사용, 단점 느림. Python버전 환경 영향을 탐. 참조: https://wikidocs.net/4427
   - 재정지원에 중점. 이벤트 기반

   - https://github.com/quantopian/zipline

2. 파이알고트레이드(PyAlgoTrade) (무료) : https://gbeced.github.io/pyalgotrade/

   - 문서: http://gbeced.github.io/pyalgotrade/docs/v0.20/html/

   - 이벤트 기반

3. 트레이딩위드파이썬(TradingWithPython)

4. 파이백테스트(PyBackTest)

5. 백트레이더(BackTrader): 최근 각광, 오픈소스 기반
   https://www.backtrader.com/
 

backtrader 지원 지표 (bt.indicators 패키지)

  • Accdecoscillator
  • ATR
  • Bollinger
  • CCI
  • Crossover
  • Deviation
  • DirectionalMove
  • DMA
  • EMA
  • Ichimoku
  • MACD
  • Momentum
  • Sma
  • Stochastic
  • Willams
  • WMA

* 아래 오류 발생 시 matplotlib 버전을 3.2.2 로 재설치 한다.
pip uninstall matplotlib
pip install matplotlib==3.2.2

    from matplotlib.dates import (HOURS_PER_DAY, MIN_PER_HOUR, SEC_PER_MIN,
ImportError: cannot import name 'warnings' from 'matplotlib.dates' (/Users/jeahanjung/opt/anaconda3/envs/system_strading_py39_64/lib/python3.9/site-packages/matplotlib/dates.py)

 

import backtrader as bt
import yfinance as yf

class RsiStrategy(bt.Strategy):
    def __init__(self):
        self.rsi = bt.indicators.RSI(self.data.close)

    def next(self):
        if not self.position:
            if self.rsi < 30:
                self.order = self.buy()

        elif self.rsi > 70:
            self.order = self.sell()


cerebro = bt.Cerebro()  # create a "Cerebro" engine instance
cerebro.addstrategy(RsiStrategy)  # Add the trading strategy
# data = bt.feeds.YahooFinanceData(dataname="036570.KS", fromdate=datetime(2017, 1, 1), todate=datetime(2019, 12, 1))
data = bt.feeds.PandasData(dataname=yf.download('036570.KS', '2018-01-01', '2021-12-01'))

cerebro.adddata(data)
cerebro.broker.setcash(1000*10000) # 초기투자 금액
cerebro.addsizer(bt.sizers.SizerFix, stake=30) # 매매단위

print(f'Initial Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.run()  # run it all
print(f'Final Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.plot()  # and plot it with a sing

[*********************100%***********************]  1 of 1 completed
Initial Portfolio Value : 10,000,000 KRW
Final Portfolio Value : 12,925,000 KRW

 

728x90

"쉽게 따라 만드는 파이썬 주식 자동매매 시스템" 책에 나온 매매 전략 요약

 

* 참조URL : https://thebook.io/080298/ch04/

 

1. 매매전략 - RSI기반 역추세

1.1 매수조건
 1) 20일 이동평균 > 60일 이동평균
 2) RSI(2) < 5
 3) 2일 전 주가 대비 현재 주가 변화율 < -2%(현재 주가가 2일 전보다 2% 이상 떨어진 경우)
    - 당일 종가 부근(15:00)에서 조건에 모두 해당하면 현재 최우선 매수로 호가 매수
1.2 매도 조건
 1) RSI(2) > 80
 2) 현재가 > 매수가
   - 장 중 조건에 모두 해당하면 현재 최우선 매도 호가로 매도

2. 매매종목선정(유니버스 구성)
2.1 ETF, 우선주 제외
 - 개별 기업 분석이 효율적이라 ETF제외
 - 우선주는 보퉁주를 따라 가는 경향이 있고, 거래량이 적어서 제외
2.2 지주 회사(홀딩스) 제외
 - 지배구조를 위한 기업으로 개별 기업으로 보기 어려워 제외
2.3 매출액 증가율 0보다 큰 기업 선택
2.4 ROE가 0보다 큰 기업
 - ROE(Return On Equity) : 자기자본이익율(ROE) = 당기순이익 / 평균자기자본총계 * 100
 - ROE가 +면 영업이익이 흑자, -면 적자라를 의미. 3)조건에서 적자에서 매출증가가 나올 수 있으므로,
   ROE가 +인 기업만 포함하도록 함.
2.5 ROE와 1/PER(PER의 역수)로 내림차순 했을 때 순위를 구해 두 순위의 평균을 계산한 후 상위 기업 200개 추출
 
3. 백테스팅
3.1 매매 종목 선정
 - 최대 보유 종목을 10개로 가정하면, 각 종목당 자금의 10% 비중으로 설정한다.
 - 수수료 및 세금은 0.015%, 0.3% 적용
 - 수행기간 적용 후 백테스트 진행

 

ps. 주의점
 - 상승장과 하락장에 따라 승률이 달라지므로, 하락장 보합장에서도 백테스팅 진행해서 검증할 것.
 - 상승장/하락장/보합장에 맞는 매매전략을 개발하는 것도 좋을 듯함.
 

end.

728x90

주식용어

■ 백테스팅  
백테스팅이란 시뮬레이션, 과거 데이터를 가지고 이 전략대로 매매한 시뮬레이션을 의미함.

■ 우선주  
보통주와 다르게 의결권이 없으나 특정 권리를 우선적으로 제공하는 주식을 우선주라한다.  
추가 배당, 우선 변제권을 부여받는다.

■ 유니버스  
유니버스랑 매매 대상으로 삼을 후보군을 의미함.

■ 턴어라운(Turn around)  
턴어라운드란 경제에서 기업회생을 의미하고, 주식 시장에서 좁은 의미로 기업이 적자에서 흑자로 전환된 상태로 돌아섰다는 의미로 사용함.

■ EPS(Earning Per Share) : 주당순이익 = 당기순이익 / 주식수

■ PER(Price Earning Ratio) : 주가수익비율 = 주식가격 / EPS

■ PBR(Price Book-value Ratio) : 주당순자산비율 = 주가 / 주당순자산

■ 주당순자산(BPS:Book-value Per Share) : (총자산 - 총부채) / 발생주식 
 - PBR이 1 이면, 특정 시점의 주가와 기업의 1주당 순자산이 같다는 뜻이고, 낮을 수록 기업의 저평가이고, 싸게 거래된다는 의미.

■ ROE(Return On Equity)  
자기자본이익율(ROE) = 당기순이익 / 평균자기자본총계 \* 100
 - 투입한 자기자본이 얼마만큼의 이익을 냈는지를 나타내는 지표

■ ETF (Exchanged Traded Fund)  
ETF란 특정 지수의 성과 자산 가치를 추종하는 펀드를 거래소에 상장하여 주식과 동일하게 매매 가능하도록 설계한 상품

728x90

+ Recent posts