키움 API를 이용한 초단위 매매 전략 코드 수정 및 개선

    지난 시간에 문제가 되었던 키움 API를 이용한 초단위 매매 전략에 대해 소스코드를 수정함으로 더 정교하고 하락하는 종목을 피하도록 한다.

     

    키움 API 초단위 매매전략 문제점 및 개선필요 사항 보기

     

    키움 API 초단위 매매전략 문제점 소스코드 수정하여 개선하기

    지난 시간에 문제가 되었던 건 초단위로 모든 것을 전체적으로 간단히 되짚어 보자.

     

    문제점 1

    vi를 피하기 위해서 09:03 까지의 최대 검색시간을 주니 대부분의 종목이 장이 시작 후 검색식에서 종목을 던져주기 때문에 첫 초봉을 만들 수 없어 매매가 불가능해진다.

     

    해결방법

    검색시간을 예전처럼 09:00 장 시작전에 받을 수 있도록 조건검색식에서 검색시간을 삭제하고 코드상으로 정적 vi를 계산해서 현재가가 vi보다 적은 가격일 때만 매수하도록 한다. 비단 이 조건검색식에만 해당하는 문제점이 아니고 이 부분은 전체 매수 조건식에 적용해야 할 내용인 듯 하다.

     

    문제점 2.

    장 시작 후 첫 1초봉이 조건이 맞으면 무조건 매수를 하게 되어있다. 이것으로 인해 첫 1초봉이후 떨어지는 종목들도 있는데 이 종목들을 구분하기가 어렵다. 일봉상으로도 체크를 했지만 딱히 구분하기가 어렵다.

     

    해결방법

    종목들이 장 시작전 바로 상승하는 경우가 있고 장시작 후 초단위로 몇 초 뒤 혹은 몇 분 뒤 상승하는 경우들이 있다. 어차피 장시작 후 1초 안에 몇 퍼센트가 상승하는 종목들은 퀀트 매매로도 잡을 수가 없고 ( 내 실력으론 불가능 틱단위로 보면 잡을 수도 있을 듯) 어느정도의 시간을 두고 상승하기 때문에 이 상승하는 시간과 첫 1초봉에 기준점을 두고 첫 1초봉 시가 그러니까 오늘의 시가 보다 같거나 0.5퍼센트 내외의 가격들이 현재 1초봉안에 들어오면 매수하게 한다.

     

    매수조건

    - 첫 1초봉의 크기가 해당 초봉의 시가 대비 종가 -1 ~ 1

    - 첫 1초봉의 거래량이 5만주 이상

    - 첫 1초봉의 거래대금이 5억 이상

     

    이 시간도 첫 1초봉의 거래시간과 비교해서 30초에서 3분안에 위 조건에 해당하는 종목들만 매수하도록 개선한다.

     

    즉, 첫 1초봉이 아래의 조건에 해당하더라도 바로 매수하지 않고 30초 ~ 180초 안에서 오늘의 시가보다 같거나 0.5퍼센트 내로 상승한 종목을 매수하도록 하는 것이다. 그러니 첫 1초봉의 거래시간보다 30초 내에 0.5퍼센트 이상 상승하고 슈팅을 준다면 매수하지 않을테고 30초 내 슈팅을 주고 다시 밑으로 내려와서 오늘의 시가보다 같거나 시가보다 0.5퍼센트 내로 상승한 종목이면 매수를 할 것이다. 

     

    여기서 또한 문제점이 있을 수 있는데 30초 내 슈팅을 크게 줘서 이미 시세가 꺾인 종목이 매수되게 하면 안되므로 이 부분을 막을 수 있도록 추가해야 한다. 이건 예전에 별도로 종목이 검색되었을 때 가격을 저장하고 해당 가겨보다 몇 퍼센트 상승하면 매수하지 못하도록 한 부분이 있어서 어렵지 않게 가능하다.

     

    그럼 수정한 코드를 보기 전에 차트로 어느 부분인지 대략적으로 살펴보자.

     

    차트로 알아보는 문제 부분과 사야할 부분

    1. SM life design

    이런 것들이 문제가 된다. 첫 1초봉만 보면 모든 조건에 만족하니 바로 매수를 진행하기 때문에 이렇게 하락해 버리면 손절밖에 답이 없다. 요거를 간단히 없얘려면 갭크기로 보면 될수도 있지만 이것도 확실치 않다. 이거를 4퍼센트 이상으로 코드를 설정했는데 그냥 1퍼센트 이상으로 해도 될 듯 하다. 어차피 코드에서 시간과 현재가 조건을 매수조건에 추가할테니 상관 없을 듯 하다.

     

    2. FSN

    이 종목은 첫 1초봉에 조건이 맞고 대략 10초 뒤부터 본격 상승을 시작한다. 첫 1초 거래시간 보다 30초로 하지말고 10초 ~ 180초로 수정해야겠다.

     

    이렇게 수정하면 10초때에 두번째 화살표 종가보다 첫번째 화살표 즉 첫 1초봉의 종가보다 0.5퍼센트 내외로 있을테니 두번째 화살표 1초봉이 생성되자마자 바로 시장가 매수를 주문한다.

     

    다른 종목을 더 보자.

     

    3. 실리콘투

    실리콘투의 첫 1초봉의 종가는 2770 이며 이보다 0.5퍼센트 오른 가격은 2783원이다. 

    잘못 생각했다. 매수하는 포인트는 첫 1초봉의 종가가 아니라 오늘의 시가다 시가대비 0.5 퍼센트 안으로 오른 가격 중 첫 거래 시작하고 난 뒤 10초 ~ 180초 안에 오늘 시가와 같거나 시가대비 0.5퍼센트 오른 가격에 있는 종목을 매수한다.

     

    그런데 이거를 보니 아슬아슬하게 안들어오고 있는데 0.6퍼센트로 늘리고 매수하기 전 1초봉의 조건을 저가와 종가가 오늘 시가와 같거나 0.6 퍼센트 내로 상승한 가격으로 수정하면 될 듯하다.

     

    그럼 2781원이 나오는데 거래 시작 후 10초에서 180초 내에 2765와 같거나 크고 2781 보다는 작거나 같으면 매수한다.

    단 그 전에 이 종목이 오늘 시가대비 3퍼센트 이상 상승한 이력이 있으면 매수하지 않는다.

     

     

    약 10초 뒤에 첫번째에 해당하는 부분에는 다다르지 못하고 

     

    두번째 해당하는 부분은 2781 보다 저가와 종가가 같기 때문에 해당봉 이후에 바로 매수주문을 넣을 것이다.

     

    4. 알로이스

    첫 1초봉이 조건을 만족하고 위 캡쳐된 시간대의 종가가 오늘 시가와 같다. 그럼 다음봉에서 바로 매수를 진행할테고 매수 후 약 2초 뒤 2 퍼센트 정도 상승한 가격이 나오기 때문에 시장가 매도를 진행할 것이다. 물론 저렇게 진짜 틱단위로 한번 튀고 나올 때 재수가 없으면 매도를 안하는 경우도 있다.

    2130이라는 것도 시장가 매수에서 전 1초봉 종가와 베스트로 맞았을 때를 이야기하는 것이고 수수료가 붙으면 1.5프로도 간당간당할 수도 있다. 모의는 사자마자 거의 0.8정도니 간당간당한다.

     

    그래도 테스트할 때는 1.5 정도를 수익권으로 주고 2프로를 손절률로 지정해보자. 이 정도로 매수타점을 세밀하게 잡았는데도 사자마자 내려간다는 건 있을수가 없다. 그건 진짜 그냥 재수가 없다고 생각하자.

     

    자 그럼 이제 소스코드가 내가 생각한대로 되어 있는지 대략적으로 살펴보자. 어차피 난 다 유튜브에서 보고 구글링해서 찾고 독학해서 한 거다. 뭐 개판이어도 상관없다는 이야기다 동작만 잘되면 그만.

     

    키움 API 초단위 스켈 매매를 위한 소스코드 개선하기

    첫번째 문제점이었던 vi 가격에 매수하지 않기 위해 어떤 종목이든 검색이 되면 오늘의 시가를 보고 9퍼센트 내의 가격대를 알아둔다. vi는 10퍼센트지만 음 사실 이건 어느정도 오르면 매수하지 않게 해둔 부분이 있는데 그게 정상적으로 동작하면 이건 없어도 된다. 다만 조건검색식 명마다 다르게 limit을 걸어두었기 때문에 어떻게 되어있는지 다시 봐야겠다.

     

    그래도 일단 vi가격대 오늘 시가 대비 10퍼센트 오른 가격보다 1퍼 낮은 9퍼센트 오른 가격을 저장해둔다.

    일단 기억만해둔다. 어떻게 쓸지는 조금 있다가 보자. 

     

    이제 세부적인 조건들을 넣어보자.

    첫 초봉이 그려질 때 dict에 아무런 값이 없으면 first_chobong을 True로 넣고 예상체결가 등락률이 condition_nm에 있으면 1초봉을 로그로 찍고 first_chobong을 false로 변경해 준다. 그럼 다음 초봉이 만들어질 때 이 라인을 타지 않게 된다.

     

    첫 초봉일 때만 True이기 때문에 이 라인을 타게 되는데 이 때 매수하는 조건들을 넣어준다.

    여기서 1초봉의 매수조건식 즉 1초봉의 주가등락률이 -1 ~ 1 에 있고 일봉 주가 등락률이 1 ~ 19 퍼센트 사이 1초 거래량이 5만주 이상 1초 거래대금이 5억 이상이면 dict에 skell을 만들어서 True로 저장한다.

     

    이 값이 True이면 첫 1초봉이 매수조건에 만족했음을 알 수 있다. 또한 이 조건을 만족한다면 skellprice를 dict에 만들어서 skellprice의 가격을 오늘 시가대비 0.6퍼센트 오른 값으로 저장해 둔다.

     

    첫 초봉이 그려질 때만 라인을 타면서 조건이 만족하면 dict에 skell:True skellprice:시가대비 0.6퍼센트 가격을 저장해두는 코드다. 이 다음부터 거래가 체결될 때마다 다음라인을 타면서 조건검색식이 일치할 경우 현재 시간이 서치타임보다 30초 ~ 180초 사이에 있을경우에 매수를 한다.

    아니다. 서치타임은 09:00 초에 나올 수도 있으나 이런 것들은 대부분 첫 1초봉이 제대로 그려지지 않을테고 08:45분즘에 검출된 종목들은 매수가 되지 않는다. 그러니 이렇게 하면 안되고 첫 1초봉이 그려질 때의 체결시간을 별도로 기억해 두어야 한다.

     

    그럼 skellprice를 계산하는 라인밑에다 첫 1초봉의 시간을 기록해두자.

    first_chobong_time이라는 것을 만들어두고 여기에 skellprice라인을 탈 때 데이터로 받은 거래시간을 넣어준다. 그리고 이 시간을 기준으로 현재 체결되는 시간과 비교를 하면 된다.

     

    first_chobong_time이 마지막에 그려질 때 생성되면 first_chobong_time이라는 것이 없게되니 맨 첫 틱에서 first_chobong_time을 '-'으로 생성해준다.

     

    그리고 if 조건문으로 first_chobong_time이 '-' 값이 아닐 경우에 현재 체결시간과 비교를 하게한다. Try exept로도 가능하지만 가급적 전체적인 틀을 제대로 짜기 위해 이렇게 한다.

     

    첫 틱에서 first_chobong_time의 초기값으로 tradetime을 넣어준다. 그래야 밑에서 if문을 안쓸 수 있다.

     

    자 그럼 이렇게 만들어진 first_chobong_time을 거래되는 시간과 비교하는 변수를 boolean으로 만든다.

    그리고 이것들을 모두 and 조건으로 맞을 경우 return True를 줘서 매수를 할 수 있도록 한다.

     

    매수를 진행하게 한다.

    그리고 마지막으로 아까 위에서 말했던 검색되었을 때 가격 대비 어느정도 상승하고 난 뒤에는 매수를 못하게 해놨는데 검색식마다 다르게 설정해 두었던게 기본 검색되었을 때 현재가를 저장하고 이 현재가 보다 위 아래 2퍼센트 내로 있을 경우에는 매수 그리고 특정 퍼센트 이상을 상승한 뒤에 2퍼센트 가격대로 내려오면 매수하지 못하게 별도의 check flag를 두었다.

     

    기본적인 매수범위는 +/-2프로인데 이것은 수정할 필요가 없을 것 같고 조건검색식명에 예상체결가등락률이 있을 경우 2퍼센트 이상 상승했을 때 check flag를 False로 return해서 매수하지 않게 하면 될 것 같다. 이것은 open가가 아닌 검색된 후 첫 체결가를 저장한 것이니 이 조건식은 검색후 첫 현재가가 오늘의 시가이니 상관이 없다. 

     

    그럼 최종적으로 정리하면 모든게 positive하게 검색식이 09:00 장 시작전에 받아져서 종목의 socket이 미리 열리고 장 시작 후 첫 1초 봉이 위 매수조건을 모두 만족하면 저장하고 있다가 장시작시간보다 30초에서 180초 사이의 현재가가 오늘의 시가보다 같거나 0.6퍼센트 내의 가격이면 return True를 한다.

    그리고 이와 별개로 조건검색식에서 종목이 추출되고 첫 거래가 발생을 하면 첫 거래의 현재가 즉 이 경우는 오늘의 첫 거래를 받아올 수 있으니 현재가가 오늘의 시가가 되는것이다. 이 현재가를 받아서 +/- 2퍼센트의 가격대를 저장해두고 나중에 최종적으로 매수할 때 이 가격대 안에 있는지 확인한다. 다시 확인해보니 +/- 4퍼센트로 검색 가격대비 상하 범위로 두었는데 어차피 buycheck flag를 계속 체크하면서 3퍼센트 이상 상승했을 경우 해당 값을 False로 변경하니 매수하지 않게 된다.

     

    초봉에서 return해준 True가 (아까의 1초봉 매수조건이 True return일 경우) 현재가가 이 범위의 가격대 안에 있다고 하더라도 이미 시세를 주었다고 생각할 수 있는 가격대를 터치하고 왔다면 (이 매수조건의 경우 수익 기대값이 1.5퍼센트 정도이기 때문에 적어도 오늘 시가대비 2프로나 3프로에 해당하는 가격을 터치하고 왔다면) 별도의 flag를 False로 만들어서 매수하지 못하게 한다. (일단 이 조건식은 3퍼센트로 설정)

     

    최종적으로 동작사항으로 이 조건식을 설명한다면, 첫 1초봉이 조건에 만족하고 10초내 오늘 시가대비 3퍼센트의 가격을 터치하고 온다면 검색시간대대비 10초 ~ 180초 안에 들고 오늘의 시가와 같거나 0.5퍼센트 오른가격에 있더라도 매수하지 않는다.

     

    그렇지 않고 장 시작 후 10초에 3퍼센트 미만의 상승 혹은 횡보 혹은 하락 후 10초 ~ 180초 시간대에 오늘시가와 같거나 시가대비 0.5퍼센트 가격에 다달으면 매수하는 동작을 할 것이고 180초가 될 때까지 매수조건에 다다르지 않으면 이 종목은 이 후 슈팅을 주더라도 매수하지 않는다.

     

    오류없이 의도한 대로 잘 동작해 주었으면 한다. 테스트 결과는 내일 다시 포스팅하도록 한다.

     

    키움 api 초단위 매매 전략 소스코드 수정 건 테스트 결과 보기

    댓글

    Designed by JB FACTORY