요즘 암호화폐 시장이 불장입니다. 

특히 DeFi 관련 코인들이 연일 상승을 하고 있었는데요. 지금은 조정 중입니다. 하지만 DeFi가 금방 끝날 테마가 아니기 때문에 잠시 조정 후 다시 상승할 것으로 예상합니다.

 

DeFi 말은 많이 들었는데, 이번 기회에 Dforce에 유동성 공급을 해 보았습니다.

 

dforce에 staking 혹은 유동성 공급자에 대한 현재 수익률입니다.
https://staking.dforce.network/

 

dForce Staking

 

staking.dforce.network

 

 

DAI만 스테이킹 하여도 58.51%나 나오는군요. 기왕하는 김에 최고 수익률을 보여주고 있는 DF/USDx 유동성 공급을 해 보기로 했습니다.

 

그런데 마땅하게 한글로 된 참고할 글이 검색이 안됩니다. google에서  검색을 해보니 제가 딱 원하는 글을 발견했습니다. 아래 글을 참고하여 유동성 공급에 성공하였습니다.

 

https://medium.com/dforcenet/how-to-participate-in-dforce-governance-token-df-liquidity-mining-starts-from-22-00-utc-8-3-4ed5dd6fc052

 

How to Participate in dForce Governance Token (DF) Liquidity Mining — Starts from 22:00 UTC+8, 3…

IMPORTANT: Please do NOT directly transfer any digital assets to the contracts, which will cause a permanent loss and we cannot help…

medium.com

 

그 과정을 설명합니다.

 

  1. USDT 구입 : probit에 있던 원화로 usdt 구입 
  2. DF 구입 : mxc 거래소 신규 가입하여 mxc 구입
  3. USDT, DF를 MEW 주소로 전송 (전송 수수료 2번)
  4. USDT로 USDx swap (전송 수수료 2번)
    https://trade.dforce.network/
  5. USDx, DF를 유동성 풀에 추가하면 UNI-V2가 생김 (전송수수료 2번)
    https://app.uniswap.org/#/add/0xeb269732ab75a6fd61ea60b06fe994cd32a83549/0x431ad2ff6a9c365805ebad47ee021148d6f7dbe0
  6. staking을 누르면 끝 (전송 수수료 1번)
    https://staking.dforce.network/dapp/DF-USDx

그런데 이 과정에서 총 7번의 eth 전송 수수료가 발생하였습니다. 경우에 따라 수수수가 다르지만 총 60불 정도 나왔습니다. 적은 금액으로 유동성 공급하기에는 수수료가 더 나오는 문제가 생기는군요.

 

그리고 그 과정이 생각보다 애매한 경우도 많고, 확신도 안가고, 암튼 겨우 겨우 성공했습니다.

 

현재 채굴되고 있는 df 수량은 아래 사이트에서 확인이 가능합니다.

https://staking.dforce.network/dapp/DF-USDx

 

dForce Staking

 

staking.dforce.network

 

채굴이 잘 되고 있군요. 현재 DF 가격이 하락하고 있는 추세여서 채굴 수익률은 400% 보다 적게 나오는 것 같습니다. DF는 아직 메이저 거래소에 상장하지 않았기 때문에 향후 상장 펌핑도 기대해볼 수 있을 것 같습니다.

 

얼마 전 YAM 코드 오류로 프로젝트 실패를 선언했었죠. 수익률이 높다는 것은 그 만큼 리스크가 크기 때문에 소액만 투자하시기 바랍니다. 단 전송 수수료 감안하시어 수익률을 별도로 계산하셔야 할 것 같습니다.

 

이 채굴은 8/3-8/23일까지 한시적으로 운영됩니다. 자세한 사항은 아래 글 참고하세요.

https://medium.com/dforcenet/dforce-kicks-off-liquidity-mining-starting-from-22-00-utc-8-august-3-2020-d066698c4dc4

 

암호화폐 시장은 역시 선빵이 중요한 것 같습니다. 

 

-------

 

mxc 거래소 가입하실 분은 아래 ref가 있는 링크 이용하시면 감사하겠습니다.

https://www.mxc.ai/auth/signup?inviteCode=14SJ4

 

반응형

설정

