(2) 편에서 기술한 LW 전략 시뮬레이션 코드를 정리(refactoring)를 해 보겠습니다.

 

우선 class를 만드는 방법을 간단하게 기술하겠습니다. 클래스는 객체지향 언어가 등장하면서 나온 개념입니다. 클래스란 유사한 성질의 객체들을 하나로 그룹화한 것입니다.  쉽게 이야기하면 목적이 유사한 함수들을 모아놓았다고 보셔도 됩니다. 

 

파이썬에서 클래스를 사용하는 방법은 아래와 같습니다.

 

class name() :

  def __init__(self) :

      # 각종 초기화

      self.var1 = 0

  def func1(self) :

      # 함수 1

  def func2(self) :

       # 함수 2

       self.func1() # 함수 1을 부를 때

       self.var1 = 1

 

목적이 유사한 함수를 name이라는 class로 선언한 경우입니다. 여기에서 __init__(self)는 초기화를 위하여 사용되는 함수인데 항상 이름이 __init__이여야 합니다 이외에는 본인이 원하는 함수명을 추가하면 됩니다. 여기에서 self가 문제인데요. 이것도 그냥 외우고 사용하시면 됩니다. self가 사용되는 경우입니다.

 

- class 내 함수의 인자는 항상 self가 먼저 들어가야합니다.

- class 내에서 class내 함수를 부를 때는 항상 self. 으로 시작합니다.

- class 내에서 class내 변수를 사용할 때는 항상 self. 으로 시작합니다.

 

 

다음으로는 import 기능입니다. py 파일 하나에 모든 클래스와 함수가 들어가 있으면 가독성이 떨어집니다. 화면 스크롤을 하면서 소스를 봐야하는데 수 십 페이지면 특정 부분을 찾기가 힘들겠죠. 그래서 class로 만든 경우에는 대부분 별도 파이썬 파일로 분리합니다. 그리고 공통 lib의 경우에도 별도 파이썬으로 분리하면 좋습니다. 다른 프로젝트를 개발할 때 사용할 수 있으니까요.

 

이렇게 분리된 파이썬 파일은 import라는 명령어를 이용하여 불러올 수 있습니다. 

 

전편에 만든 소스를 아래와 같이 파이썬 파일 3개를 추가로 만들었습니다.

 

- my_util.py : file io와 같이 공통적으로 사용하는 함수들

- my_candle.py : candle class

- TR_LW : LW class

 

이렇게 나뉘어진 class 혹은 파일을 사용하는 경우에는 아래와 같이 import를 하면 됩니다.

 

from my_util import *
from my_candle import *
from TR_LW import *

 

기존 프로그램이 총 4개의 파일로 나뉘어졌습니다. 그럼에도 불구하고 simulation 함수의 줄 수가 너무 많습니다. 여기도 손을 좀 보겠습니다. 우선 각종 통계를 위하여 사용하는 변수가 많습니다. 이런 경우에는 통계용 변수를 위한 class를 별도로 만들어 보겠습니다.

 

그냥 class 명 하나 정하고, 사용할 변수들 이동하면 됩니다. 그리고 필요한 함수도 만들면 됩니다.

 

class sim_stat :

  def __init__(self) : # 각종 통계용 변수들 초기화

  def update_stat(self, profit) : # 트레이딩이 완료되었을 때 수익금 update

 

이렇게 클래스로 뽑으면 아래와 같이 함수 한 줄로 대체가 가능합니다. 

 

그리고 거래세 관련 부분, 시뮬레이션 중간 결과 저장하는 부분, 화면에 결과를 출력하는 부분, 결과를 파일에 저장하는 부분도 별도 함수로 뽑았습니다. 역시 복잡한 내용이 사라지고 함수 한 줄로 대체가 됩니다.

 

다음으로는 트레이딩 부분도 좀 더 재사용이 가능하게 변경하였습니다.

현재 LW 로직에서는 일봉을 대상으로 하기 때문에 매수 조건을 만족하면 당일 종가로 매도가 된다고 코딩을 했었습니다.

 

하지만 당일 종가가 아닌 다른 조건에 매도를 할 수도 있기 때문에 아래와 같이 수정하였습니다.

 

if 매수조건 :

   매수

if 사졌다면 :

   if 매도 조건이면 :

      매도 

 

현재와 같이 일봉 기준으로 당일 종가에 판다고 가정하였을 때 TR_LW class에서 매도 조건은 아래과 같이 코딩이 가능합니다.

 

def is_exit_condition(self, candle) :

 

     return candle.close

 

