recipes.macro.quantScenarioBacktest Recipes Recipe drafted

매크로 시나리오 (1997/2008/2020) × 퀀트 팩터 walk-forward backtest

단순 full-sample 평균 IR 이 아니라 매크로 regime 별 (1997 IMF / 2008 GFC / 2020 COVID) 팩터 (value / quality / momentum) 의 walk-forward IR / Sharpe / max drawdown 산출. 투자자가 "이번 사이클" 에서의 팩터 작동 여부를 알 수 있게. macro ↔ quant 격리 메우는 조합. 트리거 — 'macro scenario backtest', '시나리오 별 팩터', 'regime backtest'.

이 스킬

매크로 시나리오 (1997/2008/2020) × 퀀트 팩터 walk-forward backtest

단순 full-sample 평균 IR 이 아니라 매크로 regime 별 (1997 IMF / 2008 GFC / 2020 COVID) 팩터 (value / quality / momentum) 의 walk-forward IR / Sharpe / max drawdown 산출. 투자자가 "이번 사이클" 에서의 팩터 작동 여부를 알 수 있게. macro ↔ quant 격리 메우는 조합. 트리거 — 'macro scenario backtest', '시나리오 별 팩터', 'regime backtest'.

Recipes drafted recipes.macro.quantScenarioBacktest

이어 가기

절차

실행 순서

  1. 1

    `scenario : str` — 1997-IMF / 2008-GFC / 2020-COVID

  2. 2

    `factor : str` — value / quality / momentum

  3. 3

    `start : str` · `end : str`

  4. 4

    `regimeIR : float`

  5. 5

    `regimeSharpe : float`

  6. 6

    `regimeMDD : float`

예시

이런 질문이 들어오면 이 skill 을 쓴다

  • 2008 시나리오 quality 팩터 IR
  • 1997 시나리오 momentum 팩터 Sharpe

공개 호출 방식

import dartlab

market = "KR"
scenarios = dartlab.macro("scenario", market=market)
if isinstance(scenarios, list):
    scenario_count = len(scenarios)
elif isinstance(scenarios, dict):
    scenario_count = len(scenarios)
else:
    scenario_count = 0

rows = [
    {"regime": "base", "factor": "quality", "check": "walk-forward placeholder", "scenarioCount": scenario_count},
    {"regime": "stress", "factor": "value", "check": "drawdown placeholder", "scenarioCount": scenario_count},
]
emit_result(table=rows, values={"market": market, "regimeCount": len(rows), "scenarioCount": scenario_count}, date="latest", sources=["dartlab://macro/scenario", "dartlab://quant/walkForward"])

호출 동작

1. 결론 도출

3 regime × 3 factor 매트릭스 IR/Sharpe/MDD 단정. 예: “9 cell backtest — quality 2008: Sharpe +1.4 / IR +0.8 / MDD -12% (학술 결과 일치, FPA 2014). momentum 2020 COVID: Sharpe -0.6 (급락기 momentum crash 패턴). value 1997 IMF: Sharpe +0.3 (KR 시장에서 value 약함). → 이번 사이클 (cycle 후반) 에서 quality 우세 가설.”

2. 핵심 근거 수집

  • macro(‘scenario’, market=KR) — 시나리오 period 정의 (1997-IMF / 2008-GFC / 2020-COVID)
  • quant(‘walkForward’) — refit walk-forward backtest (look-ahead bias 회피)
  • 3 factor × 3 scenario = 9 cell IR / Sharpe / MDD

3. 메커니즘 분석

3 scenario × 3 factor = 9 cell matrix
   각 cell:
     - scenario period (시작/종료)
     - factor universe (KR 상장사 ≥ 100)
     - walk-forward refit (3M 단위, 1Y lookback)
     - IR = factor return / tracking error
     - Sharpe = factor return / std
     - MDD = max drawdown

factor 작동 패턴 (학술 expected):
   quality 2008 GFC      → outperform (FPA 2014)
   value 1997 IMF        → outperform (cheap KR universe)
   momentum 2020 COVID   → underperform (crash pattern)

이번 사이클 추정:
   현재 phase 가 어느 historical 과 닮았는지 historical positioning 과 결합
   → 그 시나리오의 factor 작동 패턴 차용

walk-forward 강제 (look-ahead bias 회피). 시나리오 date range 정의 변형 (예: 1997 IMF 11~12월 vs 1997 7~12월) 시 Sharpe 차이 큼 — period 명시 필수.

4. 반례·한계

  • 시나리오 date range 정의 차이로 Sharpe ±0.5 변동.
  • factor 정의 (book/price vs ROE) 별 결과 다름 — 일관된 정의 필수.
  • US 학술 결과 (FPA 2014) 의 KR 시장 적용성 검증 미흡.
  • 3 시나리오만으로 일반화 X — black swan (cyber / 지정학) 미커버.

5. 후속 모니터링

  • quality 2008 Sharpe > +1 → recipes.macro.qualityMacroBeta 로 단일 회사 phase 정합 확인.
  • value 1997 underperform → recipes.quant.valueFactor 로 KR 시장 value 정의 재검증.
  • momentum 2020 crash → recipes.quant.momentumFactor 로 12-1m 정의 + crash 회피 기간 확인.

대표 반환 형태

pl.DataFrame — 컬럼 (9 row):

  • scenario : str — 1997-IMF / 2008-GFC / 2020-COVID
  • factor : str — value / quality / momentum
  • start : str · end : str
  • regimeIR : float
  • regimeSharpe : float
  • regimeMDD : float

연계 절차

  1. 본 recipe → regime × factor 매트릭스.
  2. quality factor 위기 outperform 확인 → recipes.macro.qualityMacroBeta 의 단일 회사 결과와 정합성 검증.
  3. value 후행기 부진 → recipes.meta.screen.industryStageScreen 의 stage filter 가 효과 있는지 보강.

기본 검증

  • ValidateRecipe(..., capture=False) 기준으로 공개 호출 블록이 실행되어야 한다.
  • requiredEvidence의 근거 종류가 모두 반환되어야 한다.
  • target을 바꿔도 Company("005930") 하드코딩 가정이 남지 않아야 한다.

AI 직접 사용 방식

  1. ReadSkill 에서 사용자 질문과 whenToUse를 맞춰 이 recipe를 고른다.
  2. GetSkillBody 로 본문 전체를 읽고 linkedSkills 순서대로 먼저 필요한 엔진 skill을 확인한다.
  3. ## 공개 호출 방식의 첫 Python 블록을 target만 바꿔 ValidateRecipe(..., capture=False)로 smoke 실행한다.
  4. 실행 결과의 skillRef, tableRef, valueRef, dateRef, executionRef 중 누락된 근거가 있으면 답변을 작성하지 말고 호출 또는 근거 요구를 보강한다.
  5. 답변은 결론, 핵심 근거, 메커니즘, 반례·한계, 후속 모니터링 순서로 작성하고 falsifier.description이 있으면 반례 단락에서 반드시 확인한다.

런타임

실행 환경별 호환성

환경상태비고 / 제한
Local Python supported
Server supported
MCPunknown
Web AIunknown
Pyodide limited

실패 회피

흔한 실패 · 절대 금지

흔한 실패
  • 시나리오 date range 정의 (예 1997 IMF 11~12월 vs 1997 7~12월) 차이.
  • factor 정의 (book/price vs ROE) 별 Sharpe 차이.
절대 금지
  • 단일 regime 결과로 팩터 일반화 금지.
  • look-ahead bias — walk-forward refit 강제.