스팀/스달 박스권 자동매매 돌리면서 이것 저것 살펴보다보니, 김프에 대한 자동매매 아이디어가 떠올랐습니다. 특히나 요즘같이 김프의 변동성이 높은 시점에는 박스권 자동 매매가 적절합니다. 김프는 us$를 기준으로 프리미엄이 생기는 것이므로, 크게 보면 미국 달러에 투자하는 것과 비슷합니다. 미국 달러에 직접 투자하면 변동성이 거의 없는데 비하여 김프는 뭐.. 매일 같이 요동을 치고 있습니다. 아주 좋은 트레이딩 대상이라는 말이죠.

이걸 수동으로 매매해도 되지만 아무래도 자동매매를 걸어놓아야 낮이고 밤이고 변동성이 생기면 바로 수익으로 전환이 되겠죠.

김프 자동매매하기 딱 좋은 곳이 huobi.kr입니다. huobi의 한국 사이트라고 보시면 됩니다. 이곳은 원화 입금 후 5일 동안 출금을 못하기로 유명하죠. 저야 여기에서 놀 예정이니 큰 문제는 없습니다.

usdt/krw 차트입니다. 김프를 비슷하게 따라가는 아주 변동성 좋은 차트입니다. 하방은 어느 정도 막혀있고(달러추종) 변동성은 좋고, 거래량도 꽤 되는 종목입니다. 자동매매하기 딱 좋은 종목이죠

 

아래 차트는 4시간 기준 차트인데요. 변동성이 나쁘지 않습니다.

 

일단 현금 입금을 하고, api key 등록한 후 기존 huobi 자동 매매 프로그램을 돌려보았습니다. 역시나 그냥은 안되는군요.

수정 사항들입니다.

  1. 주소 변경 : https://api-cloud.huobi.co.kr
  2. 주문단위 변경 : 기존에는 소숫점 이하 xx 자리까지 주문하는 코드였으나, usdtkrw는 소숫점자리가 0로 주문을 하더군요. 그래서 이 부분도 수정
  3. 주문하는 코드에서 무조건 float도 변경하는 부분이 있어서 usdtkrw의 경우에는 int 형태로 변경하도록 수정

이렇게 세 군데 수정하니 잘 동작합니다.

 

자동매매 프로그램을 기동한 것은 28일이었는데, 28일은 거래가 없었습니다. 오늘 오전에 상승을 하면서 1,189, 1,194에  각각 1,000불씩 매도가 되었습니다. 매도한 수량만큼 다시 매수가 들어갔고요.

 

약 3% 익절로 설정을 한 상태인데, 요즘은 김프로 6-9%를 왔다 갔다 하므로 3%는 조금 커보입니다. 2% 정도로 수정할지말지 고민 중입니다.

 

김프를 트레이딩으로 하기에는 huobi.kr이 가장 좋은 것 같습니다. huobi.kr이 처음이라면 아래 링크 이용하시면 좋을 것 같습니다.

 

-----------------

 

huobi.kr 가입링크

www.huobi.kr/maid/maidRank?invite_code=7c854

반응형

설정

트랙백

댓글

LW 전략을 돌려본 후 mdd, 수익률 등등을 보면서 성과가 얼마나 나왔는지 확인이 가능합니다. 그런데 전략을 개선하기 위해서는 언제 수익이 났고 언제 손실이 발생하였는지를 chart 그래프로 확인해볼 수 있으면 인사이트를 얻기가 더 좋을 것 같습니다.

 

일전에 candle chart에 text를 출력하는 방법에 대하여 글을 올렸었는데요. 무난하게 동작하였지만 시간만 가지고 있는 경우에 출력이 제대로 되지 않는 문제를 발견하였습니다. 또한 차트를 그리는데 시간이 너무 많이 걸려서 다른 방법을 찾아보기로 했습니다.

 

구글링을 열심히 한 결과 아래 글을 발견했습니다.

info.cloudquant.com/2019/08/candlestick_plotly/

 

Candlestick Charts in Python with Plotly - CloudQuant

A candlestick chart is one of the best ways to show Traders data. Topics: Python, Plotly, OHLC, Candlestick Charts, Jupyter, Pandas, Traders

info.cloudquant.com

 

이 글을 바탕으로 plotly를 이용하여 chart를 그리고 필요한 위치에 text를 그리는 코드를 만들어보았습니다.

 

plotly를 사용하기 위해서는 pandas를 사용하여야 합니다. 그래서 차트를 그리는 함수에서 date/open/high/low/close 데이터를 저장한 후 pandas로 읽는 부분을 추가하였습니다.

 

