Alex, 주식 수익 곡선 두 개와 불만을 보내셨더군요. 백테스트에서 20일 고점 돌파 전략은 깔끔해 보입니다. 같은 종목에 같은 코드를 돌리는 모의 계좌는 진입의 절반 정도만 하고, 백테스트에서는 전혀 흔들리지 않은 날에 손절됩니다. 모의 거래 게이트웨이가 주문을 누락하느냐고 물으셨죠. 아닙니다. 일일 바가 두 세션을 한데 묶어 하나의 거래일이라고 표시하고 있습니다.
10월 22일에 표시하신 중형주 종목을 확인했습니다. 데이터 공급업체 일일 바의 고가는 $41.86입니다. 정규장에서는 $41.12를 넘는 가격이 나오지 않았습니다. $41.86은 동부시간 오후 7:41에 체결된 800주 거래로, 호가 스프레드가 22센트인 상태였습니다. 신호는 새로운 20일 고점을 표시하고 다음 시가에 매수 주문을 넣도록 했습니다. 별도로 설정하지 않는 한 동부시간 9:30부터 16:00까지 운용하는 모의 거래 세션에서는 그 돌파를 본 적이 없습니다. 매수할 게 없었습니다.
그 행의 고가는 어느 세션의 고가일까요?
미국 주식에서 일일 바는 데이터 공급업체가 편의를 위해 제공하는 것입니다. 같은 날짜에 적어도 세 가지 서로 다른 바를 받을 수 있고, 대부분의 CSV 내보내기 파일에는 어떤 바를 받았는지 표시되지 않습니다.
| 바 | 시간대 | 고가/저가가 나온 곳 | 그 고가에서 체결됐다면 의미하는 바 |
|---|---|---|---|
| 정규장 | 동부시간 9:30-16:00, 두 번의 경매 포함 | 연속 매매 장부와 시가/종가 교차 거래 | 정규 세션에서 거래했다는 뜻이며, 경매 체결인 경우가 많음 |
| 시간 외 | 대략 4:00-9:30 및 16:00-20:00, 브로커에 따라 다름 | 유동성이 얕은 장전 및 시간 외 거래 | 현금 계좌에 거래 권한이 없을 수도 있는 세션 |
| 통합 | 데이터 공급업체가 합쳐 놓은 방식에 따름 | 위의 세션이 섞여 있고, 때로는 홀수 랏과 TRF 거래도 포함 | 넓은 호가에 80주로 체결됐을 수도 있는 거래 |
암호화폐 시장에서는 UTC 자정을 거래일의 시작으로 여기는 법을 배웠습니다. 주식 시장은 그 규칙을 따를 의무가 없습니다. 롱 온리 현금 계좌로 실제 접근할 수 있는 매칭 엔진은 6시간 30분 동안 연속 매매를 하고 두 번 교차 거래를 합니다. 그 밖의 시간에는 참여자도, 스프레드도, 종가도 달라지는 경우가 많습니다.
2015년 야후 CSV 파일이 쌓인 디렉터리가 아직 있습니다. 소형 바이오테크 주식에서 멋진 Donchian 전략을 찾았다고 확신했던 때의 파일입니다. 고가는 장 마감 후의 임상시험 결과 관련 거래였습니다. 남들이 공포에 질려 판 200주를 백테스트하면서 채널 전략이라고 부르고 있었죠. 유료 데이터 피드로 같은 일을 좀 더 그럴듯하게 하고 계신 겁니다.
리서치 에이전트가 데이터 공급업체에 일일 OHLCV를 요청하면서 어느 세션인지 묻지 않았다면, 통합 바라고 가정하세요. 에이전트는 편리한 기본값을 택합니다. 편리한 기본값 때문에 오후 7:41 거래가 돌파 신호에 포함되는 겁니다.
모의 거래가 양방향으로 어긋나 보이는 이유
파일의 세션과 계좌의 세션이 다르면 단순히 거래 수가 적게 잡히는 데 그치지 않습니다. 세 가지 유형의 차이가 생기는데, 이번에는 모두 나타났습니다.
- 시간 외 고점에서 돌파 발생. 백테스트는 다음 정규장 시가에 진입합니다. 모의 계좌에는 신호가 없었습니다. 누락된 진입 8건이 여기에 해당합니다.
- 전일 저점 아래에 손절을 설정했는데, 전일 저점은 통합 바에서 가져왔습니다. 백테스트에서는 이미 시간 외 급등락에 청산됐습니다. 정규장만 표시하는 모의 계좌는 백테스트에서 보유하지 않는 것으로 나온 날까지 포지션을 유지합니다.
- 반대 방향의 손절도 있습니다. 모의 계좌는 장전 가격을 포함한 최근 가격을 표시하고, 오전 5:10 거래에 손절됩니다. 정규장 백테스트는 그 거래가 바에 없으므로 여전히 포지션을 보유합니다.
손절 사례는 돌파 누락보다 더 뼈아픕니다. 누락된 진입은 거래 수가 줄어든 것으로 나타납니다. 일곱 명이 들어선 방에서 발동된 손절은 실제로 체결한 거래의 금액을 다르게 만듭니다. 그래서 게이트웨이를 탓하셨던 거죠.
1-minute 바에서는 같은 오류가 더 조용히 나타납니다. America/New_York에서 세션으로 필터링하세요. 파일에 세션 태그가 없다면 그 필터는 보여주기용일 뿐입니다.
룩백을 재조정하기 전에 세션을 고정하세요
같은 종목과 날짜를 사용해 정규장 일일 바로 20일 고점 전략을 다시 실행했습니다. 돌파는 6건 남았습니다. 모의 계좌에서 나타난 결과입니다. 나머지 8건은 오후 7:41에 800주를 체결해야만 잡을 수 있는 거래였습니다. 세션 불일치를 모의 거래 슬리피지 매개변수로 맞추느라 일주일을 쓰지 마세요.
각 주식 시계열의 리서치 계약에 불리언 세 가지를 넣으세요: includes_premarket, includes_afterhours, includes_odd_lots. 그런 다음 전략이 거래할 수 있는 세션을 고르고, 체결 모델도 그 세션에 맞추세요. 정말 시간 외 거래를 원한다면 그렇게 명시하고 오후 7:41 거래처럼 규모를 조정하세요. 스프레드는 넓고, 취소는 느리며, 호가처럼 보이는 장부가 실제로는 한 랏뿐일 수 있습니다.
데이터 공급업체가 일일 행에 어떤 세션을 사용했는지 알려줄 수 없다면, 확인될 때까지 통합 바라고 간주하세요. 서면으로 문의하세요. 웹 차트로는 답을 알 수 없습니다. 나중에 전략이 종가에 거래해야 한다고 판단한다면, 그건 별개의 이야기입니다. 공식 종가는 참여 주문을 내야 하는 경매입니다.
세션을 고정한 채 다시 실행하세요. 그다음 6건에 관해 이야기하죠.
← 전체 글


