Quant

관심 종목 backtest 실행과 결과보기

gt.kim28 2023. 5. 9. 13:55
반응형

현재 개인적으로 관심있는 종목은 IT 분야이며, 특히 MS와 nvidia이다. 

이를 코로나 이후 시점부터 지금까지 대략 2022년도~현재 까지 설정하여 backtest를 진행해보았다.

2022년도는 코로나이후 계속된 bigstep의 시대였으며 금리가 많이 올라갔었다.

또한 2023년도 현재는 금리 인상이 마무리되고 있고 경기침체의 의견이 많이 나오고 있다.

각설하고, 지난번 포스트에 이어 MS와 nvidia의 backtest를 진행해보자.

 

이번에는 초기 자본금 대략 1000만원정도로 설정한다.

 

backtest function에서 지난 포스트와는 다르게 종가기준으로 position을 할수 있게 조금만 바꿔보자

def backtest(data, signals, initial_capital):
    initial_capital = float(initial_capital)
    positions = pd.DataFrame(index=signals.index).fillna(0.0)
    portfolio = pd.DataFrame(index=signals.index).fillna(0.0)

    # 포지션 계산
    positions['stock'] = (initial_capital / data['Close'][0]) * signals['signal']

    # 포트폴리오 가치 계산
    portfolio['positions'] = (positions.multiply(data['Close'], axis=0))
    portfolio['cash'] = initial_capital - (positions.diff().multiply(data['Close'], axis=0)).cumsum()
    portfolio['total'] = portfolio['positions'] + portfolio['cash']

    return portfolio

 

그리고 시각화 코드에서 우측은 profit %를 나타낼수 있게 해보자

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

def plot_backtest_result(portfolio, initial_capital):
    fig, ax = plt.subplots(figsize=(12, 6))

    # 포트폴리오 총 가치 그리기
    portfolio['total'].plot(ax=ax, label='Portfolio Total Value')

    # 초기 자본 그리기
    ax.axhline(y=initial_capital, color='r', linestyle='--', label='Initial Capital')

    # 그래프 설정
    ax.set(title='Backtest Result', ylabel='Portfolio Value')
    ax.legend(loc='best')

    # 백분율 축 추가 및 포트폴리오 값 변화 백분율 그리기
    ax2 = ax.twinx()
    percentage_change = ((portfolio['total'] - initial_capital) / initial_capital) * 100
    percentage_change.plot(ax=ax2, label='Percentage Change', linestyle=':', color='g')
    ax2.yaxis.set_major_formatter(mticker.PercentFormatter())
    ax2.set_ylabel('Percentage Change')

    # 그래프 출력
    plt.show()

 

1. MS에 대한 backtest

- 2022/01/01~2023/04/30

- 전략 : 이평선이동

- 초기자본 : 대략 1000만원, 7500불

ticker = 'MSFT'
start_date = '2022-01-01'
end_date = '2023-04-30'
initial_capital = 7500 #대략 1000만원
short_window = 40
long_window = 100

data = get_data(ticker, start_date, end_date)
signals = moving_average_strategy(data, short_window, long_window)
portfolio = backtest(data, signals, initial_capital)
print_return_percentage(data, portfolio, initial_capital)

##############결과##################
[*********************100%***********************]  1 of 1 completed
Backtest Period: 2022-01-01 to 2023-04-30
Initial Capital: 7500
Final Portfolio Value: 8402.46484028572
Return Percentage: 12.03%

결과는 나쁘지 않았다. 괜찮은 종목이다.

 

2. nvidia에 대한 backtest

- 2022/01/01~2023/04/30

- 전략 : 이평선이동

- 초기자본 : 대략 1000만원, 7500불

ticker = 'NVDA'
start_date = '2022-01-01'
end_date = '2023-04-30'
initial_capital = 7500 #대략 1000만원
short_window = 40
long_window = 100

data = get_data(ticker, start_date, end_date)
signals = moving_average_strategy(data, short_window, long_window)
portfolio = backtest(data, signals, initial_capital)
print_return_percentage(data, portfolio, initial_capital)


##################결과#####################
[*********************100%***********************]  1 of 1 completed
Backtest Period: 2022-01-01 to 2023-04-30
Initial Capital: 7500
Final Portfolio Value: 10008.631542761337
Return Percentage: 33.45%

중간에 초기자본이 변하지 않는것은 이평선이동에 따른 전략인가 보다..

아마 떨어져서 그런거겠지..

 

다음에는 다른 전략도 한번 해봐야 겠다.

반응형