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

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

 

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

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

hyotwo.tistory.com

 

4편을 마지막으로 개발기에대한 글은 작성을 안하려고 했다.

근데 거의 완성된 줄 알았던 프로그램이 사실은 50%정도밖에 완성이 안되어있었던 것

처음에 오픈소스를 받아왔던 때가 270 라인정도 였는데 지금은 1000 라인이 넘었다....

최근 1주 동안은 퇴근하자마자 개발에만 집중해서 거의 일상이 무너졌다...

이번이 아마 개발기 글의 마지막 포스팅일 것이다 (제발...) 이후엔 그냥 중간중간 성과나 기록하지않을까 싶다

 

일단 왜 또 개발기를 적게되었냐

1. 내가 예상하지 못한 변수들이 주식시장에는 너무나도 많다

너무나도 자유분방한 주식 시장을 내가 너무 얕봤다

하루에도 셀 수도없는 에러가 프로그램을 가동할 때마다 등장했다

 

2. 장기 이동평균 값 데이터를 너무 느리게 받아오는 문제

한국투자증권은 다른 국내증권사들과는 다르게 Rest API로 동작한다.

그래서 내가 요청을 해야지만 데이터를 주는데 이게 장단점이 매우 확연하다

최대 단점은 너무 느리다... 그리고 요청 1건당 응답 데이터개수의 제한이 있다.

웹소켓 통신이 가능하대서 찾아봤는데 정작 내가 필요한 데이터들은 소켓으로 받아올 수 없어서

Rest 방식으로 나눠서 요청해야했다 너무 느려...

장점은 OS를 안타고 지원하는 라이브러리나 언어나 등등 호환성이 매우 좋다는 것 (아주 큰 장점)

그래서 추후에 이런저런 기능을 추가하거나 환경을 변경하기에 나쁘지않다고 생각한다.

 

3. 매매 조건식 적용의 문제

매매 조건식을 적용시킬 때에도 많은 고난이 있었다.

일단 투자의 방법은 모두가 달라서 이렇다할 오픈소스 코드도 없을 뿐더러

나의 의사결정을 프로그램이 그대로 대신 해줬으면 좋겠다는 큰 목표가 있었다.

내 생각을 그대로 입히려하니 코드가 길어지고 그만큼 에러도 많았던 것같다.

 

 

Rest API로 Websoket을 따라가기 위한 노력 

한 주가 지난 상태로 포스팅하는 상태라 사진이 많이 없지만 해당 문제는 월요일쯤 확인해서 수정작업에 들어갔다

Rest API는 요청을 보내야지만 응답이 돌아온다.

근데 요청 1건당 100건의 데이터만 받을 수 있어서 종목 3개의 장기 이동평균값을 보기위해서는

데이터를 나눠서 요청을 해서 concat 함수로 데이터프레임에 합쳐줘야했다

하지만 3800개가 넘는 투자종목에서 검색기로 필터링하고 또 파이썬 로직으로 필터링한다 한들

3~5개의 종목의 데이터를 매번 300~400건씩 데이터를 요청하는건 프로그램 매매에 너무 불리했다.

빨리빨리 현재가를 받아서 매도 시점이 오면 매도하고 매수 시점이 오면 매수를 해야하는데 

그냥 하루~종일 데이터만 받다가 다 놓쳐버리겠다는 불안감이 항상 있다.

 

그래서 생각을 해봤는데 당일의 종가외에 과거의 데이터들은 과거로 돌아가지 않는 이상 항상 고정값이라는 점을 이용

한번 조회했던 코드를 저장할 배열을 만들어서 데이터프레임도 초기화를 하지않고 저장한 그 상태로 뒀다 

조회했던 배열 == 현재 조회할 종목의 배열 2개를 비교한다음 오늘의 데이터 1건만 빠르게 받아와서

업데이트 해주는 식으로 해결했다.

이 작업이 얼마나 큰 성과를 가져왔냐면 데이터를 한번 조회할 때마다 10초씩 걸렸던게 1초~1.5초 단위로 줄어들었다.

이 정도 딜레이면 Websoket의 발목까지는 따라갔다고 봐도 무방할 것같다.

난 엄청난 스켈핑같은 매매는 하지않을 것이기 때문에 이 정도 속도로만 받아와도 괜찮다.

 

하지만 위 코드를 적용시켰을 때 또 생각지 못한 에러가 발생했는데...

주식 시장은 항상 변하고 그에 따라 내가 살펴볼 주식도 실시간으로 변한다는 것이다.

삼성전자/SK하이닉스/네이버 3개의 종목이 검색기에 잡혀서 보고있다가 갑자기 네이버가 조건검색에 안맞아서 빠지고