트랙백

댓글

개발한 로직으로 시뮬레이션을 하면서 가장 필요한 부분 중의 하나가 진입/탈출한 시점을 그래프로 쉽게 보는 것입니다. 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 파일도 함께 다운받으세요.

반응형

설정

트랙백

댓글

주식선물 마스터코드를 조회하는 T8401 구현하였습니다.

함수명은 아래와 같고, 인자는 필요가 없습니다.

def stock_future_master_code()

 

조회결과는 아래와 같이 4 값을 인자로 갖는 리스트의 리스트가 돌아옵니다.

[종목명, 단축코드, 확장코드, 기초자산코드]

 

사용법은 아래와 같습니다.

간단하게 test용으로 사용하기 위하여 gui에 포함하지 않았기 때문에 이 함수를 사용하려면 USING_GUI를 0으로 변경한 후 실행하여야 합니다.

 

USING_GUI = 0

 

조회 결과는 rets[0]에 리스트로 저장되어 있습니다. 

 

rets = stock_future_master_code()

cnt = 0

for ret in rets[0] :

  print(ret)

 

 

최초 10개만 출력한 예

 

반응형

설정

트랙백

댓글

자동매매프로그램을 돌리는 와중에 외출할 경우에는 신경이 많이 쓰입니다. 봇은 잘 동작하고 있는지 다른 큰 문제는 없는지 지 등등 자동매매 프로그램의 상태를 알고 싶죠. 이런 경우에 원격데스크탑 sw를 이용하여 pc에 접속할 수 있습니다만, 간단하게 휴대폰에서 자동매매 프로그램의 상태를 확인할 수 있으면 좋을 것 같습니다.

 

이번에 알아볼 내용은 텔레그램봇을 이용하여 xing api와 연동하는 부분입니다. 우선 텔레봇을 만들고 메세지를 주고 받는 방벙에 대하여 알아보겠습니다.

 

우선 텔레그램봇을 만드는 과정입니다.

일단 텔레그램을 휴대폰에 설치하신 후 아래와 같이 botfather를 찾은 후 선택을 합니다.

 

그 후 /newbot 을 입력한 후 봇을 설명하는 문구를 입력합니다.

 

다음으로는 봇의 이름을 입력합니다. 원하는 이름을 입력하시면 되는데, 만약 이미 등록된 봇과 같은 이름은 사용할 수 없습니다. 그러면 해당 이름의 봇이 사용할 token을 알려줍니다. 아래 빨간색으로 줄쳐진 부분이 XingTrBot의 ID라고 보시면 됩니다. 이 값을 프로그램에 사용하여야 합니다.

 

 

이제 나만의 telegram bot이 만들어졌습니다. telegram에서 찾아보죠.

앞에서 입력한 봇 이름을 검색하면 됩니다.

 

해당 봇을 선택한 후 /start를 누르면 봇이 동작상태가 됩니다.

 

이제 telegram 쪽에서 작업할 내용은 모두 끝났습니다. 파이썬 프로그램으로 bot과 대화하는 방법에 대하여 알아봅시다.

 

 

우선 telegram bot 파이썬 패키를 설치합니다.

 

pip install python-telegram-bot --upgrade

 

코드 상에서는 아래 패키지와 함수를 import하면 됩니다.

 

import telegram

from telegram.ext import Updater, MessageHandler, CommandHandler

 

그 후 my_token에 botFather가 준 token값을 복사합니다.

 

my_token = 'gotFather가 준 토큰'

 

동작방법은 간단합니다. '/'로 시작하는 경우에는 명령어로 구분합니다. '/'가 없으면 일반 메세지이고요.

 

명령어와 일반 메세지가 들어왔을 때 불리어지는 함수(handler)를 등록하면 끝입니다. 

 

우선 updater를 생성하고요.

 

updater = Updater(my_token)

 

작업을 하다보니 telegram_bot 버전이 upgrade되면서 사용방법이 많이 바뀌었습니다. 자세한 사항은 아래 참고하십시요.

https://github.com/python-telegram-bot/python-telegram-bot/wiki/Extensions-%E2%80%93-Your-first-Bot

 

python-telegram-bot/python-telegram-bot

