효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

2024.01.27 - [개발] - [Python] 증권사 API를 통한 자동 매매 개발 프로젝트 - 1

 

[Python] 증권사 API를 통한 자동 매매 개발 프로젝트 - 1

올해는 연간 프로젝트에 들어왔는데 모의해킹이 아닌 한번도 경험해보지못한 소스코드진단을 맡게되어 모의해킹 연구가 불가능해졌다... 그래서 이참에 못해본 투자 공부나 할겸 주식 공부를

hyotwo.tistory.com

 

개발 프로젝트 첫날까지는 색상처리문제를 해결 하였다.

오늘 역시 주말이기에 시장이 안열려서 실제 거래를 하는 테스트는 하지못한다.

근데 어차피 오픈소스 코드엔 내가 원하는 조건 로직이 안짜져있기때문에 매매는 하지못한다.

 

그래서 오늘은 실제로 어떤 주식을 사고 팔것인가에 대한 문제를 해결해보려한다.

먼저 국내 시장의 주식 종목갯수는 2~3000개가 되는걸로 알고있다.

그 모든것을 다 매매하다간 하루만에 파산하고 말것...

내가 주식을 잘하는건 절대 아니지만 틈틈이 공부하며 검색기로 나만의 매수타점을 잡는 법이 있다.

그래서 많고 많은 주식중에 타점이 나오는 것을 잡기위해서 조건검색을 불러와야한다!

 

조건검색 불러오기

내가 이용하는 키움증권엔 이미 검색기를 몇개 만들어뒀지만 한국투자증권은 계좌도 어제만들었고

처음이라 최대한 비슷한 로직으로 다시 만들어주었다.

조건 검색기를 만들고 검색기 이름은 일단 대충 테스트로 지정했다.

최대한 저점에서 매수할 수 있도록... 저평가된 주식들을 고르고 그 중에 상승추세를 탈 법한 애들이 나온다(라고 믿고싶다)

 

이제 검색기도 준비되었다면 파이썬에서 불러와서 디스코드에 찍어줘야한다

내가 만드는 아이지만 못믿겠으니 눈으로 확인해야함!

API를 신청했던 한국투자증권의 KIS Developers 페이지에 들어가면 조건검색조회와 관련된

API 설명에대해 상세히 나와있다

해당 설명서를 참고해서 코드를 작성할 것이다.

먼저 기존의 파이썬 함수코드를 참고해서 API에게 요청하도록 해야한다.

#종목 조건검색 조회
def search_list():
    PATH = "/uapi/domestic-stock/v1/quotations/psearch-title"
    URL = f"{URL_BASE}/{PATH}"
    payload = {"user_id":USERID,
               "seq":"0"
               }
    headers = {"Content-Type":"application/json", 
        "authorization":f"Bearer {ACCESS_TOKEN}",
        "appKey":APP_KEY,
        "appSecret":APP_SECRET,
        "tr_id":"HHKST03900400",
        "custtype":"P"
    }
    res = requests.get(URL, headers=headers, params=payload)

 

이렇게 요청할 때 필요한 값들을 지정해주고 요청하면 잘될것이다.

 

요청을 했을 때 돌아오는 값이 엄청 많다

모든 값이 다 필요하진 않고

뭐... 종목코드, 종목명, 현재가 등 중요한 정보만 필요한데

일단 나는 조건검색이 제대로 불러와지는지 먼저 해결해야하는 응애이기 때문에 이름정도만 가볍게 불러오면 될 것같다

아주 단순하게 다른 코드들을 참고해서 아래처럼 작성해보았다.

프로그램 동작 결과!

여러개의 배열로 이루어진 데이터라 index 0번에 해당하는 데이터만 가져와졌지만

어찌됐든 조건검색기에서 포착된 종목의 이름이 불러와졌다!

이것이 중요한것

 

정확한 동작 방식을 파악을 위한 Index값을 늘려 테스트 코드를 짜서 다시 요청!

send_message(f"종목명: {evaluation[0]['name']},{evaluation[1]['name']},{evaluation[2]['name']}")

잘되는 것을 확인했다. 하지만 코드를 저렇게 짜면 안된다.

코드가 엄청 길어질 뿐더러