만약 매도 조건을 바꾼다면 이 함수에서만 수정하면 됩니다. 다른 부분은 수정할 필요가 없기 때문에 오류가 날 확률이 줄어들게 됩니다. 

 

여러 변화를 준 코드를 돌려보았습니다. 이전에  만든 프로그램과 결과가 같아야 되겠죠? 같은 결과가 나왔습니다. 이렇게 기존 코드를 수정하는 경우에는 반드시 이전과 결과가 같은지 확인을 해 보아야합니다. 이런 검증 과정도 아주 시간이 많이 걸리는데요. testcase를 이용하면 좀 더 효율적으로 변경한 코드의 정확성을 확인할 수 있습니다. 이 부분도 차후에 소개하도록 하겠습니다.

 

 

전체적인 구조가 많이 변경되었지만 프로그램 내용은 변화가 없기 때문에 이해하는데 큰 문제는 없을 것입니다.

 

아직도 class로 쪼개거나 class로 만들어야 하는 부분이 더 있습니다. 우선은 여기까지만 정리해보도록 하겠습니다.

 

다음에는 현재 개발한 LW 실행 결과를 그래프로 확인하는 과정과 성능을 개선하는 과정을 소개하도록 하겠습니다.

 

 

수정한 소스는 아래 github에 있습니다.

 

github.com/multizone-quant/System_trading_ex/tree/main

 

multizone-quant/System_trading_ex

Contribute to multizone-quant/System_trading_ex development by creating an account on GitHub.

github.com

여기에서 아래 프로그램들을 다운받으시면 됩니다.

반응형

설정

트랙백

댓글

이제 본격적으로 전략 시뮬레이션을 개발해 보겠습니다. 

이 글은 시스템 트레이딩에 관심을 가지고 직접 개발해보고 싶은 전산 비 전공자를 대상으로 합니다. 가능한 쉽게 이해할 수 있도록 기술해보도록 하겠습니다.

 

이번에 개발할 전략은 Larry Williams의 변동성 돌파 전략(이하 LW)입니다. 

 

LW와 관련하여 검색을 해보니 좋은 글들이 많았습니다. 이 중 heybit에서 LW를 실제 운영 중이라고 하는군요. 여기 나오는 전략을 개발해보도록 하겠습니다. 

support.heybit.io/ko/articles/2297782-

 

헤이비트의 '변동성 돌파 전략' 상세 안내

헤이비트 핵심 트레이딩 전략인 '변동성 돌파'에 대해 상세 안내 합니다.

support.heybit.io

이외에도 systraders79님의 아래 글도 굉장히 좋습니다. 이제 막 퀀트를 시작하시는 분들은 일독을 권합니다.

cafe.naver.com/invest79

 

systrader79의 실전 주식 투... : 네이버 카페

초보자도 따라할 수 있는 안전하고 쉬운 주식/ETF 포트폴리오 투자법을 공개합니다 미국주식투자

cafe.naver.com

 

전략에 대한 자세한 설명은 위에 Heybit글을 참고하시면 될 것 같습니다.

 

LW를 개발하기 위하여 필요한 사항을 정리해보겠습니다.

 

1. test 대상 ticker : 암호화폐 BTC, ETH

2. back data : 2017-09-25 ~ 2020-11-12 일봉 데이타. 

3. 거래 규칙 :

   매수 : 일봉 데이타의 high 값이 매수 예정 가격(시가+전일 변동성*k)보다 높으면 매수

   청산 : 당일 종가 (주식의 경우에는 다음 날 시초가 매도가 성과가 좋다고 알려져 있으나 암호화폐는 24시간 거래가 되므로 다음 날 시초가 의미가 없음)

   수수료 : 0.035% (upbit 기준)

   일단 k = 0.5로 고정, noise는 사용하지 않습니다.

 

전략을 돌려보기 위해서는 준비해야할 것들이 많습니다. 우선 파일에 저장된 과거 데이터를 읽어와야 합니다. 이런 부분은 전략을 만드는 것과는 크게 관련이 없기 때문에 제가 소개해드리는 코드를 그냥 사용하시면 됩니다.

 

기본 함수들

- read_csv_to_dict() :  csv 형태로 저장된 과거 데이터를 dict 형태로 돌려주는 함수

- save_to_file_csv() : 전략 test 중 중간 값들을 보관한 후 그 결과를 csv 파일에 저장하는 함수. 이렇게 하는 이유는 LW가  제대로 동작하였는지 excel로 검정해보기 위하여 사용합니다.

- class Candle() : candle 데이터를 묶어서 처리하는 class. class라는 용어가 나오는데, 일단은 관련 함수의 집합이라고 생각하시면 됩니다. 앞으로 Candle()을 발전시켜서 분/일봉 관리 그리고 각종 지표들도 모두 구현해볼 예정입니다.