카카오가 들어오게된다면 기존의 네이버 데이터에 카카오의 오늘 데이터만 받아와서 엉뚱한 계산을 하거나...

조회했던 배열의 인자가 늘어나버리면서 에러가 발생해버린다

그래서 요청을 보내는 코드마다 다 조건식을 걸어줬다 무조건 배열끼리 비교하고

조회했던 코드가 조회할 코드의 배열보다 커져버리면 아예 덮어씌우는 식으로 해서

다시 새로운 장기 데이터들을 가져오게끔 했다.

잘 짜여진 코드는 절대 아닌것같지만 일단 잘 돌아가기는 하니까 당분간은 걱정이 없다.

 

그리고 에러가 발생할 때마다 프로그램이 계속 중단되는 문제도 있었다.

해당 문제도 꽤 큰 사안이기 때문에 예외처리를 해서 다시 시도하도록 했다.

물론 코드에 오류가 있어서 에러가 발생하는것도 있겠지만 대부분이 너무 빠르고 많은 요청때문에

API 서버에서 제대로 응답을 주지않아 발생하는 에러였기때문에 다시 시도하면 제대로 정상 작동된다.

 

위의 개발은 판다 라이브러리와 데이터프레임을 처음 다뤄봐서 함수 사용법도 찾아보느라 2~3일이 소요된 듯하다.

아무튼 이렇게 Websoket처럼 돌아갈 수 있도록 최대한 만들어 주었다. 굳!!

반응형

 

매매 조건식 적용하기

역시 트레이딩봇의 뼈는 매매 조건이다.

에러가 절대 발생하지않는 절대적으로 훌륭한 프로그램이라고 한들 매매조건이 틀리면 돈을 벌 수가없다.

내 전략은 익절은 길~~~게 손절은 짧게 가져가도록 했다

너무 단순하지만 감정이 섞인 닝겐은 쉽지않다.

일단 주식을 샀으면 보유잔고에 해당 주식이 들어온다.

그 주식이 2%가 올랐을 때, 5%가 올랐을 때 더더 많이 올랐을 때 따로따로 조건식을 다 걸어줬다.

위 처럼 코딩을 했는데 먼저 2%가 오르면 바로 팔지않는다.

그 주식이 더 올라갈 수도 있지않음? ㅎㅎ

바로 매도하지 않고 배열에 해당 종목을 저장하고 파이썬의 딕셔너리에 종목과 포착된 상승률을 저장한다.

그리고 계속 지켜보도록 했다

이익은 기~~~~~~일게 들고가는법 아래 사진처럼 동작하게된다.

올라가는것을 지켜보다가 각각 조건식마다 특정 구간까지 내려오면 이익 보존을 위해 팔도록 코딩했다.

예를 들면 2% 상승 후 다른 상승 딕셔너리에 저장이 안되었다면 그 종목은 더 오르기는 힘들 수도 있으니,

1%만 떨어져도 이익 보존을위해 1%만 이득보고 익절하고

10%이상 오른종목들은 더 많이 올라갈 가능성이 2% 종목들보다 높으니 그만큼 3%~4%가 떨어져도

팔지않고 들고 있다가 최소한의 이익 보존을 실현하는 방식이다.

 

아직 에러와의 전쟁이 끝나지 않아서 매매를 제대로 해보진 못했지만 아마 해당 매매 조건 로직은 수치만 건드리고

그 자체를 변경하지는 않을듯하다.

이번 주말에 에러와의 전쟁을 끝내고 다음주부터 진짜 매매를 시작해볼 예정이다.

지금도 프로그램을 돌리고 있는데 아직까진 별 문제가 없다 하하

 

익절을 기~~~~~~~~~~~~일게 가져가는것도 중요하지만 손절도 짧게 하는게 더 중요하다

하지만 무분별한 손절은 계좌만 아프게 할 뿐

일단 최대로 -4% 까지만 버텨보도록 했는데 다른 조건들을 좀 많이 넣었다.

이 친구가 손절은 최대한 신중하고도 칼같이 해줬으면 좋겠다는 생각이 있다.

먼저 첫번째 조건문으로 들어오려면 -4%까지 빠지거나 그날의 시가를 좀 크게 이탈했을 때로 잡았다.

하지만 시가를 이탈해도 다시 반등하는 종목들이 있다. 그래서 조건이 만족되면 바로 손절을 하지않고

가능성있는 아이들을 잡기위해서 보조지표 조건을 아래에 사용해서 특정 조건을 만족하면 이렇게 또

배열과 딕셔너리에 저장을 한다.

그리고 저장된 친구들은 또 유심히 ... 관망의 대상이 되는 것

수많은 코드들에 의해 지켜봐지다가 반등이 되면 다시 익절 로직으로 들어가게된다.