We have made you a wrapper you can't refuse. Contribute to python-telegram-bot/python-telegram-bot development by creating an account on GitHub.

github.com

전체적인 사용법은 변화가 없는데, handler 함수가 불리어질 때 함수 인자가 변경이 되었습니다. 새 버전을 기준으로 설명합니다.

 

 

message가 왔을 때 받을 함수인 get_message, 명령어별로 받을 함수를 별도로 등록하면 됩니다.

아래 예에서 '/help'는 help_command()가 'sise'는 sise_command() 함수가 받습니다. 등록되지 않은 명령어의 경우에는 unknown() 함수 받도록 설정했습니다.

특히 sise의 경우에는 명령어 형식이 '/sise 코드' 이므로 코드값을 받을 수 있어야 합니다. 따라서 pass_args가 True로 설정하면 이 값도 받을 수 있습니다.

 

 

sise_command()를 좀 더 자세하게 보겠습니다.

함수의 인자는 아래와 같이 정의되어 있습니다.  사용자가 보낸 인자는 context.args 변수에 배열로 들어가있습니다. '/sise code' 로 입력을 하기 때문에 context.args[0]에 code가 들어있습니다. 과거 버전과 다르게 args가 context 안으로 들어갔습니다.

 

xing api와 연결하지 않아서 일단 임의의 값을 돌려주는 코드입니다. telegram bot이 어떻게 동작하는지 확인하는 용도이니 참고하십시요.

 

어떻게 동작하는지 telegram 화면으로 보여드리겠습니다.

 

 

의외로 telegram bot 만들고 메세지 주고 받는 방법이 간단합니다. 카카오톡에서도 이런 기능이 지원된다면 사용용처가 무척 많을 것 같은데요. 다음에는 xing api와 연동하여 시세 정보를 볼 수 있는 방법을 기술하도록 하겠습니다.

 

관련 소스는 아래 github에 올려놓았습니다.

 

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

 

multizone-quant/system-trading

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

github.com

 

반응형

설정

트랙백

댓글

오늘은 주식 과거 시세 조회하는 방법에 대하여 정리합니다. 과거 시세 데이터는 분 정보와 일 정보를 조회할 수 있습니다.

 

분 정보는 T8412를 이용하면 됩니다.

T8412조회를 위하여 chart_min() 함수를 만들었습니다. 입력변수는 아래와 같습니다.

 

# code : 조회할 code

# min_type : 주기구분 : 0:30초 1: 1분 2: 2분 ..... n: n분

# sdate : 시작 date

# edate : 끝 date

# qrycnt : 조회할 최대 수(500 정도면 하루치 분 정도 조회 가능)

def chart_min(code, min_type, qrycnt, sdate, edate, cts_date='', cts_time=' ') :

 

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

 

일 정보는 T8413을 이용하면 됩니다.

T8412조회를 위하여 chart_min() 함수를 만들었습니다. 입력변수는 아래와 같습니다.

 

# gubun : 주기구분(2:일 3:주 4:월)

# sdate : 시작 date

# edate : 끝 date

# qrycnt : 조회일자

def chart_day(code, gubun, qrycnt, sdate, edate, cts_date='') :

 

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

 

이 함수를 이용하여 특정 종목들에 대하여 원하는 일자의 분, 일 시세 정보를 download할 수 있는 함수는 다음과 같습니다.

 

def download_min_data(codes, min_type, from_date, to_date) :

def download_chart_day(codes, dt, days) :

 

 

분 시세 조회 함수 사용법은 아래와 같습니다.

 

codes = ['069500', '114800']  # 복수 코드 입력 가능

from_date = 20200701 # 시작 일자 yyyymmdd

to_date = 20200708 # 끝 일자 yymmdd

# 종류 : 0:30초 1: 1분 2: 2분 ..... n: n분

min_num = 1 # 1분 데이터

download_min_data(codes, min_num, from_date, to_date)

 

 

일 시세 조회 함수 사용법은 아래와 같습니다.

 

codes = ['069500', '114800']  # 복수 코드 입력 가능

to_date = 20200707 # 다운받을 최종일자 (숫자 8자리)