- make_candle_info() : simluation 데이터를 candle로 바꾸어 주는 함수

 

여기까지는 그냥 이런 함수들이 필요하다 정도만 생각하시고 내용은 무시하여도 됩니다.

 

이 함수들을 바탕으로 이제 본격적으로 전략 시뮬레이터를 만들어보겠습니다. 일단은 막 짜보겠습니다. 막 짠 코드이기 때문에 직관적이고 읽기 좋은 코드입니다 :)

 

시뮬레이터는 아래와 같은 형식으로 동작할 것입니다.

 

백데이터 읽기

LW 초기화 ( 가장 오래된 일봉에서 range값 구함 )

while(모든 데이터에 대하여) :

    if 매수 조건을 만족하면 :

         수익 = 오늘 종가 - 매수가격 

         누적수익 += 수익

 

print(누적수익)

 

LW와 관련된 구현내용입니다. 이것도 편의상 class로 개발해보았습니다. 앞에서 설명하였듯이 class는 그냥 관련 함수의 집합이다라고 생각하시면 이해가 편하실 것입니다.

 

class TR_LW()은 크게 세 함수로 구성되어 있습니다.

- __init__() : 초기화 함수, LW에서 사용하는 변수를 초기화 합니다. k 값은 일단 0.5로 사용합니다.

- update_new_range() : 새로운 일봉으로 변경하는 부분입니다. range 값을 update합니다. 

- is_enter_candle() : 주어진 일봉에 대하여 매수 가능한지 여부를 판단합니다. 주어진 일봉의 고가가 매수예정가 보다 높으면 매수 예정가를 돌려줍니다. 아니면 0 return

 

이제 주 함수인 simulation() 입니다.

test용 백데이터는 candle_data에 저장되어 있습니다. simulation 중 발생하는 데이터를 기록하고 싶으면 이 변수에 추가를 하면 됩니다. 일단은 buy한 일봉에 대하여 buying 가격, 수익, draw down 값을 저장하도록 하겠습니다. 개발 과정에서 궁금한 변수가 있으면 여기에 계속 추가하면 됩니다.

 

    # simulation 중 파일에 저장할 변수들 추가 [-1]은 가장 마지막을 의미함
    candle_data[-1]['buying'] = 0 # buy 여부 저장
    candle_data[-1]['profit'] = 0 # profit 저장

    candle_data[-1]['total_profit'] = 0 # total_profit 저장
    candle_data[-1]['dd'] = 0 # downd draw 저장

 

시뮬레이션에 필요한 변수를 초기화합니다. 초기 투입금액, 각종 통계용 변수들 등등

 

candle_data는 내림차순으로 저장되어 있기 때문에 simulation은 뒤에서 앞으로 읽어가면서 처리합니다.

 

    for i in range(len(candle_data)-2,-1,-1)  :# 내림차순으로 저장되어 있으므로 뒤에서 한개씩

 

매수 조건을 만족하는 일봉이라면 아래 일들을 합니다.

 

1. 매수 금액 결정 : 매수 금액을 복리로 할지 단리로 할지 결정을 해야합니다. 일단 최대 초기 원금으로 투자하는 것으로 하겠습니다. 다만 원금 손실이 발생하면 초기 원금보다 적을 수 있으므로 현재잔고(balance)와 초기원금(deposit) 중 min 값을 매수가능 금액으로 결정합니다.

            # 매수 금액 결정, min(balance, deposit) 초기 deposit 금액 혹은 balance가 초기 deposit 이하이면 balance
            buying_amount = min(balance, deposit)

 

2. 매수 수량을 구한 후 종가에 매도 기준으로 수익을 계산한 후 balance update합니다.

3. 수수료를 계산하여 balance에 update합니다.

4. 통계를 위한 변수들을 update

5. log를 위하여 필요한 변수들을 저장

 

이렇게 모든 데이터에 대하여 돌린 후에는 그 결과를 csv 파일 형태로 저장합니다.

다음에는 simulation 결과를 간단하게 화면에 표시합니다.

마지막으로 simulation 결과를 파일에 저장합니다 파일 이름은 임의로 정의하시면 됩니다.

 

simulation을 위한 준비가 끝났습니다. 이제 이 함수를 부르기만 하면 됩니다.

이 함수는 ticker와 백데이터가 저장된 파일명, 전략을 인자로 받습니다.

 

simulation(ticker, fname, tr_logic)

 

simulation을 부를 때 전략을 전달하기 때문에 앞으로는 전략만 개발하면 됩니다. 

 

