mmyjh86

[러닝-키움] 변동성 돌파전략 백테스팅 (simple version)

Oct 20th, 2019
146
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from pykrx import stock
  2. import time
  3. import numpy as np
  4.  
  5.  
  6. def 변동성수익률(df, k):
  7.     for i in range(3, 21):
  8.         df['MA'+str(i)] = df['종가'].rolling(i).mean().shift(1)
  9.  
  10.     # 투자 비중 결정
  11.     df['count'] = 0
  12.     for i in range(3, 21):
  13.         조건 = df['MA'+str(i)] < df['고가']
  14.         df.loc[조건, 'count'] += 1
  15.     df['비중'] = df['count'] * (1/18)
  16.  
  17.     df['변동폭'] = (df['고가'] - df['저가']).shift(1)
  18.     df['목표가'] = df['시가'] + k * df['변동폭']
  19.     조건 = (df['목표가'] < df['고가']) & (df['비중'] != 0)
  20.     df['다음날'] = df['시가'].shift(-1)
  21.  
  22.     매수가 = df[조건]['목표가']
  23.     매도가 = df[조건]['다음날']
  24.  
  25.     # 슬리피지 0.3%
  26.     수익률 = 1 + ((매도가 - 매수가) * df['비중'])/매수가
  27.     수익률 = 수익률 - 0.003
  28.     수익률 = 수익률.dropna().cumprod()
  29.  
  30.     투자기간 = (df.index[-1] - df.index[0]).days
  31.     return 수익률.iloc[-1] ** (1/(투자기간/365)) - 1
  32.  
  33.  
  34. def 노이즈계산(df):
  35.     노이즈 = 1 - (abs(df['시가']-df['종가'])/(df['고가']-df['저가']))
  36.     노이즈 = 노이즈.rolling(20).mean().shift(1)
  37.     노이즈 = 노이즈.replace(np.nan, 0.4)
  38.     return 노이즈
  39.  
  40. # 백테스팅
  41. result = []
  42. ticker_list = stock.get_index_portfolio_deposit_file("20191018", "코스피 200 정보기술")
  43. for ticker in ticker_list:
  44.     df = stock.get_market_ohlcv_by_date("20190101", "20191020", ticker)
  45.     k = 노이즈계산(df)
  46.     수익률 = 변동성수익률(df, k)
  47.     print(ticker, 수익률)
  48.     result.append(수익률)
  49.     time.sleep(1)
  50.  
  51. # 평균 수익률
  52. print(sum(result)/len(result))
RAW Paste Data