검색기에 포착된게 1개인지 2개인지 3개인지 난 알 수가없다.

그래서 for문을 사용해서 배열의 끝까지 굴려줘야한다

names = [stock['name'] for stock in evaluation]
    send_message(f"============조건 검색 결과============")
    send_message(f"종목명: {names}")

 

names라는 변수를 하나 만들어서 열심히 굴려주고 찍게끔 만들어줬더니 결과가 아주 만족스러웠다

 

 

이제 가시성을 위한 업데이트를 해줘야한다

색처리 방법도 찾았으니 좀 더 한눈에 볼 수 있게끔

그리고 화려하게 꾸며보자

 

조건 검색 목록 불러오기 및 가시성 패치 마무리 

평소 모의해킹 도구를 개발할 때에는 제일 마지막에 하는 단계이긴한데

디스코드는 색상을 입히려면 너무 귀찮게 되어있어서 지금 하는게 낫다고 생각했다.

그래야 다른 메시지를 전송할 때도 쉽게 복붙이 가능하니까...

색상은 처리했으니 글씨의 굵기나 크기, 기울기, 밑줄 등과 같은 여러 효과들을 넣으면 좋겠다 싶었다

디스코드 마스터의 블로그에도 있을것같지만 어디서 정보를 구했는지는 까먹었다.

그냥 이리저리 검색해보며 열심히 테스트를 해보았다

기억나는 효과들만 아래에 정리해보았다 

밑에있는 효과만 가지고있어도 차고 넘친다

`코드블럭처럼 효과를준다`
**굵게**
__밑줄__
```코드블럭```
# 가장큼
## 중간큼
### 약간큼
[test](URL)


.
.
.

위 효과들과 Ansi 코드의 사용을 더해서

가시성 패치를 열심히 해주었다.

오후 12시에는 장이 열리는 시간이라 아래 매수코드까지 동작하였지만 주말이라 실제 매매는 되지않았다...

어찌 됐든 매수코드가 돌아가는것 까지 얼떨결에 확인!

색을 좀더 알록달록하게 입혀주니 제법 짜세가 나오는 듯 하다?!

 

그리고 가시성 패치를 하면서 조건검색 리스트를 불러오는 코드까지 작성해주었는데

이 코드는 지금 당장은 필요없지만 추후에 검색식이 여러개로 늘어났을 때

어떤 검색기에서 포착된건지 파악하기위해서 미리 만들어서 넣어줬다.

코드는 뭐 비슷비슷해서 고생하지않고 복붙으로 다 해결해버렸다

#조건검색 목록 조회
def search():
    PATH = "/uapi/domestic-stock/v1/quotations/psearch-title"
    URL = f"{URL_BASE}/{PATH}"
    payload = {"user_id":USERID
               }
    headers = {"Content-Type":"application/json", 
        "authorization":f"Bearer {ACCESS_TOKEN}",
        "appKey":APP_KEY,
        "appSecret":APP_SECRET,
        "tr_id":"HHKST03900300",
        "custtype":"P"
    }

 

그리고 불러오는 조건검색식 이름을 전역변수로 선언해줘서

실제 어떤 검색기에서 검색된 종목 결과들인지도 디스코드에 파란글씨로 찍어줬다.

미래까지 생각한 아주 훌륭한 판단이라 생각된다 훗...

 

그리고 하는김에 조금더 내 입맛에 맞추고싶어

불필요한 시간을 찍어주는 코드도 거진 삭제하고 구분선에 추가하며

대제목은 큰 폰트로 확실하게 구별이가도록 했다.

종목명 또한 조금더 확실히 볼 수있도록 줄바꿈 개행문자를 사용! 그리고 이모지까지 사용

너무 알록달록한 것같기도하고 일단 처음보단 보기가 많이 편해진 듯 하다!

 

검색된 종목에서 매수할 종목 선택

 

검색기에 포착된 종목이라해서 모두 매수할 수는 없다

조건 검색식은 그저 거들 뿐...

검색기에 포착된 종목 중에 또 선별을 해서 매수를 해줘야한다.

이 부분에 대해선 사실 아직 많이 고민중이다

어떤 종목을 골라서 매수를 해야하는지는 사실 차트를 계속 보고 판단하는게 좋은데