fname = '.\\sim_data\\BTC_day-2017-09-25-2020-11-12.csv'

ticker = 'KRW-STEEM'

# Larry William 변동성 돌파, 일봉 사용

tr_logic = TR_LW('day', 1)

 

simulation(ticker, fname, tr_logic)

 

2017년 09월 25일 부터 2020년 11월 12일 동안 BTC 일봉으로 돌려보았습니다. 올해 BTC가 상승세를 보여서인지 1백만원 투입해서 수수료 제외하고 약 2.9백만원이 되었군요. 

LW 전략이 암호화폐에 좋다는 이야기는 많이 들었는데, 역시나 좋군요.

 

github에 올린 코드를 보면 직관적으로 막 짰기 때문에 조금 지저분한 느낌이 듭니다. 새로운 전략이 나올 때 마다 코드 수정량이 많으면 생산성이 떨어지기 때문에 코드를 조금 정리를 해야합니다.

 

다음에는 이번에 소개해드린 코드를 조금 정리해서 향후 새로온 전략을 적용하기 좋은 형태로 바꾸어 보겠습니다.

 

소스코드는 아래에 있습니다.

github.com/multizone-quant/System_trading_ex/blob/main/Larry_williams1.py

 

multizone-quant/System_trading_ex

Contribute to multizone-quant/System_trading_ex development by creating an account on GitHub.

github.com

주의사항.

 

시뮬레이션 결과가 저장된 파일이 열려있으면 동작 중 오류가 발생합니다. 따라서 시뮬레이션을 돌릴 때는 결과가 저장된 파일은 반드시 닫아야 합니다.

반응형

설정

트랙백

댓글

본인이 만든 전략을 실전에 적용하기 전에 과거 데이터를 이용하여 수익이 나는지 시뮬레이션을 해 보아야합니다. 물론 과거 데이터로 이익이 났다고 실전에서 수익이 난다는 보장은 없습니다. 하지만 개략적인 전략의 수익 정도를 파악할 수는 있습니다.

 

우선 암호화폐 기준으로 작업을 먼저해보겠습니다. 그 후 선물/주식에 대해서도 확장하도록 하겠습니다.

 

시뮬레이션을 위하여 첫 번째로 해야할 일은 과거 데이터를 확보하는 것입니다. 최대한 많은 데이터를 확보하여야 의미있는 결과를 볼 수 있습니다만, 과거 데이터 확보하는 것이 간단하지는 않습니다.

 

일단 업비트 거래소의 과거 데이터를 받아보도록 하겠습니다.

 

업비트 거래소 API를 이용하여 과거 candle 데이터를 얻을 수 있습니다. 하지만 업비트 거래소에 얻을 수 있는 과거 데이터는 아주 제한적입니다. 그래서 업비트 거래소 데이터를 제공하는 아래 사이트에서 과거 데이터를 구해보겠습니다.

 

crix-api-endpoint.upbit.com

 

일단 일봉을 구해보겠습니다. 일봉을 구하는 REST API는 아래와 같습니다.

crix-api-endpoint.upbit.com/v1/crix/candles/days

 

여기에 필요한 정보를 추가하면 됩니다.

- 코인명

- candle의 수량

- 범위

 

예를들어 가장 최근 KRW-BTC 일봉 10개를 받고 싶으면 아래 url을 보내면 됩니다.

crix-api-endpoint.upbit.com/v1/crix/candles/days?code=CRIX.UPBIT.KRW-BTC&count=10

 

 

그 결과는 아래와 같습니다.

 

한번에 얻을 수 있는 최대 candle의 수는 400개 입니다. 따라서 400개를 얻은 후 범위를 조정하여 이전 400개를 받는 방식으로 하면 최대 2017년 9월 말 자료까지 얻을 수 있습니다.

 

관련 코드는 아래 github에 올려놓았습니다. 

github.com/multizone-quant/system-trading/blob/master/get_upbit_day_candles.py

 

multizone-quant/system-trading

logics for system trading. Contribute to multizone-quant/system-trading development by creating an account on GitHub.

github.com

첫 400개를 받은 후 마지막 일자를 보고 to 값을 만들어서 다시 보내는 방식으로 수정을 하면 자동으로 데이터를 뽑을 수는 있을 것 같습니다. 일단은 수동으로 첫 excel 파일을 열어본 후 마지막 to 값을 설정해서 다운받는 방식입니다.

 

BTC, ETH, EOS, XRP, STEEM 일봉 candle은 아래 위치에 저장되어 있습니다.

github.com/multizone-quant/system-trading/tree/master/sim_data

 

multizone-quant/system-trading

