Files
Bithumb/deepcoin/paths.py
dsyoon b9ee241d14 Phase C dry-run·문서화·DB 증분 저장 및 운영 env 동기화
- 1분봉 다운로드 제외, MONITOR_PERSIST로 05/06 수집 시 coins.db INSERT
- Phase C paper_fires 로그·07 모의 리포트, hybrid 시뮬 산출물·reference 문서 갱신
- .env Phase C(LIVE=0), bootstrap dotenv override=True

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 23:32:47 +09:00

116 lines
3.8 KiB
Python

"""
DeepCoin 프로젝트 경로 (data + docs 통합).
docs/
reference/ 가이드·기법 명세 (Git 추적)
02_ground_truth/ … 05_ops/, charts/ 단계별 산출물 (로컬 재생성, Git 제외)
"""
from __future__ import annotations
import os
from pathlib import Path
# DeepCoin/ (이 파일: DeepCoin/deepcoin/paths.py)
PROJECT_ROOT = Path(__file__).resolve().parents[1]
# --- data ---
DATA_DIR = PROJECT_ROOT / "data"
DB_DIR = DATA_DIR
GROUND_TRUTH_DIR = DATA_DIR / "ground_truth"
OPS_STATE_DIR = DATA_DIR / "ops"
COOLDOWN_FILE = OPS_STATE_DIR / "coins_buy_time.json"
# --- docs (reference + 단계별 산출물) ---
DOCS_DIR = PROJECT_ROOT / "docs"
DOCS_REFERENCE_DIR = DOCS_DIR / "reference"
DOCS_CHARTS = DOCS_DIR / "charts"
DOCS_GROUND_TRUTH = DOCS_DIR / "02_ground_truth"
DOCS_ANALYSIS = DOCS_DIR / "03_analysis"
DOCS_MATCHING = DOCS_DIR / "04_matching"
DOCS_OPS = DOCS_DIR / "05_ops"
ANALYSIS_TRADES_CSV = DOCS_ANALYSIS / "general_analysis_trades.csv"
ANALYSIS_GT_MTF_PROFILE_JSON = DOCS_ANALYSIS / "gt_mtf_profile.json"
ANALYSIS_GT_MTF_PROFILE_HTML = DOCS_ANALYSIS / "gt_mtf_profile_report.html"
ANALYSIS_GT_CALIBRATION_JSON = DOCS_ANALYSIS / "gt_calibration_report.json"
ANALYSIS_REPORT_HTML = DOCS_ANALYSIS / "general_analysis_report.html"
ANALYSIS_CAPABILITY_HTML = DOCS_ANALYSIS / "general_analysis_capability.html"
ANALYSIS_LATEST_DIR = DOCS_ANALYSIS / "latest"
MATCHING_RULE_CANDIDATES = DOCS_MATCHING / "rule_candidates.json"
MATCHING_RULE_FIRES = DOCS_MATCHING / "rule_fires.csv"
MATCHING_FIRE_OUTCOMES = DOCS_MATCHING / "fire_outcomes.csv"
MATCHING_MATCHED_RULES = DOCS_MATCHING / "matched_rules.json"
MATCHING_BACKTEST_HTML = DOCS_MATCHING / "backtest_summary.html"
MATCHING_GT_OVERLAP = DOCS_MATCHING / "gt_overlap_report.json"
MATCHING_SIMULATION_JSON = DOCS_MATCHING / "simulation_report.json"
MATCHING_SIMULATION_HTML = DOCS_MATCHING / "simulation_report.html"
MATCHING_CAUSAL_GT_CALIBRATION_JSON = DOCS_MATCHING / "causal_gt_calibration.json"
MATCHING_HYBRID_DD_CALIBRATION_JSON = DOCS_MATCHING / "hybrid_dd_calibration.json"
MATCHING_GT_COMPARISON_JSON = DOCS_MATCHING / "gt_comparison_report.json"
MATCHING_GT_COMPARISON_HTML = DOCS_MATCHING / "gt_comparison_report.html"
LIVE_TRADES_LOG = OPS_STATE_DIR / "live_trades.jsonl"
PAPER_FIRES_LOG = OPS_STATE_DIR / "paper_fires.jsonl"
PAPER_WEEKLY_REPORT_JSON = DOCS_OPS / "phase_c_paper_report.json"
CHART_BB_HTML = DOCS_CHARTS / "wld_bb_chart.html"
CHART_TRUTH_HTML = DOCS_GROUND_TRUTH / "wld_ground_truth_chart.html"
# 하위 호환 (구 reports/ 이름)
REPORTS_DIR = DOCS_DIR
REPORTS_CHARTS = DOCS_CHARTS
REPORTS_GROUND_TRUTH = DOCS_GROUND_TRUTH
REPORTS_ANALYSIS = DOCS_ANALYSIS
REPORTS_MATCHING = DOCS_MATCHING
REPORTS_OPS = DOCS_OPS
def resolve_db_path() -> Path:
"""존재하는 coins.db 경로."""
candidates = [
DATA_DIR / "coins.db",
PROJECT_ROOT / "coins.db",
]
for p in candidates:
if p.is_file():
return p
return DATA_DIR / "coins.db"
def resolve_ground_truth_file() -> Path:
"""존재하는 ground_truth_trades.json 경로."""
name = os.getenv("GROUND_TRUTH_FILE", "ground_truth_trades.json")
p = Path(name)
if p.is_absolute():
return p
candidates = [
GROUND_TRUTH_DIR / "ground_truth_trades.json",
PROJECT_ROOT / "ground_truth_trades.json",
PROJECT_ROOT / name,
]
for c in candidates:
if c.is_file():
return c
return GROUND_TRUTH_DIR / "ground_truth_trades.json"
def ensure_dirs() -> None:
"""단계별 출력·가이드 디렉터리 생성."""
for d in (
DATA_DIR,
GROUND_TRUTH_DIR,
OPS_STATE_DIR,
DOCS_DIR,
DOCS_REFERENCE_DIR,
DOCS_CHARTS,
DOCS_GROUND_TRUTH,
DOCS_ANALYSIS,
DOCS_MATCHING,
DOCS_OPS,
ANALYSIS_LATEST_DIR,
):
d.mkdir(parents=True, exist_ok=True)