고점 추적
활성 기준가가 없으면 관측된 cycle high를 갱신합니다. 가격이 cycle high 대비 reset_drawdown_pct만큼 하락하면 기준가를 설정합니다.
기존 drawdown 가중 매수는 buy_pct multiplier이고, DrawUpDown은 기준가와 ladder 체결 이력을 별도로 갖는 전략입니다.
활성 기준가가 없으면 관측된 cycle high를 갱신합니다. 가격이 cycle high 대비 reset_drawdown_pct만큼 하락하면 기준가를 설정합니다.
기준가가 설정되면 상승/하락 ladder 체결 여부만 기록하고, 새로운 reset trigger가 나오기 전까지 기준가는 바꾸지 않습니다.
기준가 설정 이후 더 높은 cycle high가 만들어지고 다시 reset_drawdown_pct 하락이 확인될 때만 기준가를 새로 설정합니다.
기준가 50,000,000원 -> 55,000,000원
+10% ladder 첫 통과: BTC 5% 매도
기준가 50,000,000원 -> 45,000,000원
-10% ladder 첫 통과: 현금 20% 매수
cycle high 100,000,000원 -> 50,000,000원
고점 대비 50% 하락: 새 기준가 후보 설정
가격이 기준가 대비 +10%, +20%, +30% 등 새 상승 구간을 처음 통과하면 각 구간마다 BTC 5% 매도를 예약합니다.
가격이 기준가 대비 -10%, -20%, -30% 등 새 하락 구간을 처음 통과하면 각 구간마다 현금 20% 매수를 예약합니다.
이미 처리한 ladder level은 기준가가 reset되기 전까지 다시 체결하지 않습니다.
모든 매수/매도는 거래소 전체 잔고가 아니라 Phase4 strategy wallet의 운용금과 리스크 한도 안에서만 계산합니다.
50% reset은 가정값입니다. Day27-30에서 4년 cycle별 데이터와 수수료/슬리피지 반영 후 실제 후보를 비교합니다.
DrawUpDown 기준점 분석은 2017년 이후 BTC-KRW 일봉 OHLCV를 같은 시간 경계와 같은 컬럼으로 정규화한 데이터셋에서 시작합니다.
기존 백테스트/가격 루프와 같은 Upbit 기준 데이터를 우선 수집하고, 2017-09-25 이후 커버리지를 확인합니다.
Bithumb은 교차 검증용 보조 소스로 두고, 가격 차이와 누락 구간을 metadata에 기록합니다.
캔들 종료 시각을 UTC로 저장합니다.
사용자/리포트 기준 날짜입니다.
upbit 또는 bithumb입니다.
원 거래소 마켓명입니다.
Day27 MVP는 1d만 허용합니다.
DrawUpDown 분석은 close_krw를 기준으로 시작하고 OHLC는 검증용으로 보관합니다.
거래량 기반 이상치 필터와 보조 리포트에 사용합니다.
재현성과 수집 이력 확인을 위한 메타 컬럼입니다.
Day28 분석은 정규화된 BTC-KRW 일봉 CSV를 읽어 4년 cycle별 고점과 40/50/60% reset 후보를 계산합니다.
cargo run -p bn-collect-backtest --bin drawupdown-reset-analysis -- --csv data/drawupdown/btc_krw_daily.csv --cycle-start 2017-09-2550%보다 빠른 reset 후보입니다. 진입은 빠르지만 기준가가 높게 잡힐 수 있습니다.
Day26 기본 reset_drawdown_pct입니다. Day29 백테스트의 우선 기본값입니다.
더 깊은 하락을 기다리는 보수 후보입니다. 기회는 줄지만 기준가가 낮아집니다.
4년 cycle window 안에서 close_krw가 가장 높았던 날짜입니다.
해당 cycle의 고점 종가입니다.
고점 이후 threshold 하락을 처음 통과한 날짜입니다.
reset 기준가 후보로 사용할 crossing 당일 종가입니다.
고점 대비 실제 하락률입니다.
cycle high부터 crossing까지 걸린 일수입니다.
Day29 백테스트는 Day27 BTC-KRW 일봉 CSV를 시간순으로 읽고, 미래 고점 없이 rolling high와 anchor ladder를 시뮬레이션합니다.
cargo run -p bn-collect-backtest --bin drawupdown-backtest -- --csv data/drawupdown/btc_krw_daily.csv --format csvDrawUpDown 체결 후 최종 평가금 기준 수익률입니다.
시작 현금을 첫 종가에 BTC로 바꿨다고 가정한 HODL 비교 수익률입니다.
전략 포트폴리오 평가금 기준 최대 낙폭입니다.
rolling high 대비 reset_drawdown_pct 하락으로 anchor가 설정된 횟수입니다.
하락/상승 ladder별 체결 횟수입니다.
전략 종료 시 남은 BTC와 현금입니다.
Day30 파라미터 실험은 Day29 백테스트를 같은 데이터셋에서 반복 실행해 trigger/reset 조합별 ROI, HODL 대비 초과수익, MDD, 거래 횟수를 한 표로 비교합니다.
cargo run -p bn-collect-backtest --bin drawupdown-sweep -- --csv data/drawupdown/btc_krw_daily.csv --format csv기준가 대비 몇 퍼센트 움직일 때 ladder를 체결할지 비교합니다.
rolling high 대비 몇 퍼센트 하락하면 새 anchor를 잡을지 비교합니다.
기본 실험은 BTC 5% 매도를 고정하고, 필요하면 리스트로 확장합니다.
기본 실험은 현금 20% 매수를 고정하고, 필요하면 리스트로 확장합니다.
전략 ROI 높은 순서로 정렬하고, 동률은 MDD가 낮은 조합을 우선합니다.
T10-R50-S5-B20처럼 trigger/reset/sell/buy 조합을 고정 식별자로 남깁니다.
strategy_roi_pct에서 hodl_roi_pct를 뺀 HODL 대비 초과수익입니다.
너무 잦은 체결로 수수료와 운영 리스크가 커지는 조합을 걸러냅니다.
종료 시점 BTC 평가금과 현금을 합친 최종 전략 평가금입니다.
입력 데이터의 누락 일봉 경고 수를 결과 행마다 보존합니다.
Day31은 DrawUpDown을 기존 reference-price trigger 전략과 병렬 선택 가능한 engine strategy_type으로 연결합니다. 기본값은 계속 trigger이고, DrawUpDown은 명시적으로 선택할 때만 작동합니다.
{
"strategy_type": "drawupdown",
"drawupdown": {
"trigger_step_pct": "10",
"sell_btc_pct": "5",
"buy_cash_pct": "20",
"reset_drawdown_pct": "50",
"max_ladder_levels": 10
}
}`trigger`는 기존 전략, `drawupdown`은 anchor/reset ladder 전략입니다.
엔진은 관측된 가격만으로 rolling high를 갱신하고 future high를 보지 않습니다.
reset drawdown 이후 잡힌 anchor는 다음 reset 전까지 고정됩니다.
한 tick에서 여러 ladder level을 통과하면 여러 체결을 batch로 보존합니다.
DrawUpDown 체결은 `strategy_id=drawupdown`으로 기록됩니다.
실시간 엔진은 min_btc_qty, cash reserve, fee/slippage, paper/live guard를 유지합니다.
Day32는 DrawUpDown을 설정/백테스트 화면에 노출하되, reset/ladder/sizing raw input은 고급 파라미터와 구독 권한 뒤로 분리합니다.
Day30 기본 family입니다. 50% reset 이후 10% ladder로 상승 매도와 하락 매수를 분리합니다.
15% ladder로 체결 빈도를 낮춘 보수형 preset입니다. 초보 화면에서 기본 후보와 함께 노출합니다.
60% reset까지 기다리는 깊은 anchor preset입니다. VIP 화면에서 실험 후보로 분리합니다.
기준가 대비 10%, 20%, 30%처럼 ladder 간격을 만듭니다.
상승 ladder를 처음 통과할 때 현재 BTC 보유량의 5%를 매도합니다.
하락 ladder를 처음 통과할 때 사용 가능한 현금의 20%를 매수합니다.
cycle high 대비 50% 하락을 기준가 재설정 후보로 봅니다.