logics for system trading. Contribute to multizone-quant/system-trading development by creating an account on GitHub.

github.com

다음 글에서는 이 자료를 이용하여 Larry Williams 변동성 전략을 적용한 simulator를 만들어보겠습니다.

 

 

 

반응형

설정

트랙백

댓글

개발한 로직으로 시뮬레이션을 하면서 가장 필요한 부분 중의 하나가 진입/탈출한 시점을 그래프로 쉽게 보는 것입니다. candle 차트는 쉽게 그릴 수 있지나 진입 위치를 text로 표기하는 방법은 어렵더군요.

 

그러던 중 지인의 소개로 좋은 패키지를 발견했습니다. 

 

오늘 소개드릴 내용은 진입/청산 한 위치를 차트에 표시하는 방법입니다.

 

사용할 패키지는 mplfinance 입니다. 파이썬 3.7 이전에서는 mpl_finance 이름으로 설치하시면 됩니다.

 

파이썬 3.7이상 사용하시는 분은 아래 방식으로

pip install --upgrade mplfinance

파이썬 3.6 이하 사용하시는 분은 아래 방식으로 설치하시면 됩니다.

pip install --upgrade mpl_finance

 

 

일단 결론부터 말씀드리겠습니다. 차트를 그리면서 원하는 캔들의 임의의 위치(위, 아래)에 text 혹은 화살표를 그릴 수 있습니다.

 

 

글자를 쓰는 경우 (주석달기)

 

ohlc.values는 [날짜, 시가, 고가, 저가, 종가, ...] 이렇게 구성되어 있습니다. 

 

첫 번째 캔들

ohlc.values[0][0] : 첫 번째 캔들의 날짜

ohlc.values[0][1] : 첫 번째 캔들의 시가

ohlc.values[0][2] : 첫 번째 캔들의 고가

ohlc.values[0][3] : 첫 번째 캔들의 저가

ohlc.values[0][4] : 첫 번째 캔들의 종가

 

4번째 캔들이 진입 시점이라고 가정하고 표기해보도록 하겠습니다.

 

글자를 쓸 x,y 위치를 결정합니다.

4번째 캔들이므로 x 값은 ohlc.values[3][0]으로 정합니다.

y값은 원하는 위치를 정하면 됩니다. 진입이므로 저가 밑에 표기하는 것이 좋을 것 같습니다.

4번째 캔들의 저가는 ohlc.values[3][3]입니다. 

 

xy=(ohlc.values[3][0],ohlc.values[3][3])

 

글자를 쓸 곳을 지정하는 방법입니다.

진입을 표시하는 경우에 통상 저가 밑에 표기합니다. 이 경우에도 글자를 쓰기 시작할 x,y 위치를 지정합니다.

x 값은 4번째 캔들의 날자 값인 ohlc.values[3][0]로 정합니다. 그런데 이렇게 x 좌표를 입력하면 오른쪽으로 치우져서 글자가 표기됩니다. 그래서 -0.5 정도 왼쪽으로 옮겨서 출력하게 합니다.

y 값은 저가 기준으로 -30 정도 위치에 표기하도록 합니다.

 

xytext=(ohlc.values[3][0]-0.5,ohlc.values[3][3]-30)) 

 

위에서 기술한 내용을 모아서 코딩을 하면 아래와 같이 됩니다.

 

ax.annotate('Enter',xy=(ohlc.values[3][0],ohlc.values[3][3]),

                    xytext=(ohlc.values[3][0]-0.5,ohlc.values[3][3]-30)) 

 

탈출의 경우에는 같은 방식으로 하되 y 값을 고가 기준으로 +20 정도가 적당합니다.

 

화살표와 단어를 쓰는 경우

 

화살표가 표시되면 뭔가 더 있어보이겠죠. 화살표를 사용하기 위해서는 arrowprops인자를 추가하면 됩니다. 화살표의 색과 두께도 설정가능합니다.화살표의 시작점은 xytext위치이고, 끝점은 xy에 표시한 곳입니다. 위 그림과 같이 진입시 위쪽을 향한 화살표를 그리는 코드는 아래와 같습니다.

 

ax.annotate('Enter',xy=(ohlc.values[1][0],ohlc.values[1][3]-10),

                    xytext=(ohlc.values[1][0]-0.5,ohlc.values[1][3]-100), 

                    arrowprops=dict(facecolor='red', shrink=0.02))

 

진입/탈출 시점을 그래프 상에서 한눈에 볼 수 있어서 로직 검증하기에 참 편합니다. 

 

소스코드는 아래 github에 공유되어 있습니다.

https://github.com/multizone-quant/system-trading/blob/master/drawing_chart_with_annotation

 