num_days = 1 # 최종일 이전 며칠 , (당일만 원하는 경우에는 1, 7/7일 이전 10일치가 필요하면 10)

download_day_data(codes, to_date, num_days)

 

 

조회결과는 같은 폴더에 아래 형식으로 저장이 됩니다.

-- 분 데이터 --

069500_20200707_min_bong.txt

069500_20200707_min_bong.csv 

 

-- 분 데이터 --

069500_20200707_day_bong.txt

069500_20200707_day_bong.csv 

 

 

GUI로 원하는 code와 일자를 입력한 후 버튼을 누르면 간단하겠지만, 현재는 code와 일자는 소스에서 수정하는 방식입니다.

 

8412, 8413 버튼을 누르면 아래 함수가 호출됩니다.

 

8412 -> def Min_Chart_8412(self) :

8413 -> Day_Chart_8413(self):

 

이 함수에 원하는 코드와 일자를 입력하시면 됩니다.

 

만약 전 종목에 대하여 일/분 시세 데이터를 받고 싶으면 종목 코드를 다운 받은 후 for loop을 돌리시면 됩니다.

 

전체 소스는 아래 github에 있습니다.

 

 

https://github.com/multizone-quant/xing-api/blob/master/xing_sample.py

 

 

반응형

설정

트랙백

댓글

xing api의 장점 중의 하나가 Q 검색을 api로 할 수 있다는 점입니다. Q 검색으로 추출되는 종목은 매수 관점에서 지켜볼 필요가 있죠.

 

이번 글에서는 Q 검색리스트를 구한 후 해당 검색 조건에 맞는 종목을 검색하는 과정을 설명합니다.

 

 

우선 Q 검색 리스트를 얻는 TR은 T1826입니다.

아래 화면은 Q 검색 리스트를 받아온 상태입니다.

 

q검색리스트를 받아오는 함수는 get_q_query_list() 입니다. 입력으로는 아래 세 값 중의 하나를 정하면 됩니다.

  

def get_q_query_list(gubun) :  # gubun : 구분 (0(전체), 1(코스피), 2(코스닥))

 

검색 결과는 지원하는 Q 검색 번호의 리스트를 돌려줍니다.

특별한 사항이 없기 때문에 코드에 대한 자세한 설명은 생략합니다.

 

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

검색 조건 중 왼쪽에 있는 번호를 이용하여 각 검색 조건에 해당하는 종목을 받아올 수 있는 TR은 T1825입니다.

함수명은 get_q_query()입니다. 입력으로 들어가는 q_code는 T1826에서 받은 검색번호입니다. 구분은 get_q_query_list()와 같은 값을 사용합니다.

 

def get_q_query(q_code, gubun='0') :  # q_code : 검색 코드, gubun : 구분 (0(전체), 1(코스피), 2(코스닥))

 

샘플 프로그램에서는 모든 조건에 대하여 검색한 결과를 최대 12개까지 보여줍니다.

 

아래 화면은 Q 검색을 한 결과입니다.

 

타 증권사에 없는 xing만의 좋은 기능이니 적극 활용하시기 바랍니다.

 

source 코드는 아래 github에서 다운받으세요.

 

https://github.com/multizone-quant/xing-api

반응형

설정

트랙백

댓글

아래글에서 웹크롤링 네이버 주식 상장기업 주가를 얻는 방법에 대하여 설명하였습니다.

money-expert.tistory.com/7

 

웹크롤링 네이버 주식 상장기업 주가

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

money-expert.tistory.com

 

원래 의도했던 것은 1번 형식이었으나, 해당 web 페이지에 접속을 하면 default 상태인 2번 형식으로 데이터가 저장이 되었습니다. 다른 방법이 없어서 그냥 2번 형태로 자료를 사용하고 있었는데요. 

 

 

새로운 로직은 과거 일봉 데이터가 필요합니다. 그래서 xing api를 이용하여 전 종목 일봉 데이터를 매일 받으려고 하니 시간이 너무 많이 걸립니다. 그냥 일봉 데이터만 있으면 되는데, 한번에 전 종목 일봉 데이터를 주는 TR이 없더군요.

 

그래서 1번 방식으로 데이터를 받을 수 있으면 일봉 데이터 관리를 빨리 할 수 있을 것 같아서 방법을 알아보았습니다.

 

