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

[파이썬 주식] 변동성돌파전략 - 5.백테스트 결과 시각화 해보기 본문

STOCK/변동성돌파전략

[파이썬 주식] 변동성돌파전략 - 5.백테스트 결과 시각화 해보기

BOTTLE6 2021. 1. 25. 23:08

## 1. 라이브러리 임포트

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
# 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   

## 2. 자동거래 감시중인 종목 불러오기

codes = ['A204320', 'A028050', 'A035150', 'A011210', 'A131390', 'A006360', 'A005070', 'A005380', 'A001510', 'A001140', 'A068270', 'A004020', 'A032560', 'A200130', 'A039490',
 'A079430', 'A000990', 'A011790', 'A210980', 'A002840', 'A035510', 'A029460', 'A086280', 'A005940', 'A006800', 'A020760', 'A011760', 'A069260']
codes = [ code[1:] for code in codes ]

 

## 3. 백테스트 함수 정의

수익률을 반환

def backtest(code, k, start):
    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
    return df['수익률']

## 4. 수익률 데이터프레임 만들기

종목은 2에서 정의한 29가지

k=0.5

start='2020-01-01'

returns = pd.DataFrame()
for code in codes:
    df = backtest(code,k=0.5,start='2020-01-01')
    returns[code] = df
    time.sleep(0.01)
returns.set_index(returns.index.strftime("%Y-%m-%d"),inplace=True)

## 5. 시각화

① 누적수익률 graph

plt.figure(figsize=(12,8))
returns.mean(axis=1).cumprod().plot()

 

 

② cmap 직접 설정하기 

# cmap 직접 세팅
import numpy as np; np.random.seed(0)
import seaborn as sns; sns.set()
 
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
 
 
def create_color(r, g, b):
    return [r/256, g/256, b/256]
 
def get_custom_color_palette():
    return LinearSegmentedColormap.from_list("", [
        create_color(227, 101, 33), create_color(246, 145, 53), create_color(251, 168, 74),
        create_color(218, 212, 200),
        create_color(141, 193, 223), create_color(114, 167, 208), create_color(43, 92, 138)
    ])
 
#low, high = -5, 15
#data = np.random.uniform(low, high, (10, 15))
 
cmap = get_custom_color_palette()
#sns.heatmap(data, cmap=cmap, center=0);
#출처 : https://richardhildebrand.wordpress.com/2019/09/18/create-a-custom-color-palette-with-matplotlib-and-seaborn/


③ heatmap

plt.figure(figsize=(20,50))
sns.heatmap(data=returns, cmap=cmap,center=1,annot=True,fmt=".2f")

 

Comments