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

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

 

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

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

hyotwo.tistory.com

 

아마도 이번 글이 매매봇 개발 프로젝트의 마지막 글이 될 것같다.

중도 포기하는건 아니고 이제 어느정도 마무리 단계에 도착했고 이제 더 이상 크고 작은 코드 수정으로

글을 남기는건 의미가 없을거라 생각하기때문이다.

 

매수 테스트

일단 오늘은 장이 열리는 월요일이였기 때문에 매매 테스트까지 해볼 수 있었다.

처음엔 이상한 로직 때문에 매수 매도가 반복 되었지만 그 문제를 해결한 결과의 사진이다.

 

근데 또 해결할 문제가 더 있었는데 바로 매수 수량에대한 문제다

1주씩만 구매하길래 어디가 문제인지 봤는데

buy 함수에 qty 변수에 1 값이 담겨져있어서 1주씩 매수한것이다

 

해당 변수를 아예 비워주고 보유 현금 비율로 매수하도록 계산 후 qty 변수에 담아서 

매수 조건이 맞으면 해당 qty 변수를 buy 함수로 보내는 식으로 해결을 했다.

 

그 결과 1주가아닌 막 388주씩 사버리는 상남자 매매봇이 되었다

맘에 든다

 

아무리 모의투자라고 하지만 몇천만원 단위로 거래하기엔 아직 살이 조금 떨려서 100만원씩만 걸어뒀다

매수 조건은 일단 3편 글에서 제작해둔 이동평균값을 기준으로해서 5일선이 112일선을 돌파할 때 매수하도록 했다.

이 조건식을 구현할 때에도 난관이 있었는데

해당 종목의 이동평균값이 진짜 사려고하는 종목의 값이 맞냐? 의 문제였다...

 

엄청 무식하게 변수명 자체에 변수를 집어넣어서 종목코드를 매칭시켰다..

이 코드를 작성할 당시에는 몰랐는데 아마 다시 코딩하라고하면

output 데이터에서 배열을 하나 만들어서 종목코드를 key값으로 이평값을 집어넣는 방식으로 구현했을듯하다

 

어찌됐든 로그를 검증해봤더니 확실히 데이터는 정확하게 들어맞는것같아서 마음이 조금 놓인다.

또 다른 문제가 발생했던것은 이미 매수를 끝마친 종목을 또 매수 조건이랑 부합한다고 사버리는 문제였다.

물타기도 아니고 추매를 반복적으로 하다간 금방 파산할 것이다.

해당 문제는 위에서 언급한 깨달음을 조금 응용해서 배열에 저장된 코드값을 들고와서

매수요청값이 0보다 크고(and) 주식보유잔고에 매수 요청의 종목코드가 없을 때!

라는 조건을 붙여서 매수를 시도하도록했다.

 

지금은 envelope 지표도 구현해둔 상태이다

엔벨로프선도 사실상 이동평균값으로 도출하는 지표이기 때문에 이미 이평선을 구현해낸 나에겐 어렵지않았다.

#Envelope 구하기
    en_p = 0.1
    df['Up_Envel'] = df['ma20'] * (1 + en_p)
    df['Do_Envel'] = df['ma20'] * (1 - en_p)

 

반응형

내일부터는 엔벨로프 전략을 사용해서 매매를 해볼까한다.

그리고 사소한 문제들이 있었는데 한번 데이터를 조회하고 새로 데이터를 로딩안한다는점...

그러면 주식의 가격이이 변경됐을 때 대처를 할 수가 없다.

그리고 검색기에 새로운 종목이 포착되면 그것도 한번 확인해주는게 인지상정이다.

해당 문제는 schedule 라이브러리를 사용해서 해결했다

하는김에 주식잔고도 꾸준히 나에게 보고하도록 했음 ㅎㅎ

 

그리고 퇴근 후에 작은 UI 개선을 조금 했다

너무 알록달록해서 더 보기가 힘든것같아 중요한 등락과 관련된 부분만 색처리를 해주었다.

 

 

매도 조건 코드 작성

매매를 하는데 있어서 매수도 중요하지만 매도가 엄청 중요하다.

