데이터 공부를 기록하는 공간

[파이썬 주식] 변동성돌파전략 - 8. 실적 검토 본문

STOCK/변동성돌파전략

[파이썬 주식] 변동성돌파전략 - 8. 실적 검토

BOTTLE6 2021. 2. 6. 12:00

2021-01-19부터 자동거래를 진행중

기준 1 익일매도

기준 2 k=0.5

기준 3 최대 5개 종목 매매, 20% 비중

1. 수익률 비교

▶ 백테스트에서는 2번(01-27, 01-29) 손해보는 것으로 나오고 나머지는 0~3.56% 수익이 나오는 것으로 나왔다. 물론, 만족한 종목들의 평균 수익률이다.

1.22는 매도를 늦게 하여 기대 수익률보다 낮음

2.1은 매도는 하였으나 매수를 못하여 너무 아쉬

실제는 수익률이 훨씬 저조하였다. 일자별로 살펴보니,

① 매수는 백테스트 조건(k=0.5에 구매)보다 높게 하고,

② 매도는 9시 0~1분 사이에 하는데 그 동안, 오르거나 내린다.

백테스트 결과와 유사하게 나오도록 다시 구성할 필요가 있음.

백테스트 수익률 계산 방식을

(기존) 매도단가/매수단가 - 0.0032

(수정) 매도단가/매수단가 - 매도단가/매수단가*0.26% - 매수단가오차(?) - 매도단가오차(?)

수익률 계산방식을 변경반영해서 백테스트하고 종목을 다시 추려보아야겠다.

2. ■ 실제 자동매매한 종목별 실적과 백테스로 직접

○ 2021-01-20

▶ 백테스트 수익률은 평균적으로 1%정도로 보이는데 왜 전체적으로 3%였는지 확인필요하다.

이 데이터는 백테스트에서 오류가 있는 것 같음. 원인은 다시 찾아봐야겠음. 큰 문제가 있는지.

○ 2021-01-22

○ 2021-01-27

○ 2021-01-29

○ 2021-02-02

○ 2021-02-04(실제 자동거래 시 조건 k=0.47로 변경)

3. 백테스 수익률 뽑기 위한 코드

## 라이브러리 임포트
from pandas_datareader import data as pdr
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import numpy as np
import time
from pykrx import stock
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
# matplotlib 한글 폰트 출력코드

import matplotlib
from matplotlib import font_manager, rc
import platform

try : 
    if platform.system() == 'Windows':
    # 윈도우인 경우
        font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
        rc('font', family=font_name)
    else:    
    # Mac 인 경우
        rc('font', family='AppleGothic')
except : 
    pass
matplotlib.rcParams['axes.unicode_minus'] = False   

# 일자별 해당 종목에 대한 수익률 뽑기
def backtest(code, k, start,date=date):
    code = str(code)+".KS"
    df=pd.DataFrame()
    df = pdr.get_data_yahoo(code, start)
    df['변동폭'] = df['High']-df['Low']
    df['목표가'] = df['Open'] + df['변동폭'].shift(1)*k
    df['MA3_yes'] = df.Close.rolling(window=3).mean().shift(1)
    df['내일시가'] = df.Open.shift(-1)
    cond = ( df['High'] > df['목표가'] ) & ( df['목표가'] > df['MA3_yes'] )
    df.loc[cond,'수익률'] = df.loc[cond,'내일시가']/df.loc[cond,'목표가']-0.0032 #-0.015%, -0.245% -매도단가 상승=수수료상승 -구매가격 오차 -판매가격 오차
    목표가 = df.loc[date,'목표가']
    내일시가 = df.loc[date,'내일시가']
    수익률 = df.loc[date,'수익률'] - 1
    return [목표가, 내일시가, 수익률]
date = '2021-02-02' #일자
codes = ["001510","011790","035150","035510","086280"] #종목
b=pd.DataFrame()
for code in codes:
    df = backtest(code, 0.5, '2021-01-01', date=date)
    a = pd.DataFrame({code : df},index=["목표가", "내일시가", "수익률"])
    b = pd.concat([b,a],axis=1)
b.T

Comments