Strategy specification

DrawUpDown 전략 명세

고점 대비 깊은 하락에서 기준가를 고정하고, 기준가 대비 상승/하락 ladder마다 정해진 비율로 BTC를 팔거나 현금을 투입하는 anchor 전략입니다.

Default parameters

기본값은 실거래 적용값이 아니라 Day27-30 분석과 백테스트의 기준 실험값입니다.

phase4-day26-2026-05-09
trigger_step_pct
10%
reset_drawdown_pct
50%
sell_btc_pct
5%
buy_cash_pct
20%
Anchor and reset

기준가는 reset trigger 전까지 고정합니다.

기존 drawdown 가중 매수는 buy_pct multiplier이고, DrawUpDown은 기준가와 ladder 체결 이력을 별도로 갖는 전략입니다.

DiscoveringHigh

고점 추적

활성 기준가가 없으면 관측된 cycle high를 갱신합니다. 가격이 cycle high 대비 reset_drawdown_pct만큼 하락하면 기준가를 설정합니다.

Anchored

기준가 고정

기준가가 설정되면 상승/하락 ladder 체결 여부만 기록하고, 새로운 reset trigger가 나오기 전까지 기준가는 바꾸지 않습니다.

ResetCandidate

새 기준가 후보

기준가 설정 이후 더 높은 cycle high가 만들어지고 다시 reset_drawdown_pct 하락이 확인될 때만 기준가를 새로 설정합니다.

Ladder rules

상승 구간은 BTC 매도, 하락 구간은 현금 매수로 처리합니다.

max_ladder_levels 10

상승 예시

기준가 50,000,000원 -> 55,000,000원

+10% ladder 첫 통과: BTC 5% 매도

하락 예시

기준가 50,000,000원 -> 45,000,000원

-10% ladder 첫 통과: 현금 20% 매수

Reset 예시

cycle high 100,000,000원 -> 50,000,000원

고점 대비 50% 하락: 새 기준가 후보 설정

상승 ladder

가격이 기준가 대비 +10%, +20%, +30% 등 새 상승 구간을 처음 통과하면 각 구간마다 BTC 5% 매도를 예약합니다.

하락 ladder

가격이 기준가 대비 -10%, -20%, -30% 등 새 하락 구간을 처음 통과하면 각 구간마다 현금 20% 매수를 예약합니다.

중복 체결 방지

이미 처리한 ladder level은 기준가가 reset되기 전까지 다시 체결하지 않습니다.

운용금 경계

모든 매수/매도는 거래소 전체 잔고가 아니라 Phase4 strategy wallet의 운용금과 리스크 한도 안에서만 계산합니다.

Historical analysis

2017년 이후 BTC-KRW 데이터로 기준점을 검증합니다.

50% reset은 가정값입니다. Day27-30에서 4년 cycle별 데이터와 수수료/슬리피지 반영 후 실제 후보를 비교합니다.

2017년 이후 BTC-KRW 일봉 데이터를 Upbit/Bithumb 기준으로 준비합니다.
2017-2021-2025 전후 4년 cycle별 고점 대비 40/50/60% 하락 anchor 후보를 비교합니다.
10/15/20% trigger_step_pct와 5% 매도, 20% 매수 기본값의 거래 횟수, 수수료, 현금 고갈 위험을 비교합니다.
백테스트는 HODL ROI, 전략 ROI, MDD, 남은 현금, 총 수수료, ladder별 체결 수를 함께 기록합니다.
Data contract

BTC-KRW 일봉 데이터 계약

DrawUpDown 기준점 분석은 2017년 이후 BTC-KRW 일봉 OHLCV를 같은 시간 경계와 같은 컬럼으로 정규화한 데이터셋에서 시작합니다.

phase4-day27-2026-05-09
Target dataset
market
BTC-KRW
interval
1d
start
2017-09-25
cache
rust/bn_crypto_collect/data/drawupdown/btc_krw_daily.csv

upbit

primary
KRW-BTC