결론적으로는 Selenium webdriver를 이용하면 1번 형태로 저장할 수 있습니다.

 

그 과정을 설명합니다.

 

우선 아래 사이트에서 크롬 browser를 가져와서 적절한 위치에 저장합니다.

Chrom : sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

 

1. 다운 받은 webdriver를 생성합니다.

driver = webdriver.Chrome("C:\\my\\chromedriver.exe")

 

2. 시세 정보를 주는 페이지에 접속하여 html 정보를 얻습니다. 이후 선택할 항목과 선택하지 않을 항목을 강제적으로 click하게 합니다. 이때 원하는 항목을 찾아야 하는데요. 찾는 방법은 여러가지가 있습니다. 만약 text 정보가 중복되지 않는다면 find_element_by_xpath() 함수를 이용하면 됩니다.

 

"시가"의 경우에는 중복되는 항목이 많아서 직접 id를 이용하여 찾습니다.

 

 

항목을 찾은 후 click()이라는 함수를 부르면 선택/비선택이 toggle됩니다. 즉 기존에 선택이 되어 있었으면 선택되지 않은 상태로, 선택되지 않았다면 선택된 상태로 바꿉니다.  이후 적용하기 버튼을 찾아 click을 합니다. 

 

def open_naver_stock_page(driver, url) :

  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()

 

한 페이지에는 50개 종목씩 나옵니다. 한 페이지에 있는 정보를 모두 읽은 다음에는 다음 페이지 정보를 얻어야 하는데요. 앞에서 버튼 누른 것과 비슷한 방식을 사용합니다.

 

다행히 숫자로 찾으면 되는 상황이군요.  해당 페이지는 링크로 연결되어 있습니다. 따라서 find_element_by_link_text라는 함수를 이용하여 click을 합니다.

 

driver.find_element_by_link_text(str(i)).click()

 

10페이지가 넘으면 "다음" 이라는 버튼을 눌러야 11페이지부터 나옵니다.  비슷한 방식으로 '다음' 버튼에 해당하는 정보를 찾아 click을 호출해줍니다.

 

driver.find_element_by_link_text('다음').click()

 

 

selenium webdriver를 처음 사용해보았는데, 아주 강력한 능력을 가지고 있는 것 같습니다. 임의의 웹페이지에서 자동으로 입력도 하고, 선택도 하고, click도 할 수 있습니다.

 

이 방법을 응용하면 xing api가 지원하지 않는 증권사 웹 사이트에서 주문을 낼 수도 있을 것 같습니다. 이건 다음 기회에 방법을 알아보도록 하겠습니다.

 

이와 관련된 소스는 아래 github에 올려놓았습니다. 

 

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

반응형

설정

트랙백

댓글

webdriver를 이용하면 특정 페이지를 프로그램으로 동작시킬 수 있습니다. 그 과정을 설명합니다.

 

우선 webdriver가 사용할 브라우저를 가져와야합니다.

 

Chrom : sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

다운 받은 chromedriver.exe 파일을 적당한 곳에 복사해둡니다. 향후 프로그램에서 chromedriver.exe가 있는 곳의 path를 사용하여야 하므로 위치를 꼭 기억해두어야 합니다.

 

웹드라이버를 이용하여 네이버 로그인을 자동으로 하는 파이썬 예제가 많이 있습니다. 이 중 하나를 기반으로 동작하는지 확인해보겠습니다.

 

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup

from selenium import webdriver

import time

 

driver = webdriver.Chrome("C:\\my\\chromedriver.exe")

if 1:

   driver.get("https://nid.naver.com/nidlogin.login")

   elem = driver.find_element_by_name("id")

   elem.clear()

   elem.send_keys("myid")

   pw = driver.find_element_by_name("pw")

   pw.send_keys("mypasswd")

   time.sleep(1)

   form = driver.find_element_by_id('frmNIDLogin')

   form.submit()

   time.sleep(3)

 

결과는 아래와 같습니다. 정상적으로 동작을 하지만 naver에서 프로그램으로 로그인한 것을 인지합니다. 그래서 추가로 자동입력방지 문자를 입력하는 창이 뜹니다. 

 

 