트레이딩 봇에겐 특정 조건이 만족되면 사라고 지시할 수 밖에없다.

 

그래서 그냥 테스트겸 일단 선별 기준이 정해지면 로직은 변경하면되니까 

어떤식으로 작성해야 제대로 동작하는지 알아보기위해 등락률이 마이너스가 아닌 종목 중에서

거래량이 최고로 높은 3개의 종목을 골라보는 코드를 테스트로 써보기로했다.

 

그럼 다시 API 가이드를 확인하러 가보자

 

반응형

흠흠 일단 두개의 조건을 위한 파라미터는 chgrate와 acml_vol이다

이 두개의 파라미터를 이용해서 선별하는 코드

그리고 그 종목의 이름과 종목번호를 추출하는 코드

2개의 로직이 추가되어야한다.

    selected_stocks = []
    for stock in evaluation:
        chgrate = (stock['chgrate'])
        acml_vol = (stock['acml_vol'])      
        if chgrate >= 0:
            selected_stocks.append((stock, acml_vol))
    selected_stocks.sort(key=lambda x: x[1], reverse=True)
    top_3_stocks = selected_stocks[:3]

일단 등락율이 -가 아닌 종목들을 담아주기위해 배열을 하나 만들어주었다.

그리고 chgrate가 0 이상일 때 배열에 거래량이 담기도록하고 

그 배열을 람다함수로 거래량 기준 내림순으로 정렬 한다음 3개를 뽑아주면된다!

바로 프로그램을 돌려보았다.

 

에러가 발생했다.

뭐 포스팅에 따로 남기진 않았지만 에러는 이미 수백번도 넘게봤다

이번 에러는 자료형을 생각하지 못해서 발생해서 얼른 float으로 맞춰주고 다시 가동

 

오오 3개의 종목에 구매 조건 달성이라는 문자열이 추가되었다!

조금 이상하게 출력되었지만 애초에 출력형태까지는 고려하지않았다.

바로 조건이 정확하게 맞아떨어지는지 검증을 해보았다

등락률이 + 인 것중에서 거래량이 가장 높은 3개

FSN / 삼화네트웍스는 등락률이 -라 제외되고 / 아이큐어 / 큐리언트 

아주 정확하게 3개를 잘 골라준 것을 확인했다.

출력되는 스타일도 이쁘게 슥삭슥삭 출력문 코드 수정

이 과정에서 내가 원하는 그림이 안나와서 꽤 많은 시간을 소요하다가...

그냥 아래 사진과 같이 나오는 것으로 만족했다

원래 원한 것을 줄바꿈 없이 옆에다가 표시하는 것이였는데 이게 뭐라고 중요한것도 아닌데 너무 안되서 포기...

그리고 모든 숫자형 데이터가 

500000000 이런식으로 표현되는게 또 단위 콤마가 필요해서 설정을 하다가

 

scts_evlu_amt / evlu_pfls_smtl_amt 이런 친구들 때문에 고생을 했다.

하지만 파이썬의 버전을 이용해서 fstring으로 아래와 같은 문법이 사용가능하길래 이 방법으로 해결했다

int(num):,

 

이젠 주식 잔고도 평가 금액도 한눈에 읽기쉽다.

게임으로 단련된 숫자 단위로 일십백천만을 안세어도 콤마만 있다면 바로바로 읽어버린다.

 

디스코드 화면만 보면은 거의 다 구현이 된 것처럼 보이지만 속을 들여다 보면 살만 갖다붙였지

뼈대가 없는 인형과 같은 존재다

 

가장 중요한 건 매매

매매에 관한 로직이 사실 트레이딩 봇의 99%를 차지한다.

선별된 종목을 언제 매수하고 언제 매도하는지에 대한 로직을 구현하면 거의 완성이라고 할 수 있을듯하다.

이 부분은 코드도 짜야하지만 아직 정확한 기준도 못정한 상태라 좀 까마득하긴하다...

일단은 테스트라도 해볼겸 대충 기준을 잡아서 짜봐야한다.

물론 수백 수천번의 에러에 시달린 탓에 다음에...

반응형
  • hyotwo7658@gmail.com

복사 완료 👍