기존 백테스트/가격 루프와 같은 Upbit 기준 데이터를 우선 수집하고, 2017-09-25 이후 커버리지를 확인합니다.

bithumb

secondary
BTC_KRW

Bithumb은 교차 검증용 보조 소스로 두고, 가격 차이와 누락 구간을 metadata에 기록합니다.

정규화 CSV 컬럼

timestamp_utc
RFC3339 string

캔들 종료 시각을 UTC로 저장합니다.

date_kst
YYYY-MM-DD

사용자/리포트 기준 날짜입니다.

exchange
enum

upbit 또는 bithumb입니다.

market
string

원 거래소 마켓명입니다.

interval
string

Day27 MVP는 1d만 허용합니다.

open_krw, high_krw, low_krw, close_krw
decimal string

DrawUpDown 분석은 close_krw를 기준으로 시작하고 OHLC는 검증용으로 보관합니다.

volume_btc, turnover_krw
decimal string

거래량 기반 이상치 필터와 보조 리포트에 사용합니다.

source, ingested_at_utc
string

재현성과 수집 이력 확인을 위한 메타 컬럼입니다.

품질 게이트

timestamp_utc는 오름차순이고 중복이 없어야 합니다.
첫 캔들은 2017-09-25 또는 그 이전 검증 가능한 BTC-KRW 시작일이어야 합니다.
마지막 캔들은 최신 완료 일봉 기준 2일 이내여야 합니다.
close_krw, high_krw, low_krw, open_krw는 모두 0보다 커야 합니다.
high_krw >= low_krw이고 close_krw는 low/high 범위 안에 있어야 합니다.
누락 일자는 metadata의 missing_dates 배열에 기록합니다.
Day28: 정규화 CSV를 읽어 cycle high와 40/50/60% reset 후보를 계산합니다.
Day29: 같은 CSV를 DrawUpDown 백테스트 입력으로 사용합니다.
Day30: trigger/reset/sizing parameter sweep 결과를 별도 결과 CSV/JSON으로 분리합니다.
Reset analysis

40/50/60% reset 후보를 cycle high 기준으로 계산합니다.

Day28 분석은 정규화된 BTC-KRW 일봉 CSV를 읽어 4년 cycle별 고점과 40/50/60% reset 후보를 계산합니다.

phase4-day28-2026-05-09
drawupdown-reset-analysis
cargo run -p bn-collect-backtest --bin drawupdown-reset-analysis -- --csv data/drawupdown/btc_krw_daily.csv --cycle-start 2017-09-25
40%

50%보다 빠른 reset 후보입니다. 진입은 빠르지만 기준가가 높게 잡힐 수 있습니다.

50%

Day26 기본 reset_drawdown_pct입니다. Day29 백테스트의 우선 기본값입니다.

60%

더 깊은 하락을 기다리는 보수 후보입니다. 기회는 줄지만 기준가가 낮아집니다.

Reset 후보 출력 컬럼

cycle_high_date_kst

4년 cycle window 안에서 close_krw가 가장 높았던 날짜입니다.

cycle_high_close_krw

해당 cycle의 고점 종가입니다.

crossing_date_kst

고점 이후 threshold 하락을 처음 통과한 날짜입니다.

anchor_close_krw

reset 기준가 후보로 사용할 crossing 당일 종가입니다.

drawdown_pct

고점 대비 실제 하락률입니다.

days_from_high

cycle high부터 crossing까지 걸린 일수입니다.

Day29 handoff

Day29는 같은 CSV를 사용해 DrawUpDown backtest를 구현합니다.
reset_drawdown_pct=50을 우선 기본값으로 두되, 40/60 후보도 비교 가능하게 유지합니다.
백테스트는 미래 고점을 미리 보지 않고 rolling high 기준으로 reset을 계산해야 합니다.
Backtest

DrawUpDown 백테스트는 rolling high만 보고 체결합니다.