user id와 암호를 입력하는 부분을 찾는 방법입니다.

크롬 개발자도구로 들어가면 해당 페이지의 소스를 볼 수 있습니다. 소스를 보면 아래 그림과 같이 'id', 'pw'라는 id를 사용하는 것을 알 수 있습니다.

 

 

아래 함수를 이용하여 원하는 객체를 얻을 수 있습니다. user id 창을 우선 비운 후 send_key라는 함수로 본인의 id를 전송하면 화면에 해당 id가 보입니다.

 

   elem = driver.find_element_by_name("id")

   elem.clear()

   elem.send_keys("myid")

 

같은 방식으로 암호도 전송합니다. 

 

다음은 로그인 버튼을 찾아봅니다. html 소스에서 로그인에 해당하는 부분을 찾습니다. form 형태로 구성이 되어 있군요. form id에 해당하는 form을 찾은 후 submit() 함수를 이용하면 클릭한 효과가 나옵니다.

 

form = driver.find_element_by_id('frmNIDLogin')

form.submit()

 

앞에서 언급한 것과 같이 네이버 정책상 자동 로그인은 막아놓았습니다. 그래서 로그인을 하려면 추가로 이미지에 나오는 문자를 입력하여야 합니다. 이건 자동으로 하기는 어려운 부분이니 수동으로 해야합니다.

 

다음에는 네이버 주식 정보 중 일일 데이터를 얻어오는 방법에 대하여 설명합니다. 

 

 

반응형

설정

트랙백

댓글

이베스트 xing api를 이용하여 잔고조회와 주문결과를 확인하는 방법에 대하여 정리합니다.

 

xing api에서 잔고를 요청하는 TR 코드는 T0424입니다.

T0424를 처리하는 함수 get_balance(ticker)를 만들었습니다.

입력이 'all' 이면 전체 잔고를 특정 코드를 입력하면 해당 종목의 잔고만 돌려줍니다.

 

 

xing api에서 주문결과를 알려주는 TR 코드는 T0425입니다.

T0425를 처리하는 함수 order_status_tr(kind='2', code='all', cmd_cont='')를 만들었습니다.

여기에서 인자의 의미는 아래와 같습니다.

 

kind : 체결 종류

  '0' : 모든 주문을 돌려 줌 (취소 포함)

  '1' : 체결된 주문만 돌려 줌 

  '2' : 미체결된 주문만 돌려 줌

code : 원하는 종목 혹은 'all'

cmd_cont : 체결 내용이 100개 이상일 때 사용

 

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

https://github.com/multizone-quant/xing-api/blob/master/xing_sample.py

 

multizone-quant/xing-api

ebest xing api. Contribute to multizone-quant/xing-api development by creating an account on GitHub.

github.com

실행하기에 앞서 앞부분에 있는 로그인 정보를 입력하셔야 합니다. 만약 이 로그인이 정상적으로 동작하지 않는다면 오류 메세지가 납니다.

 

 

기본적으로 PyQty에서 동작합니다. 이는 향후 실시간 시세 정보를 받기 위합입니다. 만약 PyQty가 설치되어 있지 않다면 설치하신 후 사용하시기 바랍니다.

 

앞으로 xing api에 나오는 TR 명령어들을 정리해서 올리도록 하겠습니다.

 

 

반응형

설정

트랙백

댓글

현재 개발 중인 자동매매 frame-work을 이용하여 첫 로직을 개발해봅니다.

 

전략은 아래와 같습니다.

 

이름 : 코스닥 상승 종목 타기 : 코스닥돌파1호

대상 : 코스닥 종목 (100종목)

Time Frame : 실시간 체결 정보 사용, 당일 청산

Rule :  코스닥 전 종목을 대상으로 당일 상승중인 종목

  1) 매수 조건 : 전일 상승 종목 중 종가 상승 분 대비 50% 상승하면 매수

                 시초가가 매수 조건보다 높으면 매매 대상에서 제외

  2) 매도 조건 : 매수 후 10% 상승 혹은 종가 청산

  3) 손절 조건 : 매수 가격 대시 3% 하락시 손절

 