data.csv 파일도 함께 다운받으세요.

반응형

설정

트랙백

댓글

자동 매매를 하게 되면 사지 말아야 할 주식이 있습니다. 예를들어 관리종목이라든가 본인이 싫어하는 종목 등등이 있겠죠. 혹시라도 매매할 대상으로 이런 종목이 선정이 되면 무시하는 부분을 추가하여야 합니다. 추가로 거래량이 별로 없는 종목들도 빼야합니다. 그래서 자동 매매를 할 때는 개인적으로 빼야할 종목 기록한 파일을 하나 더 사용을 합니다.

 

네이버 주식에서 관리종목, 거래중지 종목을 검색할 수 있습니다.

 

 

우선 관리종목과 거래정지 종목은 아래 링크로 검색할 수 있습니다.

위 두 링크에서 검색이 되는 종목을 뽑아보겠습니다.

 

  주어진 url에서 BeautifulSoup을 이용하여 html 구조를 얻는다.

 

  html 구조에 \tr로 시작하는 부분을 검색한 후

       \th 부분에 있는 title 이름을 얻는다.

 

  html 구조에 \td에 있는 주식 정보를 얻는다.
       정보 중 종목명을 찾은 후 이에 해당하는 code를 찾아서 list에 보관

 

  파일에 결과를 json 형태와 csv 형태로 저장한다. 

 

 

전체 소스코드는 아래 깃허브에 있습니다.

https://github.com/multizone-quant/system-trading/blob/master/get_warning_stock_list

반응형

설정

트랙백

댓글

거래소가 열리는 날은 공휴일과 특별한 일자를 제외한 주중입니다. 자동 매매 로직 중 어제 정보를 활용하는 경우가 있습니다. 이때 어제 값을 받을 수 있는 함수가 있으면 편리할 것 같습니다.

 

그래서 거래소 관점에서의 어제를 구하는 파이썬 함수를 만들었습니다.

 

어제 일자를 구하는 방법은 다음과 같습니다.

 

현재 시각의 time_t 값을 구합니다. time_t값으로 현지 시각을 구합니다.

이때 현지 시각은 아래 구조를 가집니다. 여기에서 관심이 있는 값은 tm_wday 입니다. 월요일이 0으로 시작해서 일요일은 6의 값을 갖습니다.

우리가 구하고 싶은 어제는 86400초(하루)  값을 뺀 후 다시 아래 구조 값을 받으면 됩니다. 만약 월요일(tm_wday 값이 0)인 경우에는 토/일을 빼야하기  86400*3초(사흘) 값을 빼면 됩니다.

 

0

tm_year

(for example, 1993)

1

tm_mon

range [1, 12]

2

tm_mday

range [1, 31]

3

tm_hour

range [0, 23]

4

tm_min

range [0, 59]

5

tm_sec

range [0, 61]; see (2) in strftime() description

6

tm_wday

range [0, 6], Monday is 0

7

tm_yday

range [1, 366]

8

tm_isdst

0, 1 or -1; see below

N/A

tm_zone

abbreviation of timezone name

N/A

tm_gmtoff

offset east of UTC in seconds

이렇게 얻은 값에서 년,월,일로 원하는 형태를 만들어서 돌려주면 됩니다.

 

주식 시장 관점에서 어제를 구하는 함수는 아래 github에 있습니다. 추가로 해야할 일은 주식 시장이 열리지 않는 공휴일과 몇몇 특별한 날도 제외하는 부분을 추가하는 것입니다.

 

 

https://github.com/multizone-quant/system-trading/blob/master/get_yesterday

 

multizone-quant/system-trading

logics for system trading. Contribute to multizone-quant/system-trading development by creating an account on GitHub.

github.com

 

 

반응형

설정

트랙백

댓글

공시정보는 Dart에서 확인이 가능합니다.

 

https://dart.fss.or.kr/

 

전자공시시스템 - 대한민국 기업정보의 창, DART

 

dart.fss.or.kr

 

기업에 대한 다양한 정보가 올라오기 때문에 이를 활용하여 투자에 이용하는 경우가 많습니다. 특히 대주주 변동이 공시에 뜨면 주가가 급변하는 경우가 많습니다. 대주주 지분 증가, 신규 대주주 지분 취득 등의 공시가 나오면 자동으로 매수를 하는 전략을 사용할 수 있습니다. 

 

이를 위하여 Dart에서 공시 정보를 실시간으로 읽어오는 파이썬 프로그램을 만들어 보겠습니다.

 

웹크롤링을 이용하여 공시 정보를 받아올 수 있지만, Dart에서 제공하는 Open API를 이용하는 것이 좋을 것 같습니다.

 