Day29 백테스트는 Day27 BTC-KRW 일봉 CSV를 시간순으로 읽고, 미래 고점 없이 rolling high와 anchor ladder를 시뮬레이션합니다.

phase4-day29-2026-05-09
drawupdown-backtest
cargo run -p bn-collect-backtest --bin drawupdown-backtest -- --csv data/drawupdown/btc_krw_daily.csv --format csv
trigger_step_pct
10%
sell_btc_pct
5%
buy_cash_pct
20%
reset_drawdown_pct
50%

Backtest summary 지표

strategy_roi_pct

DrawUpDown 체결 후 최종 평가금 기준 수익률입니다.

hodl_roi_pct

시작 현금을 첫 종가에 BTC로 바꿨다고 가정한 HODL 비교 수익률입니다.

max_drawdown_pct

전략 포트폴리오 평가금 기준 최대 낙폭입니다.

reset_count

rolling high 대비 reset_drawdown_pct 하락으로 anchor가 설정된 횟수입니다.

buy_trade_count / sell_trade_count

하락/상승 ladder별 체결 횟수입니다.

ending_btc / ending_cash_krw

전략 종료 시 남은 BTC와 현금입니다.

Day30 handoff

Day30에서 drawupdown-sweep이 이 backtest 로직을 공유 모듈로 재사용합니다.
CSV summary는 parameter sweep 결과 테이블에 병합할 수 있게 1행으로 유지합니다.
JSON output은 trade list를 포함하므로 Day31 전략 엔진 통합 검증 자료로 사용합니다.
Parameter sweep

10/15/20% trigger와 40/50/60% reset을 같은 기준으로 비교합니다.

Day30 파라미터 실험은 Day29 백테스트를 같은 데이터셋에서 반복 실행해 trigger/reset 조합별 ROI, HODL 대비 초과수익, MDD, 거래 횟수를 한 표로 비교합니다.

phase4-day30-2026-05-09
drawupdown-sweep
cargo run -p bn-collect-backtest --bin drawupdown-sweep -- --csv data/drawupdown/btc_krw_daily.csv --format csv
trigger_step_pcts
10, 15, 20

기준가 대비 몇 퍼센트 움직일 때 ladder를 체결할지 비교합니다.

reset_drawdown_pcts
40, 50, 60

rolling high 대비 몇 퍼센트 하락하면 새 anchor를 잡을지 비교합니다.

sell_btc_pcts
5

기본 실험은 BTC 5% 매도를 고정하고, 필요하면 리스트로 확장합니다.

buy_cash_pcts
20

기본 실험은 현금 20% 매수를 고정하고, 필요하면 리스트로 확장합니다.

Sweep 비교 컬럼

rank_by_strategy_roi

전략 ROI 높은 순서로 정렬하고, 동률은 MDD가 낮은 조합을 우선합니다.

combination_id

T10-R50-S5-B20처럼 trigger/reset/sell/buy 조합을 고정 식별자로 남깁니다.

excess_roi_pct

strategy_roi_pct에서 hodl_roi_pct를 뺀 HODL 대비 초과수익입니다.

total_trade_count

너무 잦은 체결로 수수료와 운영 리스크가 커지는 조합을 걸러냅니다.

final_value_krw

종료 시점 BTC 평가금과 현금을 합친 최종 전략 평가금입니다.

warning_count

입력 데이터의 누락 일봉 경고 수를 결과 행마다 보존합니다.

Day31 handoff

Day31은 sweep 결과에서 선택한 preset을 전략 엔진 타입으로 통합합니다.
실거래 노출 전에는 ROI 1등보다 MDD, 거래 횟수, 수수료가 안정적인 조합을 우선합니다.
추가 sizing 실험은 --sell-btc-pcts, --buy-cash-pcts 리스트를 확장해 같은 출력 표에 합칩니다.
Engine integration

DrawUpDown은 이제 engine strategy_type으로 선택합니다.

Day31은 DrawUpDown을 기존 reference-price trigger 전략과 병렬 선택 가능한 engine strategy_type으로 연결합니다. 기본값은 계속 trigger이고, DrawUpDown은 명시적으로 선택할 때만 작동합니다.