반등에 실패하면 손해가 얼마든 더 큰 손해를 막기위해 가차없이 버려버린다.

손절 로직은 매매를 계속 해보면서 크게크게 수정이 이뤄질 가능성이 크다.

이 친구가 매일 손절한 종목들을 보며 다시 반등을 줬는지 반등을 줬다면 어디에서 줬는지 분석을 많이 한다음에

코드를 적용 시킬 예정이다.

 

실제로 매수가되는 쪽의 로직은 조금 간단하게 작성해두었다.

보조지표들을 활용해서 그 값을 돌파했다면 바로 매수가 되도록 해두었고 무조건 시가보다는 높을 때 사도록했다.

왜 간단하게 해뒀냐면 일단 앞으로 가장 많이 수정될 부분이라 그렇기도하고

일단 HTS에 설정해둔 검색기로 1차적인 필터링이 적용되고  2차적으로 검색기에 포착된 종목에서도 또

필터링을 한 후 데이터 분석을 거쳐서 내려오는 청정수 종목들이기 때문이다.

아래 코드를 보듯 꽤 많은 AND 조건을 통과해야지만 이 친구에게 면접을 볼 수 있다.

내 잔고에 들어오기란 쉽지 않은 법

그리고 이런 조건들을 작성하기위해서 꽤 많은 보조지표도 만들었다.

볼린저밴드도 얼른 만들어야하는데 당장은 쓸 일이 없어서 미루고 있는 중...

 

전기세 절약하기

집에있는 데스크탑으로 해당 프로그램을 하루종일 구동하면 전기세가 감당이 안될듯하다

프로그램을 만드는데 어려움이 많았다고는 하지만 아주 작은 프로그램에 불과해서

차지하는 리소스는 데스크탑 사양의 1~4% 정도 예상된다...

그래서 내가 따로 관리를 하지않더라도 이 친구가 스스로 장이 닫히는 시간이되면 잠들고

장이 열리는 시간엔 다시 가동되도록 간단하게 코드를 짜주었다

 

아직 제대로 될 지는 모르겠지만 장시간이 아닌 현재 시간으로 테스트를 여러번 해봤는데 

아마 문제는 없을듯하다 프로그램이 다시 재부팅되면서 사용했던 배열이나 딕셔너리들도 다 초기화하며 깔끔해진다

 

어디에서 이 프로그램을 굴릴까 조금 알아봤는데

서버를 대여하는 곳도 있고 (저렴한곳은 월 5천원? 정도라고한다)

아니면 라즈베리파이를 이 참에 하나 마련해서 굴려볼까 생각도하고있다

얼마전에 라즈베리파이 5세대가 출시됐는데 램도 8기가나 되고 SSD호환이라든지

Wifi든 LAN이든 다 노트북과 다를게 없어서 굉장히 많이 좋아진듯하다

가격이 10만원이 조금 넘어서 수익이 조금 많이 난다면 장만해볼 생각이다.

 

마무리

개발기는 4편을 마지막으로 하려했는데 전혀 생각지도 못한 크고 작은 에러들이 정말 많았다...

이미 산 주식을 익절했는데 또 조건에 들어맞아서 바로 다시 매수해버리는 경우

동시에 매수포착도 손절포착도되며 시세조회까지 들어가며 다량의 요청에 API 응답을 못받아오는 경우

이미 매도를 완료한 주식인데 API 응답이 느려서 계속 매도를 시도하며 리소스를 낭비하는 경우 등등

너무 많아서 기억도 안난다.

머리로는 이렇게하면 저렇게되니까 되겠지? 라고 코드를 짜놨는데 

계속 생각하지 못한 상황들이 발생하면서 시행착오를 많이 겪었다...

그래도 한 주 내내 프로그램을 계속 가동하면서 웬만한 상황들의 에러는 다 대처한듯하다!

지금은 오히려 에러를 기다리고 있다.

변태가 된게 아니라 지금 에러를 만나야지 실전투자에서 문제없이 돌아가는 법!

 

넷플릭스에서 NASA의 우주개발에대한 다큐를 봤는데 거기 있는 사람들은

테스트 때 성공하면 엄청 진지하게 다시 하고 실패하니까 엄청 좋아하면서 문제를 해결하는 장면이 인상깊게 남아있다.

나도 지금 그 상태다

 

어찌됐든 이제는 진짜 큰 수정은 없을 듯해서 개발기는 찐마지막 글!

추후에 머신러닝을 입히게되면 그 때는 아마 개발기를 또 작성할까 고민중이고

당분간은 매매기록이나 남겨볼까 고민중이다.

다음주 장이 열리는날 문제없기 돌아가길 기도하며... 끝

 

반응형
  • hyotwo7658@gmail.com

복사 완료 👍