Dart Open API를 이용하기 위해서는 회원 가입을 한 후 인증키를 신청하여 받은 후 사용이 가능합니다.

 

 

인증키를 받은 후 특정기업의 대주주 지분 변경 사항을 받아올 수 있는 파이썬 코드입니다.

 

우선 이를 위한 url을 확인해보겠습니다. 개발 가이드를 클릭한 후 왼쪽에 있는 정보 중 원하는 것을 선택하면 제공하는 정보 목록이 나옵니다. 이 중 원하는 API가 있는 경우에 오른쪽에 있는 바로가기를 누르면 url 예제가 나옵니다.

 

 

예를들어 지난 주 지분변경 정보를 위한 url은 다음과 같습니다.

 

opendart.fss.or.kr/api/list.json?crtfc_key=4b57e83413f2c5dc3e40db6747f524f6e75209a0&pblntf_ty=D&&bgn_de=20200518&end_de=20200522&corp_cls=Y&page_no=1&page_count=10 

이러한 정보를 바탕으로 지분 변경 공시 사항을 확인할 수 있는 파이썬 코드는 다음과 같습니다.

 

사용법은 다음과 같습니다.

~~~

res = find_major_holder_change_all('D', '20200518', '20200522')  # type, begin, end
print('')

~~~

 

지분 변경 공시 중 주가에 영향을 미칠만한 사항이 있는 경우에 매수 혹은 매도 주문이 가능할 것 같습니다. 매수한 후 언제 팔지에 대한 전략도 만들어야겠지요?

 

파이썬 소스코드는 아래 github에 있습니다.

 

https://github.com/multizone-quant/system-trading/blob/master/share_holder_info_DART.py

반응형

설정

트랙백

댓글

지난 번에 올린 상승 종목에 이어 전략을 적용하려면 증시에 상장된 모든 종목의 일봉 정보도 필요합니다. 이 정보 역시 naver에서 가져올 수 있습니다.

 

아래 그림에서 보듯이 네이버에서 가져올 수 있는 정보가 다양합니다만, 한 시점에 6항목을 고를 수 있습니다. default로 설정되어 있는 값은 본인이 원하는 값과 틀린 경우에는 필요한 정보를 선택을 하여야 합니다.

 

이렇게 웹 페이지에서 원하는 항목을 선택하기 위해서는 webdriver를 설치하여 페이지를 그려야합니다. 브라우저에 따라 webdriver가 있는데 아래는 chrom driver를 사용한 예입니다. chrom driver를 인터넷에서 찾아서 down받은 후 저장된 위치를 지정하여 사용하면 됩니다.

 

크롬웹드라이버에서 웹 페이지를 읽은 후 원하는 항목을 선택하는 방식을 이용하면 됩니다. 우선 원하는 url을 지정하여 화면에 뜨는 상태를 확인합니다. 

 

우리가 필요한 것은 오늘 일봉 정보가 필요합니다. 즉 시가/고가/저가가 필요합니다. 이를 위하여 필요한 항목을 찾아서  click() 함수를 호출하고, 불필요한 항목을 찾아서 click()함수를 호출하면 원하는 항목으로 변경이 가능합니다. 

 


    driver = webdriver.Chrome("C:\\my\\chromedriver.exe")
    url = https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1'
    driver.get(url)

    driver.find_element_by_xpath(".//*[contains(text(), '고가')]").click()
    driver.find_element_by_id("option7").click()  # 시가
    driver.find_element_by_xpath(".//*[contains(text(), '저가')]").click()
    driver.find_element_by_xpath(".//*[contains(text(), '외국인비율')]").click()  # 삭제
    driver.find_element_by_xpath(".//*[contains(text(), '상장주식수')]").click()  # 삭제
    driver.find_element_by_xpath(".//*[contains(text(), 'ROE')]").click()  # 삭제

    driver.find_element_by_css_selector('[alt="적용하기"]').click()

이렇게 설정을 하면 아래와 같이 원하는 항목만 선택이 가능합니다.

 

 

코스피와 코스닥 정보를 얻을 수 있는 url은 다음과 같습니다.

한 화면에 보이는 종목의 수는 최대 50개이므로 페이지를 계속 변경해가면서 정보를 크롤링해야합니다.

url에 페이지 정보를 추가할 수 있습니다. page 번호를 증가시키면서 검색을 계속하면 됩니다.

https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1&page=2

이러한 정보를 바탕으로 코스피, 코스닥 전 종목 일봉을 받아오는 크롤링 프로그램을 만들어보겠습니다.