내가 프로그램을 만드는 이유도 매도에 대한 문제가 있어서 그렇다 (손절이 너무 힘듬)

 

하지만 감정을 배제한 프로그램은 냉철하게 손절을 쳐준다.

일단 상세한 조건식은 나중에 만들더라도 지금은 %(퍼센트)를 이용해서 

보유중인 종목중에서 -3%~-5% 정도되면 매도를 하게끔 코드를 짜줄 생각이다.

 

처음엔 보유중인 종목코드와 현재가 그리고 평균 매입가 3개를 받아와서 3개를 각각 비교하면 되겠구나!

라고 생각했지만 생각해보니 손익률을 따져서 매도를 할거라면

그냥 손익률만 가져오면 된다

for stock_code, (stock_rate, stock_count) in stock_dict2.items():
            sellcode = []
            stock_rate = float(stock_rate)
            if stock_rate < -2:
                sellcode.append(stock_code)
                send_message(f"{stock_code} 매도가 도달({stock_rate}%) {stock_count}주 매도를 시도합니다.")
            sell(sellcode,stock_count)

 

위 코드는 일단 내가 가지고 있는 종목들이 -3%가 되는게 없어서 -2로 조건식을 잡았다

목표는 전량 시장가 매도로 던져버리는 것이다.

 

프로그램을 돌려보니 결과가 아래와같았다

모르겠다

일단 원하는대로 전량 매도로 잘 구현이 된 것같아서 기쁘긴한데... 함수로 인자를 전달할 때 에러가나는 듯하다

 

후다닥 수정을 해서 손절 로직도 완성이 된 듯하다

이제 다시 -3%로 맞춰서 내일 매도가 잘 되는지 확인해봐야한다.

 

그리고 주식이 어느정도 올랐을 때도 이익실현을 해야한다 

큰 욕심은 큰 화를 부르는 법

얼른 이익실현을 위한 로직도 조건문으로 짜주었다.

이 친구가 익절을 했는지 손절을 했는지 보기쉽게 색처리도 완료!

그 결과는 깔끔하게 잘 나오는걸 볼 수있다! 

이제 웬만한 에러는 빠르게 처리할 수 있는 능력이 갖춰졌다

 

이렇게 기본적인 틀은 다 완성이된 듯하다(?)

크게 업데이트해야할 사항이 남은건 2개정도 남아있지 싶다

 

 

앞으로 개선해야될 문제

웹소켓 API 구현

오늘 프로그램을 돌려보니 실시간으로 가격을 받아와야 제대로 된 매매가 될 것같다.

5분에 한번씩 받는것도 느린데 1분에 한번씩 받는것도 사실상 1초마다 변하는 시장에서는 느리다.

한국투자증권의 API는 웹소켓도 지원한다고해서 한번 적용해보려했는데 실패해버렸다.

일단 문의는 해둔 상태인데 어떻게될지 모르겠다.

웹소켓 API가 잘 적용돼서 구현이 된다면 딜레이같은 리소스가 많이 줄어드니 

가능하다면.... 머신러닝같은 기술도 한번 적용을 시켜볼까 고민중이다.

하락장에도 이 프로그램이 자기 혼자 학습을해서 매매를 한다든지...

아니면 머신러닝이 아니더라도 뉴스 API를 받아와서 해당 뉴스에 반응하는 종목을 매수한다든지

등등... 웹소켓 구현도 우선순위가 시급한 문제이긴 하다

된다면 다른 가능성도 열리고

 

그리고  매매전략 세우기

아직도 매매전략을 어떻게 해야할 지 고민중이다.

일단 하나씩 다 모의투자에서 해보고 괜찮은 것으로 해볼까 고민중이다.

꾸준히 주식공부도해서 아주 세밀한 조건을 걸 생각이다

물론 매 시즌마다 바뀌는게 매매전략이겠지만 또 주식을 공부해야 전략도 만들 수 있는법

 

일단 매매봇 관련 포스팅은 여기까지!

끝!

반응형
  • hyotwo7658@gmail.com

복사 완료 👍