스펙 안의 20일 Donchian은 무해해 보인다. 에이전트는 20봉 롤링 최댓값을 작성하고, 백테스트는 parquet 파일의 첫 행에서 시작하며, 처음 2주 동안 "20일 고점"은 존재하는 봉이 무엇이든 그 누적 최댓값일 뿐이다. 4일째에는 4일 고점이다. 테스트하고 있다고 생각한 전략은 처음 12건의 체결을 만들어 낸 전략이 아니다.
ETHUSDT 일봉 노트북이 하나 있는데, 전체 표본 Sharpe는 1.4다. 처음 20세션을 자르면 0.6으로 떨어진다. 그 20세션은 남기고 1년차의 나머지를 버리면 3.1이 찍힌다. 내일을 유출한 사람은 없다. 전략은 과거를 썼을 뿐, 충분히 쓰지는 않았고, 보고서는 그 반쯤 만들어진 거래를 증거로 취급했다.
윈도가 아직 채워지는 동안 거래하게 두기
흔한 사고는 min_periods=1이다. Pandas는 내버려 두면 봉 하나로도 롤링 평균을 계산한다. 에이전트는 이걸 끊임없이 한다. 프레임 맨 위의 NaN이 버그처럼 느껴지고, 그걸 채우면 단위 테스트가 초록이 되기 때문이다.
수익률 관측이 2개인 20일 실현 변동성 타깃은 사이즈 폭발이다. 숫자 2개의 분산은 동전 던지기이고, 그걸 역수 취하면 첫 포지션이 의도한 리스크의 몇 배가 된다. 거의 0인 표준편차에 대한 z-score도 부호만 바꿔 같은 수법을 쓴다. 윈도가 정직해지고 나면 다시는 나타나지 않는 칼날 진입이 있는 것처럼 전략이 보인다.
브레이크아웃은 더 나쁘다. 진짜 규칙처럼 보이기 때문이다. 6번째 봉에서의 20봉 채널은 6봉 채널이다. 시작 직후에 거래가 몰리고, 완성된 인디케이터라면 발동하지 않았을 조용한 구간에 그런 경우가 많다. 조용한 시장은 조금 흐른다. 좁은 채널이 터진다. 에쿼티 커브는 이후 어떤 해도 반복하지 않는 헤드스타트를 얻는다.
제로 채움과 전방 채움은 다른 거짓말을 만들어 낸다. 0인 RSI는 과매도로 읽힌다. 빠진 ATR이 0이면 단위 크기가 폭주하고, 백테스트는 성실하게 창고를 사들인다. 0이 주문을 만들어 내는 것보다 NaN이 주문을 죽이는 편이 낫다.
차트 왼쪽의 빈 달이 미완성처럼 보여서, 지금도 습관적으로 0행부터 그리곤 한다. 그 빈 달이 정직한 부분이다.
에쿼티 커브는 자르고, 포지션은 남기기
이건 코드 리뷰를 통과한다. 20일 피처는 제대로 계산하고, 그린 커브에서 처음 20행을 떨어낸 뒤 1월 21일부터 공개한다. 1월 21일의 포지션은 1월 14일에 열렸다. 트레일링 스톱의 하이워터, 피라미딩 횟수, 그 번인 후의 현금: 전부 "깨끗한" 표본 안으로 걸어 들어왔다.
그 잔해는 글에 적힌 날짜에 시작할 수 없는 페이퍼 전략이다. 보고된 시작일부터 플랫으로 재시작하면 첫 주의 주문이 어긋난다. 어떤 때는 백테스트가 이미, 페이퍼 시스템이 진입할 이유가 없는 거래 안에 있다. 어떤 때는 룩백이 차가워서 페이퍼 시스템이 진입하고, 백테스트는 숨겨진 달이 이미 브레이크아웃을 가져갔기 때문에 관망한다. 오프닝 북은 둘, 공개된 시작일은 하나다.
워크포워드 폴드는 이걸 조용히 한다. 각 테스트 윈도에는 그리지 않는 룩백 꼬리가 있다. 그 꼬리 시뮬레이션을 건너뛰면 첫 테스트 거래가 다시 미완성 윈도 거래가 된다. 시뮬레이션하고 테스트 일만 보고하면, 테스트 일의 포지션은 보여 주지 않는 체결에 조건부다. 그 두 번째 버전은 정당한 리서치 선택이 될 수 있다. 폴드의 첫 아침을 콜드 스타트라고 부르면서 트레일링 스톱은 이미 꼬리에서 살아 있는 것, 그게 연구자 둘이 설정 하나에서 Sharpe 둘을 얻는 방법이다.
피처가 일이 아닌데 달력일로 워밍업하기
"30일을 줘라"는 피처를 과소 명세로 남긴다. 5분 Donchian에 달력일 30일은 20기간 룩백을 수천 봉 지나간다. 20세션이 필요한 일봉 피처에 30일은 주말과 구멍에 따라 두껍거나 얇다.
우리 무기한 거래소 하나의 펀딩레이트 z-score는 스펙이 30기간이라고 했고 누군가 기간을 달력으로 옮겼기 때문에 30일 워밍업을 받았다. 그곳 펀딩은 8시간마다 찍힌다. 30일은 약 90회 정산이다. 30기간은 10일이다. 여분의 2개월 번인에 마침 디페그 주가 들어 있었다. 그걸 떨어내자 라이브 윈도가 전략의 실제 역사보다 고요해 보였다. 사람들은 시작일 민감도를 탓했다. 워밍업이 레짐을 삼킨 것이었다.
그리고 크립토 대 주식은 아무도 파라미터를 고치지 않은 채 같은 숫자의 의미를 바꿔 버린다. ETH의 20"일"에는 토요일이 포함된다. 주식 20세션은 거의 달력상 한 달이다. 주식 노트북의 20일 룩백을 시간봉 무기한 캔들에 복사하면 이름은 20일인 20시간 채널이 된다. 그러면 첫 유효 봉은 20시간 뒤이거나, 이후 어떤 함수가 리샘플하면 20일 뒤이고, 같은 에이전트 diff에서 둘 다를 본 적 있다.
최초 거래 가능 시각을 고정하라
워밍업은 데이터 요건이지, 보너스 표본이 아니다. 모든 피처는 자신이 계산되는 단위로, 필요한 완성 관측 수를 명시한다. 최초 거래 가능 시각은 그 조건이 모두 참이고 플랫 계정이 주문을 낼 수 있었을 첫 봉이다.
| 피처 | 스펙이 보통 말하는 것 | 실제로 있어야 하는 것 | 조용한 대체물 |
|---|---|---|---|
| 20일 Donchian | 20개의 일봉 고점 | 완성된 20세션 | min_periods=1인 누적 최댓값 |
| 30일 실현 변동성 | 30일 윈도 | 30개의 종가 대 종가 수익률 | 사이즈로 역수 취한 2일 분산 |
| 20회 펀딩 z-score | 20일 | 20회 펀딩 정산 | 달력일 20일(~90회 프린트), 또는 잘못된 타임프레임의 20봉 |
| 5분 14기간 RSI | 14기간 | 마감된 5분봉 14개 | 14일, 또는 갭을 전방 채움한 14봉 |
그 시각 이전의 P&L은 트랙 레코드 밖에 둔다. 그 시각 이전의 상태는 여전히 시뮬레이션해야 할 수 있어서, 시계가 최초 거래 가능 봉에 닿을 때 트레일링 스톱이나 쿨다운은 진짜이지만, 그 체결은 Sharpe, 거래 횟수, 용량 계산에 넣지 않는다. 그다음 지저분한 점검을 돌린다. 그 시각에 플랫에서 재시작하되, 룩백은 데이터로만 제공한다. 주문이 바뀌면 숨은 거래를 내보내고 있던 것이다.
페이퍼 트레이딩도 같은 계약으로 시작한다. 각 워크포워드 테스트 윈도도 그렇다. 차트에 한 달이 빠진 것처럼 보이면, 빠진 채로 두라.
← 전체 글