def draw_chart_plotly(candle_data, ticker, stat) :
    fname = 'chart.csv'
    save_ohlc(fname, candle_data)

    mcd = pd.read_csv(fname)

 

LW 전략을 수행하면 매매가 발생한 경우에 'profit' 부분에 수익금을 기록합니다. 이 정보를 바탕으로 +이면 'P(rofit)'를 -이면 'L(oss)'를 high 값 위치에 표시하도록 해보겠습니다. 

 

매매가 발생한 위치에 annotation을 추가한 후 이후에 그를 candle에 추가하면 됩니다.

 

그럼 매매가 발생한 candle에 annotation을 추가해보겠습니다. candle_data를 뒤에서 앞으로 읽으면서 profit 값이 0이 아니면 매매가 있었다는 의미입니다. 이때 값이 0보다 크면 이익(P), 아니면 손실(L)을 출력하는 annotation을 생성하여 추가합니다. 글을 쓰는 위치는 마음대로 정할 수 있습니다. 여기에서는 x값은 거래가 발생한 시간, y값은 high 값으로 정하겠습니다. default 값은 (시간,high) 위치입니다. 여기에 출력을 해보면 chadle과 겹치게 됩니다. 그래서 x, y 축 방향으로 약간 shift를 합니다. 이 값은 본인이 원하는 값을 입력하시면 됩니다. 일단은 xshift로 1, yshift로 10을 넣었습니다. 이렇게 되면 chadle 기준으로 x 방향으로는 center, y 방향으로는 high candle보다 약간 위에 text가 출력됩니다.

 

    annotations = []

    for i in range(len(candle_data)-1, -1, -1)  :# 뒤에서 앞으로
        text = 'L'
        if candle_data[i]['profit'] > 0 : # profit 이면 P lost이면 L 출력
            text = 'P'
        if candle_data[i]['profit'] != 0 :
            annotations.append(go.layout.Annotation(x=candle_data[i]['candleDateTimeKst'],
                                                    y=candle_data[i]['highPrice'],
                                                    xshift=1,  # x 축 기준으로 오른쪽으로 x칸 이동
                                                    yshift=10,  # y 축 기준으로 오른쪽으로 y칸 이동
                                                    showarrow=False,
                                                    text=text))

다음은 화면에 보여줄 layout를 정하는 부분입니다. 보여줄 데이터의 양에 따라 width를 조정합니다. test를 해보니 보여줄 데이터 수의 10배 정도가 적당하더군요. 화면에 보여 줄 title에 적절한 내용을 만듭니다. layout를 만들 때 앞에서 만든 annotations를 추가합니다. 

 

    # draw할 layout 생성
    width = len(candle_data) * 10
    layout = dict(
            title=ticker+':: # tradings : ' + str(stat.num_trading) + '  profit : ' + format(stat.get_profit_percent(), '.2f') + '%   mdd : ' + format(stat.mdd, '.2f'),
            xaxis=go.layout.XAxis(title=go.layout.xaxis.Title( text="Time"), rangeslider=dict (visible = False)),
            yaxis=go.layout.YAxis(title=go.layout.yaxis.Title( text="Price")),
            width=width,
            height=800,
            annotations=annotations
    )

candle 차트는 만드는 방법은 아주 간단합니다. 단 두 줄

    data_candle = go.Candlestick(x=data.Date,open=data.Open,high=data.High,low=data.Low,close=data.Close)
    data = [data_candle]

이렇게 만든 candle을 화면에 보여주면 됩니다. 이것도 단 두 줄

    fig = go.Figure(data=data,layout=layout)
    fig.show()

화면에 보이는 모습니다.

 

아래에 스크롤바가 있어서 좌우로 옮기면서 볼 수 있습니다.

차트를 보면 예상한대로 움직이는군요. 장대 양봉은 잘 따라가서 수익을 내고 있고, 아래/위 긴 꼬리가 나오는 경우에는 손실이 발생합니다.

 

충분히 수익이 좋아보이지만 개선할 점도 보입니다. 아래 그림과 같이 행보장에서 매수하면 손실이 발생하는 경우가 많습니다. 이렇게 횡보장에서는 매수 신호가 나오도 무시하는 코드를 넣으면 성능이 더 좋아질 것 같습니다.

 

 

수정한 소스는 아래 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_williams3.py
TR_LW.py
my_candle.py
my_util.py
sim_data/*

 

다음 글에서는 횡보장을 빼는 방법에 대하여 적어보도록 하겠습니다.

 

 

반응형

설정

트랙백

댓글

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

 

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

 

 

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

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

 

  주어진 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

반응형

설정

트랙백

댓글

공시정보는 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

 

 

반응형

설정

트랙백

댓글