삶의 공유

[파이썬] Daily 수익률 표준 편차와 누적 수익률과의 관계 확인 본문

Data Scientist/Python

[파이썬] Daily 수익률 표준 편차와 누적 수익률과의 관계 확인

dkrehd 2022. 5. 22. 18:57
728x90
반응형

안녕하세요 ~~

 

요즘 제가 테스트 해보고 있는 전략은 이동 평균선을 이용하여 매수, 매도 전략입니다.

여러가지 방법이 있지만 저는 20일선, 30일선 조합과, 30일선 40일 선 조합 중에 괜찮은 조합을 선택하여 선정 중입니다.

 

백테스팅 하는 과정에서 알게된 것은 이 전략이 모든 종목에 통하지 않는 다는 것을 알게 되었습니다.

 

그럼 어떤 종목에 이 조합이 통할지 확인해보고자 Daily 수익률 표준 편차와 누적 수익률과의 관계를 확인 해보겠습니다.

 

먼저 필요한 라이브러리를 import 해줍니다.

 

import time
import pyupbit
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

 

그리고 수익률을 구해주는 함수를 하나 만들어줍니다.

 

def confirm_returns(ticker):
    # 데이터 준비
    df = pyupbit.get_ohlcv(ticker, count=1000, interval="minute60")
    # df = pyupbit.get_ohlcv("KRW-STEEM", count=10000)
    data = df[['close','volume']].copy()
    data["returns"] = np.log(data.close.div(data.close.shift(1))) # 수익률
    data['creturns'] = data.returns.cumsum().apply(np.exp) # 누적 수익률


    # 이동평균선 구하기 (시간 평균)
    sma5 = data['close'].rolling(window=5).mean()
    sma20 = data['close'].rolling(window=20).mean()
    sma30 = data['close'].rolling(window=30).mean()

    # 매수 매도 시그널
    signal = []
    buy_possible = False
    buycnt = 0
    sellcnt = 0
    for i in range(len(data)):
        if sma5[i] < sma20[i]  and sma5[i] < sma30[i] and  sma20[i] < sma30[i]:
            buy_possible = True
        if buy_possible and sma5[i] > sma30[i]: # 매수
            signal.append(1)
            buycnt = 1
            buy_possible = False
        elif buycnt == 1 and sma5[i] < sma30[i] and sellcnt == 0: # 매도 신호 2번 연속 일 경우를 위한 buffer
            signal.append(1)
            sellcnt = 1
        elif buycnt == 1 and sma5[i] < sma30[i] and sellcnt == 1: # 매도
            signal.append(0)
            buycnt = 0
            sellcnt = 0
        elif buycnt == 1: # 조건이 충족이 안되었을 때 
            signal.append(1)
        else:
            signal.append(0)

    data['position'] = signal

    # 수익률 계산하기
    data['strategy'] = data.position.shift(1) * data['returns']
    data['cstrategy'] = data['strategy'].cumsum().apply(np.exp)
    print('종목 : {0} / 표준편차 : {1} / 수익률 : {2}'.format(ticker, data.returns.std(), data[['strategy']].sum().apply(np.exp)))

 

현재 코드는 20시간, 30시간 기준으로 되어 있는데, 아래와 같이 window=20 이부분의 값을 변경하여 30,40으로 바꿔주시면 30시간, 40시간 기준으로 바꿔서 확인 하실 수 있습니다.

 

sma20 = data['close'].rolling(window=20).mean()
sma30 = data['close'].rolling(window=30).mean()

 

반응형

 

 

자 이제 준비는 끝났습니다. 이제 종목 정보를 불러와서 종목을 하나씩 함수에 넣어서 수익률을 확인해보겠습니다.

tickers = pyupbit.get_tickers(fiat='KRW')
for ticker in tickers:
    confirm_returns(ticker)

 

저는 엑셀로 정리하긴 했지만, 아래와 같이 정리 할 수 있습니다. 이것을 시각화하여 표준 편차와 이동평균선 전략에 대한 관계를 확인해보겠습니다.

 

아래와 같이 그래프를 그릴 수 있습니다. 데이터를 통해 확인 한 것은 수익률이 높은쪽에 위치해 있는것은 보통 Daily 수익률 표준 편차가 0.02 이상일 때 누적 수익률도 높은 것을 볼 수 있었습니다.

 

 

지금까지 Daily 수익률 표준 편차와 누적 수익률과의 관계를 살펴보았습니다. 

읽어주셔서 감사합니다.

 

 

 

반응형