관리 메뉴

Leo's Garage

BackTesting.py - SMA 본문

파이프라인 만들기/Algo Trading

BackTesting.py - SMA

LeoBehindK 2023. 2. 5. 09:21
728x90
반응형

오늘은 새로운 BackTesting Framework인 BackTesting.py를 이용하여 간단한 SMA cross 전략을 만들어보겠다. 

https://kernc.github.io/backtesting.py/

 

Backtesting.py - Backtest trading strategies in Python

Does it seem like you had missed getting rich during the recent crypto craze? Fret not, the international financial markets continue their move rightwards every day. You still have your chance. But successful traders all agree emotions have no place in tra

kernc.github.io

BackTesting.py는 BackTrader와 마찬가지로 historical data를 바탕으로 유저의 매매 전략을 테스트해볼 수 있게 해주는 FrameWork이다.

물론 BackTesting이 잘된다고 해서 미래가 보장되는 것은 아니지만 어느정도 방향을 확인할 수 있다는 점이 주효할 것이다.

기본적인 사용방법은 BackTrader와 유사하다.

우선 해당 FrameWork를 사용하기 위해서는 아래와 같이 파이썬 패키지를 설치해야 한다. 

pip3 install backtesting

그리고 나서 간단하게 SMA 2개를 이용해서 매수 매도하는 전략을 아래와 같이 작성해보았다.

import pandas as pd
import yfinance as yf
from backtesting import Backtest, Strategy
from backtesting.lib import crossover

# Download stock data from Yahoo Finance
ticker = "AAPL"
data = yf.download(ticker, start="2020-01-01", end="2021-12-31")

# Define a simple moving average crossover strategy
class SmaCross(Strategy):
    def init(self):
        self.sma1 = self.I(lambda: pd.Series(self.data.Close).rolling(window=10).mean())
        self.sma2 = self.I(lambda: pd.Series(self.data.Close).rolling(window=20).mean())
    
    def next(self):
        if crossover(self.sma1, self.sma2):
            self.buy()
        elif crossover(self.sma2, self.sma1):
            self.sell()

# Initialize the backtest
bt = Backtest(data, SmaCross, cash=10000, commission=.002, exclusive_orders=True)

# Run the backtest and print the results
results = bt.run()
print(results)

bt.plot()

 

10일선과 20일선을 가지고 10일선이 20일 위로 올라갈 때 매수, 반대로 20일선이 10일 선 위로 올라갈 때 매도 하는 전략이다.

초기 자본은 10000으로 설정하고 commission은 0.2%로 설정하였다.

해당 전략을 2020 ~2021년간 애플 주식에 적용해보았다.

코드를 수행하면 아래와 같이 결과를 받아볼 수 있다.

(backtrader) kimdawoon@kimdawoon-ThinkPad-T580:~/workspace/workspace_python/backtrader$ python SmaCross_BackTesting.py 
[*********************100%***********************]  1 of 1 completed
Start                     2020-01-02 00:00:00
End                       2021-12-30 00:00:00
Duration                    728 days 00:00:00
Exposure Time [%]                    92.65873
Equity Final [$]                 21972.249525
Equity Peak [$]                  22077.169599
Return [%]                         119.722495
Buy & Hold Return [%]              137.323114
Return (Ann.) [%]                   48.230393
Volatility (Ann.) [%]               52.505685
Sharpe Ratio                         0.918575
Sortino Ratio                        2.137013
Calmar Ratio                         1.963839
Max. Drawdown [%]                  -24.559237
Avg. Drawdown [%]                   -4.454728
Max. Drawdown Duration      482 days 00:00:00
Avg. Drawdown Duration       31 days 00:00:00
# Trades                                   20
Win Rate [%]                             55.0
Best Trade [%]                      79.788108
Worst Trade [%]                    -10.005947
Avg. Trade [%]                       4.022547
Max. Trade Duration         160 days 00:00:00
Avg. Trade Duration          34 days 00:00:00
Profit Factor                        3.679433
Expectancy [%]                       5.236169
SQN                                  1.171784
_strategy                            SmaCross
_equity_curve                             ...
_trades                       Size  EntryB...
dtype: object

전략의 시작시점, 종료시점이 나오고 Equiry Final을 통해서 최종적으로 자본이 어떻게 변했는지 알 수 있다. 

21972.249525면 2배 이상 증가한 것 을 알 수 있다.

좋은점은 MDD 값도 실시간으로 계산된다는 점이다. 

이 전략의 최대 MDD는 -24%였다. 

해당 전략에 대해서 그래프를 뽑아보면 아래와 같다.

가장 위 차트는 내 자산이 어떤 모습으로 증가했는지를 보여준다.

가운데 차트는 매수, 매도 시점이다. 

마지막 아래 차트는 애플 주가의 주가 흐름 추이이다.

BackTesting.py를 처음 써봤는데 여러모로 잘 만들어진 FrameWork인 것 같다.

앞으로 사용해보면서 장단점을 파악해봐야 겠다. 

728x90
반응형

'파이프라인 만들기 > Algo Trading' 카테고리의 다른 글

BackTrader - Nasdaq 100 적용  (0) 2023.02.16
BackTrader - 단순 종가 비교 전략  (0) 2023.02.15
BackTrader란  (0) 2023.02.03
BackTrader - 역추세 매매 (SMA 이용)  (0) 2023.02.02
BackTrader - Bullish 전략 (2)  (0) 2023.01.29
Comments