이전 글에서 설명한 매매 흐름 다이어그램을 기반으로 매매는 frame-work에 포함되어 있습니다. 이 로직을 적용하기 위해서는 매매 대상, 진입 조건 등에 대한 코딩을 추가하면 됩니다.

 

그 과정을 정리해봅니다.

 

우선 거래 대상 종목 정보를 뽑아야 합니다. 네이버에 있는 코스닥 상승종목을 조회하는 웹페이지 내용을 크롤링합니다. 관련 코드는 아래 github에 있습니다.

https://github.com/multizone-quant/system-trading/commit/2d00a4525fcb16a375e096845203ac1f9c18ff01

 

이 프로그램을 실행하면 아래와 같이 일자명이 붙은 파일이 만들어진다. 여기에는 종목에 대한 기본 정보와 조회 시점의 현재가가 기록되어 있습니다. 따라서 장이 끝난 후 이 프로그램을 실행하면 당일 코스닥 전 종목의 코드와 종가를 구할 수 있습니다.

 

20200612_kosdaq_up_list.txt

 

거래 대상을 만들었으니, 신규 로직 코딩을 할 차례입니다. 

 

TR_STOCK_1이라는 frame-work에 있는 주식매매class를 기반으로 매매 대상을 코딩합니다.

 

1. 거래 대상을 기록한 파일 명이 등록

2. 거래 대상을 저장한 파일의 내부 저장 구조에 따라 필요한 정보를 뽑는다.

3. 매매 대상에서 제외하는 한다.

4. 진입을 위한 매수가가 결정한다.

 

위 내용을 바탕으로 코스닥돌파 1호 class을 위한 코드는 아래와 같습니다.

 

 

 

추가로 익절 %도 조절이 가능한데요. 이 값은 config 파일로 처리합니다.

돌파 1호는 전일 상승 폭의 50%를 넘어야 진입 조건이 되는 것이고, 돌파 2호는 전일 종가에서 3%가 오르면 진입 조건임을 표시하고 있습니다.

 

 

 

현재 개발 중인 자동매매 frame-work을 기반으로 기존 전략과 비슷한 전략을 추가하는 방법에 대하여 간단하게 정리해보았습니다. 

 

새로운 전략을 추가할 때 기존 전략 코드 변경없이 가능하다는 것은 큰 장점이 있습니다.

우선 기존 전략이 잘 동작합니다. 새 전략을 추가하면서 기존 전략에 문제가 생긴다면 새 전략을 추가할 때 마다 기존 전략에 대해서도 문제가 없는지 test를 해 보아야 하기 때문에 개발 부담이 커집니다. 따라서 새 전략 추가시 기존 전략에 미치는 영향은 최소가 되어야 합니다. 

 

하지만 frame-work을 만드는 과정은 시간이 많이 걸립니다. 따라서 기존 전략에 영향을 미치지 않으면서 신규 전략을 개발하는 방법으로 전략 마다 별도 프로그램을 만드는 방법도 있습니다. 하지만 새로운 기능을 추가하게 되면 모든 프로그램을 수정해야 하기 때문에 이 또한 바람직한 방법은 아닙니다.

 

물론 frame-work을 이용하는 방법도 단점이 있습니다. frame-work이 모든 경우를 고려해서 만들 수 없기 때문에 전략에 따라서 frame-work을 변경해야 하는 경우도 생깁니다. 저는 기존에 암호화폐 매매를 위하여 만든 frame-work(여러 거래소를 동시에 이용하기 위하여 만듬)을 주식에 적용하다 보니, 다른 부분이 많아서 80% 이상 수정을 하였습니다. 거의 다시 만든 수준이죠. 완성된 형태의 frame-work이 나오기 전까지는 구조가 변경되는 경우가 많아서 개발 종료하는데 시간이 많이 걸리는 문제를 가지고  있습니다.

 

전략별 파일 혹은 frame-work 어느 것이 맞는지는 개발자에게 주어진 시간과 성향에 따라서 다르기 때문에 정답은 없습니다. 각자 처한 상황에 따라서 선택을 하면 될 것 같습니다. 

 

다음에는 비슷한 로직을 추가하는 과정에 대하여 기술할 예정입니다.

 

반응형

설정

트랙백

댓글