키움 API를 이용한 초단위 매매 전략과 조건 검색식 정리 테스트 결과
지난 시간에 초단위 매매 전략에 대한 테스트 결과를 정리한다.
1. 테스트 결과
2. 문제점 및 개선
1. 키움API를 이용한 초단위 매매 전략과 조건 검색식 정리 테스트 결과
[초단위 퀀트 자동매매를 위한 전략] 의 핵심은 '첫 1초 봉을 잡을 수 있느냐 없느냐'였다. 첫 1초 봉을 잡기 위해서는 장 시작하기 전에 미리 구독 신청을 해놓아야 한다. 당연히 장 중에 구독신청이 되면 그 전의 데이터가 누락되기 때문에 의미가 없다.
그럼 테스트 결과를 보자. 지난 시간에 세 개로 조건 검색식을 나눠두었다. 오늘 장 시작하기 전에 등록이 되는 걸 확인할 수 있었고 한 가지 알게 된 점은 조건 검색식의 예상체결 가는 단일가에 적용되는 듯 보인다.
장 시작 전에도 발동되고 장 시작 후에도 실시간으로 종목을 불러오는 시점이 vi 시점인걸 보면 맞는 듯하다 그때만 예상체결가를 알 수 있을 테니
그럼 지난번에 조건 검색식 3개로 나눠 놓은 부분이 제대로 구독 신청이 되었는지 확인해보자.
스크린 번호를 세 개로 나눠서 1111 / 2222 / 3333으로 구분 지어 놓았는데 3333은 없다 10 ~ 15퍼센트에 해당되는 예상체결가 조건인데 장 시작 전에는 잡힌 종목이 없다. 장 시작 전에 실시간 정보 구독 신청이 되었냐는 위 로그의 시간대로 확인하는 수밖에 없다.
키움 API에서 조건 검색 식이 검출된 시간을 별도로 알려주지 않기 때문에 구독을 하고 거래가 시작되면서 데이터가 생길 때 받을 수 있다. 따라서 9시 전에 구독신청을 해 놓으면 등록된 종목이 장이 시작하면서 데이터가 생겨야 그 시간을 받을 수 있고 그 전에는 위처럼 로그에 찍히는 내 컴퓨터의 시간으로 대체하는 수밖에 없다.
그럼 구독 신청은 제대로 되었으니 첫 1초 봉이 제대로 그려지는지 확인해보도록 한다.
키움 API를 활용한 초단위 매매를 위한 첫 1초봉 확인
매매한 내역은 밑에서 확인하도록 하고 여기서는 구독한 종목들의 첫 1초 봉이 제대로 그려지는지부터 확인해 보도록하자. 제일 중요한 부분이다.
등록이 된 시점은 내 컴퓨터 시간 기준으로 08:46분이며 첫 1초봉이 발생한 시점은 아래와 같다.
데이터를 확인해보자
-첫 1초 봉의 시간 : 09:00:15
-시가 2025 / 고가 2030 / 저가 2025 / 종가 2030 / 체결강도 500
-해당 첫 1초봉의 시가 대비 고가 0.25 %
-거래량 477
그럼 이제 애머릿지의 첫 1초 봉을 키움 HTS 차트에서 위 데이터와 맞는지 확인해보도록 하자
두 데이터가 정확히 일치한다. 된다. ㅋ
키움 API 초단위 테스트 매매 거래내역 확인
그럼 이제는 매수한 종목을 확인해 보자 코딩으로 준 매수조건이 제대로 동작하는지 확인해 보는 것이다. 첫 1초 봉이 제대로 그려지는 것이 확인이 되었다. 많은 종목이 등록되었지만 3개 정도의 첫 1초봉 데이터만 확인했다. 세 개만 맞아도 다 맞을 것으로 예상한다. 왜? 사람이 아니고 피씨니까 ㅋ
일단 매매내역은 익절 케이스와 익절하지 못한케이스 두 종목으로 본다.
1. 키움 초단위 퀀트 매매 전략 익절케이스 매매내역 확인
그림으로 하나씩 확인해보도록 하자.
매수주문시간을 보면 09:00:19초가 확인된다. 초단위 매매 전략의 매수 조건은 다음과 같다.
1. 1초 거래량 5만 주 이상
2. 1초 거래대금 5억 이상
3. 1초 봉 기준 0봉의 시가와 종가가 -1 ~ 1퍼센트 내
시간 09:00:18
시가 24250
고가 24250
저가 24200
종가 24250
거래량 129,723
거래대금 31억 이상
거래량 5만 주 이상 / 거래대금 5억 이상 / 시가 종가가 모두 24250으로 시가 대비 등락률의 종가는 0% 모든 데이터가 매수 조건식과 부합한다. 그럼 로그에 찍힌 데이터로 확인해보자.
첫 1초 봉이 정확히 키움 1초봉 차트에 그려진 데이터와 일치한다. 매수조건이 맞으니 매수한 로그도 확인이 된다. 코드를 틱 단위가 아닌 초봉을 확인한 후에 매수하기 때문에 첫 거래시간인 09:00:18의 데이터를 확인하고 바로 시장가 매수를 전달한다. 그래서 주문시간이 09:00:19초로 나온다.
이 조건에 대해서 익절 조건은 3퍼센트 손절 조건은 -99퍼센트로 설정해 두었다. 테스트를 위함이고 익절 및 손절조건은 조절할 예정이다.
매도 시간이 09:02:16초인데 이 매수와 매도를 큰 초봉 차트로 보자.
첫 화살표에 매수 2번째 화살표에 매도 수익률 3퍼센트가 되면 시장가 매도로 최종 수익률은 2.83퍼센트로 전략에 맞게 매매를 수행한 것을 알 수 있다. 초단위 매매로 바로 몇 초 후 매도가 된 것은 아니지만 매수 후 급등이 바로 있을 경우에는 바로 매도도 할 수 있다.
내가 확인한 데이터는 사고 나서 조건 만족하면 2초 내로 매매한 내역까지 확인했다.
아무튼 이건 익절 케이스 3퍼센트를 맞춘 베스트 케이스이고 첫 1초 봉에 조건식을 만족했으나 수익률 3퍼센트에 도달하지 못하고 밑으로 하락한 안 좋은 케이스를 보도록 하자
2. 키움 초단위 퀀트 매매 전략 익절 못한 케이스 매매내역 확인
위에서 설명을 자세히 했으니 여기서는 데이터만 간단히 확인하도록 한다.
매수 시간 확인
매수는 첫 1초 봉의 조건이 맞으니 제대로 했다. 그렇지만 매도 익절 조건인 3퍼센트에 다다르지 못해 매도를 하지 못하고 계속 가지고 있는 케이스다 손절 조건을 -99퍼센트로 해놓았으니 당연히 손절을 하지 않는다.
첫 봉이 제대로 그려지고 매수하는 것도 확인이 되었으니 이제 수익률과 손절률의 미세조정이 필요한 셈이다.
어떤 종목은 매수 후 10퍼센트가 넘게 상승하기도 하고 어떤 종목은 얼마 오르지 않아 시세가 죽는 케이스도 많다. 따라서 가장 최솟값으로 익절 조건을 주는 것이 좋을 것 같다. 그렇다면 손절 조건도 최소 조건으로 잡아야 한다 익절은 적은데 손절이 높으면 여러 종목을 성공해도 한 두종목만 실패하면 도루묵이 되기 때문이다.
아무튼 이 국일제지의 1분 봉 차트를 보고 어디서 매도가 되었어야 했는지 그 가격대를 보고 익절률을 낮춰보자.
1분 봉상으로 가까운 시간 내 고가는 2865며 매수한 가격 2800 대비 2.32 퍼센트 정도 오른 뒤 하락했다. 수수료 포함하면 모의는 1.3퍼센트 정도고 실제 매매는 2퍼센트가량의 수익구간을 준다. 그렇다면 절충해서 약 1.5퍼센트를 수익조건으로 주고 매도 조건은 2퍼센트로 주기로 한다? 이게 맞는지는 아직 잘 모르겠다.
그 이유로는 갭 상승하고 시세를 준 다음에도 분명 밑으로 고꾸라진 다음에 위로 올리는 놈들이 있기 때문이다 이래서 어렵다. 밑으로는 조금 더 여유를 줘야 하나 싶기도 하고 그래도 확실히 1퍼센트 이상의 수익률을 준다는 보장이 있다면 해볼 만한 것도 맞다.
아무튼 현시점에서는 1.5퍼센트 익절률에 손절률은 -2.5로 주기로 한다. 모의는 사자마자 거의 -1퍼센트고 의도적으로 누를 경우도 있기 때문에 약 조금의 여유를 보태 -2.5로 합의하기로 스스로 결정한다.
이게 반드시 시세가 몇 퍼센트 이상 터진다는 보장이 없기 때문에 익절 구간이 오면 반드시 매도를 해야 한다. 이 종목도 3퍼센트 매도 조건에 다다르지 못하니 지금은 하락해서 다음과 같다.
첫 번째 화살표에 사서 두 번째 화살표에 매도하지 못하고 세 번째 화살표까지 가지고 있는다 이건 문제가 있다.
안 팔고 놔두면 이렇게 된다. 다른 종목들은 별개의 조건 검색 식이 거나 이 조건식의 개선되지 못하는 점으로 인한 것이다. 그럼 이제 문제점 및 개선해야 할 점에 대해 알아보도록 하자.
키움 API를 활용한 초단위 매매 전략의 문제와 개선해야 할 점
첫 번째 문제점 바로 위에서 보았듯이 세부적인 매도를 위한 수익/손절률 값을 설정하는 것이다. 이것은 위에서 합의를 보았고 더 데이터가 쌓여야 하기 때문에 기다려 보도록 한다.
두 번째 문제점 조건 검색식 중 1 ~ 4.9의 예상 주가등락률을 등록하는 과정에서 9시가 가까워지면서 종목수가 100개가 넘어가는 것이 확인된다. 키움 api에서 한 화면번호에서 종목수가 100개가 넘어가면 api를 사용하는데 문제가 될 수가 있다고 한다.
이것을 개선하기 위해서 1 ~ 4.9를 2 ~ 3.5 / 3.6 ~ 3.9로 세분화하도록 한다. 또한 모든 종목에서 코스피 종목은 제외하기로 한다. 코스피 종목은 호가단위 때가 높으면 5억은 손쉽게 넘어가는 종목들이 많기 때문에 피하는 것이 나을 것 같다. 물론 아닌 종목들도 있는데 그렇게 해서 100 종목이 넘고 데이터가 많아지는데 확률이 낮을 것 같은 부분은 피하는 게 낫다고 생각한다.
세 번째 문제점 이건 문제점 + 더 개선하기 위해서 다른 매수조건을 사용할 때 하는 것으로 일단 문제점은 저렇게 장 시작하기 전에 구독하는 것은 현재 상황에서 이 종목이 전일대비 이 가격에 시작할 것이라는 것을 알려주는 것으로 정확하지 않을 수 있다. 물론 맞는 것도 있겠지만 이렇게 종목을 검출하는 방법 외에 다른 방법으로 종목을 등록해서 데이터를 받을 수 있는 방법이 있는지 생각해 보아야 한다.
예를 들어 전날 시간 외 오른 종목이나 테마가 발생해서 오를 것으로 예상되는 종목들을 장 시작 전 수동으로 미리 등록해 놓는다든가 이런 것들 말이다. 이건 매수매도를 하는 것에 대한 문제점이라기 보단 나아갈 방향으로 보도록 하자.
또 다른 하나는 현재 소스코드는 이게 첫 1초 봉인지 분간할 수가 없다. 그러니까 09:00:00초에 저 조건에 맞게 시작한 종목이 있다면 매수를 하겠지만 장 시작의 첫 1초 봉이 아닌 어느 정도 시간이 흐르고 주가가 오른 뒤에도 저 조건에 맞으면 바로 매수를 하도록 되어 있다는 것이다.
이 부분은 문제가 될 수도 기회가 될수도 있다. 문제가 되는 것은 어느 정도 오른 뒤에 위 조건에 맞아 매수를 하면 고점매수가 될 수가 있고 기회가 되는 것은 ---- 이런 상태로 계속 주가를 유지하다가 갑자기 위조건에 맞으며 급등해버리면 기회가 되는 것이다. 이것을 어떻게 개선해야 할지는 하나씩 생각해봐야겠다.
즉, 첫 1초 봉의 조건이 아닌 이미 구독을 해 놓은 종목에서 갑자기 급등하는 케이스에 대해 다른 매수조건을 만든다는 것이고 어느 정도 오른 종목들은 매수하지 않도록 코드를 수정하면 될 일이다. 그렇다면 이 봉이 첫 1초 봉인지 알아야 하나?
아직은 잘 머리가 돌아가지 않는다 이 부분에 대해서는 이어지는 포스팅에서 다루도록 한다.
퀀트매매에 있는 모든 포스팅은 스스로 정리를 위함과 생각의 흐름대로 이어지니 때때로 무언가 급하게 흘러가거나 방향이 달라질 수도 말이 안 될 수도 있습니다.