우선 코스피, 코스닥 기본 url을 지정을 합니다. 현재 네이버에서 검색이 가능한 코스피,코스닥 각각의 최대 page 수를 지정합니다. 이후에는 loop를 돌면서 page 수를 증가시키면서 해당 page의 시세 정보를 가져오는 get_stock_list()를 부릅니다.

 

 

아래 함수는 특정 url에 있는 주식 시세 정보를 뽑아내는 함수입니다. (자세한 사항은 github 코드 참고)

 

~~~

def get_stock_list(url, cnt) :

~~~

 

네이버에서는 최대 6개까지 검색할 항목을 지정할 수 있는데요. 꼭 필요한 정보만 설정을 했습니다. 만약 다른 정보가 추가로 필요하다면 설정을 바꾼 후 한번 더 호출하면 될 것 같습니다.

해당 페이지에서 주식 시세를 뽑는 방법은 이전 글에서 설명한 상승종목 뽑는 방식과 동일합니다. 다만 첫 컬럼에 있는 no 값이 1부터 시작하는 것이 아니라 페이지 별로 50씩 증가하는 값을 입력을 받아서 사용하는 부분만 차이가 납니다.

 

이렇게 뽑혀진 주식 시세는 별도 파일에 저장하여 향후에 다시 사용합니다. 저장하는 방법은 json 형태로 해도 되고, cvs 형태로 할 수도 있습니다.

 

 

소스코드는 git hub에 올려 놓았습니다. 

github.com/multizone-quant/system-trading/blob/master/day-bong-list-soup.py

 

multizone-quant/system-trading

logics for system trading. Contribute to multizone-quant/system-trading development by creating an account on GitHub.

github.com

 

 

반응형

설정

트랙백

댓글

시스템 트레이딩을 위하여 필요한 정보를 모아보도록 하겠습니다.

이번에 개발할 로직은 코스닥에서 상승 추세 종목 찾아서 매매하기입니다.

 

이를 위하여 오늘 상승한 종목을 구해야합니다.

이베스트 xing api에서는 전 종목 일봉 데이터를 얻을 수는 있지만 시간이 많이 걸린다고 합니다.

 

네이버에 있는 주식 관련 정보 중 상승종목을 보여주는 페이지가 있습니다. 제가 필요한 정보가 바로 이겁니다.

 

화면에 보여주는 정보는 최대 7개를 설정할 수 있습니다. 제가 설정한 정보는 거래량,시가,고가,저가,시가총액,per,poe 입니다. 이를 바탕으로 코딩을 했습니다. 혹시라도 다른 정보가 필요하다면 필요한 항목을 선택하시고, 아래 title_list의 내용도 함께 변경하시기 바랍니다.

 

~~~

    title_list = ['no', 'name', 'close', 'diff', 'per', 'qty', 'open', 'high', 'low', 'sichong', 'per', 'pbr']

~~~

 

이제 이 정보를 크롤링을 해서 파일에 저장한 후 사용을 하면 되겠죠. 오랜만에 크롤링을 해 봅니다.

특정 페이지를 크롤링을 하기 위해서는 크롬에서 개발자모드로 들어가서 해당 페이지의 html 구조를 파악해야 합니다. 다행히 이 페이지는 table 형태로 구성이 되어 있어서 크롤링하는데 문제가 없습니다.

오랜만에 사용하는 package라 구글링으로 사용법을 찾아보면서 코딩을 했습니다.
urllib로 해당 페이지 내용을 읽어오고, BeautifulSoup으로 html 문서 파싱을 하면 됩니다.

화면에 보이는 그대로 html 문서가 구성되어 있기 때문에 중간에 공백도 있고 줄도 있습니다. 이런 부분들은 제거하고 주식 정보만 뽑는 코드는 다음과 같습니다. 

 

첫 글짜가 숫자인 경우에 한하여 일련번호를 증가시키면서 해당하는 종목 정보를 저장합니다. 첫 글짜가 숫자가 아닌 경우에는 except가 발생합니다. 이런 경우에는 그냥 무시하시면 됩니다.

 

그리고 크롤링한 결과 날짜별로 이름을 붙여서 저장하는 것으로 마무리합니다.

장이 끝나면 이 프로그램 한번 돌려서 오늘 상승한 종목을 저장해 놓은 후 다음 날 장 시작하기전에 투자 검토 대상을 뽑은 후 조건을 만족하면 자동 매수를 하면 될 것 같습니다. 

 

해당 코드는 아래 github에 올려놓았습니다.

 

https://github.com/multizone-quant/system-trading/blob/master/ascending-stock-list.py

 

 

반응형

설정

트랙백

댓글