phase4-day31-2026-05-09
StrategyConfig
{ "strategy_type": "drawupdown", "drawupdown": { "trigger_step_pct": "10", "sell_btc_pct": "5", "buy_cash_pct": "20", "reset_drawdown_pct": "50", "max_ladder_levels": 10 } }

Engine contract

strategy_type

`trigger`는 기존 전략, `drawupdown`은 anchor/reset ladder 전략입니다.

rolling high

엔진은 관측된 가격만으로 rolling high를 갱신하고 future high를 보지 않습니다.

fixed anchor

reset drawdown 이후 잡힌 anchor는 다음 reset 전까지 고정됩니다.

TradeResult::Batch

한 tick에서 여러 ladder level을 통과하면 여러 체결을 batch로 보존합니다.

strategy_id

DrawUpDown 체결은 `strategy_id=drawupdown`으로 기록됩니다.

safety limits

실시간 엔진은 min_btc_qty, cash reserve, fee/slippage, paper/live guard를 유지합니다.

Day32 handoff

Day32는 raw parameter를 바로 노출하지 않고 preset 중심 UI 정책으로 연결했습니다.
초보자 화면은 DrawUpDown 50/10 같은 검증된 family 이름과 리스크 설명을 먼저 보여줍니다.
advanced trigger/reset/sizing control은 구독/고급 모드에서만 열립니다.
UI exposure policy

DrawUpDown UI 노출 정책은 초보자 preset 중심입니다.

Day32는 DrawUpDown을 설정/백테스트 화면에 노출하되, reset/ladder/sizing raw input은 고급 파라미터와 구독 권한 뒤로 분리합니다.

phase4-day32-2026-05-09
DrawUpDown 50/10
reset 50% · ladder 10% · sell 5% BTC · buy 20% cash
Starter

Day30 기본 family입니다. 50% reset 이후 10% ladder로 상승 매도와 하락 매수를 분리합니다.

DrawUpDown Slow
reset 50% · ladder 15% · sell 5% BTC · buy 20% cash
Gold

15% ladder로 체결 빈도를 낮춘 보수형 preset입니다. 초보 화면에서 기본 후보와 함께 노출합니다.

DrawUpDown Deep
reset 60% · ladder 10% · sell 5% BTC · buy 20% cash
VIP

60% reset까지 기다리는 깊은 anchor preset입니다. VIP 화면에서 실험 후보로 분리합니다.

VIP 잠금

Day32 rules

초보 화면은 raw trigger/reset/sizing input보다 DrawUpDown 50/10 preset을 먼저 보여줍니다.
Slow/Deep은 preset으로만 노출하고, Deep과 custom parameter 저장은 VIP 권한에서만 엽니다.
Advanced mode는 사용자가 명시적으로 펼친 경우에만 보이며, live 주문 안전 gate와 별개로 설정 저장만 처리합니다.
Implementation handoff

다음 단계는 백테스트 큐 설계입니다.

Day27: BTC-KRW historical candle 데이터 준비 계약
Day28: reset_drawdown_pct 후보 분석 스크립트 완료
Day29: DrawUpDown backtest 구현 완료
Day30: trigger/reset parameter sweep 완료
Day31: 기존 엔진과 병렬 선택 가능한 전략 통합 완료
Day32: preset 중심 UI 노출 정책 완료
Day33: 백테스트 큐 설계
trigger_step_pct
10%

기준가 대비 10%, 20%, 30%처럼 ladder 간격을 만듭니다.

sell_btc_pct
5%

상승 ladder를 처음 통과할 때 현재 BTC 보유량의 5%를 매도합니다.

buy_cash_pct
20%

하락 ladder를 처음 통과할 때 사용 가능한 현금의 20%를 매수합니다.

reset_drawdown_pct
50%

cycle high 대비 50% 하락을 기준가 재설정 후보로 봅니다.