220 lines
10 KiB
YAML
220 lines
10 KiB
YAML
meta:
|
|
title: "settings 탭 계약서 — 사용자 입력 파라미터"
|
|
parent_file: "RetirementAssetPortfolio.yaml"
|
|
version: "2026-05-17-initial"
|
|
language: "ko-KR"
|
|
timezone: "Asia/Seoul"
|
|
role: "canonical"
|
|
has_code_implementation: true
|
|
code_path:
|
|
- "src/quant_engine/snapshot_admin_store_v1.py"
|
|
- "tools/validate_snapshot_admin_web_v1.py"
|
|
purpose: >
|
|
Google Sheets 'settings' 탭의 구조를 정의한다.
|
|
GAS 함수 readSettingsTab_()이 이 탭을 읽어 파라미터를 공급한다.
|
|
계좌·자산 정보처럼 자동 수집이 불가한 값들을 사용자가 수동 입력하는 창구.
|
|
|
|
sheet:
|
|
name: "settings"
|
|
header_row: 2 # row1=updated 메타, row2=헤더
|
|
data_start_row: 3
|
|
columns:
|
|
- name: "key"
|
|
type: "string"
|
|
note: "파라미터 식별자. GAS에서 settings['key'] 형태로 참조."
|
|
- name: "value"
|
|
type: "any"
|
|
note: "파라미터 값. 숫자는 숫자로, 문자는 문자로 입력."
|
|
- name: "note"
|
|
type: "string"
|
|
note: "설명 (선택). GAS가 읽지 않음."
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# 필수 파라미터 (설정하지 않으면 해당 기능 비활성화)
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
required_keys:
|
|
total_asset_krw:
|
|
type: "number"
|
|
unit: "KRW"
|
|
example: 150000000
|
|
note: >
|
|
전체 투자 가능 자산 합계 (원화).
|
|
사용처: Pos_Size_Qty 계산, TOTAL_HEAT_V1 퍼센트 변환, FC_BUDGET 월별 손실 비율.
|
|
매월 말 또는 계좌 잔고 크게 변동 시 수동 갱신.
|
|
affects:
|
|
- "data_feed Pos_Size_Qty"
|
|
- "macro TOTAL_HEAT 행 heat_pct"
|
|
- "macro FC_BUDGET 행 used_pct"
|
|
update_frequency: "월 1회 또는 자산 규모 ±5% 이상 변동 시"
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# 선택 파라미터
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
optional_keys:
|
|
risk_budget_override:
|
|
type: "number"
|
|
unit: "decimal (0~0.02)"
|
|
default: 0.007
|
|
note: >
|
|
POSITION_SIZE_V1의 기본 risk_budget 오버라이드.
|
|
performance_brake 발동 시 0.0035로 수동 입력.
|
|
비워두면 GAS가 0.007 기본값 사용.
|
|
affects:
|
|
- "data_feed Pos_Size_Qty (atr_qty 계산)"
|
|
|
|
fc_budget_pct_override:
|
|
type: "number"
|
|
unit: "percent"
|
|
default: 2.5
|
|
note: >
|
|
explore_loss_budget 월별 한도 오버라이드(%).
|
|
비워두면 GAS가 2.5% 기본값 사용.
|
|
affects:
|
|
- "macro FC_BUDGET 행"
|
|
|
|
market_exchange:
|
|
type: "string"
|
|
default: "KRX"
|
|
note: "현재 미사용. 향후 해외 계좌 대응 시 사용."
|
|
|
|
settlement_cash_d2_krw:
|
|
type: "number"
|
|
unit: "KRW"
|
|
note: >
|
|
계좌 캡처에서 확인한 D+2 추정현금성자산.
|
|
일반계좌의 D+2 정산현금과 즉시현금(immediate_cash)을 합산하여 유동성 방어선(cash_floor)으로 인정한다.
|
|
ISA/연금저축의 현금성 자산은 일반계좌 매수재원 합산에서 제외한다.
|
|
account_snapshot.settlement_cash_d2가 있으면 그 값을 우선 사용하고,
|
|
settings 값은 수동 백업 입력으로 사용한다.
|
|
affects:
|
|
- "data_feed Rebalance_Need_KRW"
|
|
- "data_feed Override_Sell_Qty"
|
|
|
|
weekly_target_cash_pct:
|
|
type: "number"
|
|
unit: "percent"
|
|
example: 14
|
|
note: >
|
|
주간 리밸런싱용 D+2 현금 목표 비중.
|
|
입력된 경우에만 GAS가 Rebalance_Need_KRW와 Override_Sell_Qty를 계산한다.
|
|
즉시현금 cash_floor와 혼동하지 않도록 보고서에는 D+2 기준임을 명시한다.
|
|
affects:
|
|
- "data_feed Rebalance_Target_Cash_Pct"
|
|
- "data_feed Rebalance_Need_KRW"
|
|
- "data_feed Override_Sell_Qty"
|
|
|
|
orbit_start_asset_krw:
|
|
type: "number"
|
|
unit: "KRW"
|
|
example: 355000000
|
|
note: >
|
|
orbit_gap 계산 기준 시작 자산 (원).
|
|
spec/01_objective_profile.yaml 참조: 각 연도 1월 기준 총자산.
|
|
orbit_gap = 목표누적수익률(기하평균) - 실제누적수익률 계산에 사용.
|
|
affects:
|
|
- "macro ORBIT_GAP 행 orbit_gap_pct"
|
|
- "macro ORBIT_STATE 행 orbit_state"
|
|
update_frequency: "연 1회 (1월 초) 또는 재설정 시"
|
|
|
|
orbit_target_asset_krw:
|
|
type: "number"
|
|
unit: "KRW"
|
|
example: 500000000
|
|
note: >
|
|
orbit_gap 계산 목표 자산 (원).
|
|
spec/01_objective_profile.yaml: 목표 5억.
|
|
affects:
|
|
- "macro ORBIT_GAP 행 orbit_gap_pct"
|
|
|
|
orbit_start_yyyymm:
|
|
type: "string"
|
|
format: "YYYY-MM"
|
|
example: "2026-01"
|
|
note: >
|
|
orbit 추적 시작 연월. orbit_end_yyyymm까지의 총 기간으로 목표 분산.
|
|
elapsed_months = 현재연월 - orbit_start_yyyymm (완성 월 수).
|
|
affects:
|
|
- "macro ORBIT_GAP/ORBIT_STATE 행 elapsed_months 계산"
|
|
|
|
orbit_end_yyyymm:
|
|
type: "string"
|
|
format: "YYYY-MM"
|
|
example: "2028-12"
|
|
note: >
|
|
orbit 추적 종료 연월 (목표 달성 기한).
|
|
total_months = orbit_end_yyyymm - orbit_start_yyyymm.
|
|
affects:
|
|
- "macro ORBIT_GAP/ORBIT_STATE 행 total_months 계산"
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# 탭 초기 설정 예시 (Google Sheets에 수동 입력)
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
initial_setup_example:
|
|
- [key, value, note]
|
|
- [total_asset_krw, 150000000, "총 투자 가능 자산 (원). 분기마다 갱신."]
|
|
- [risk_budget_override, "", "비워두면 기본 0.007 사용. performance_brake 시 0.0035 입력."]
|
|
- [fc_budget_pct_override, "", "비워두면 기본 2.5% 사용."]
|
|
- [orbit_start_asset_krw, 355000000, "orbit 시작 자산 (1월 기준). 연 1회 갱신."]
|
|
- [orbit_target_asset_krw, 500000000, "목표 자산. 변경 시 갱신."]
|
|
- [orbit_start_yyyymm, "2026-01", "orbit 추적 시작 연월 (YYYY-MM)."]
|
|
- [orbit_end_yyyymm, "2028-12", "orbit 추적 종료 연월 (목표 달성 기한)."]
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# GAS 자동 기록 키 (사용자가 직접 입력하지 않음 — GAS 월간 배치가 자동 갱신)
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
gas_written_cache_keys:
|
|
trade_quality_json:
|
|
written_by: "calcTradeQualityScorer_() ← F1 월간 배치"
|
|
formula_id: "TRADE_QUALITY_SCORER_V1"
|
|
format: "JSON 문자열"
|
|
schema: >
|
|
{ status, scored_count, total_records,
|
|
trade_quality: [{ ticker, action, score, grade, feedback_tag }],
|
|
last_computed, formula_id }
|
|
read_by:
|
|
- "gas_harness_rows.gs buildHarnessRows_() → trade_quality_json 일간 출력"
|
|
- "render_operational_report.py render_trade_quality_report()"
|
|
update_frequency: "월 1회 (calcTradeQualityScorer_ 트리거 실행 시)"
|
|
note: "사용자가 수동 편집 금지. T+5/T+20 채점 결과. 미실행 시 MONTHLY_BATCH_PENDING."
|
|
|
|
pattern_blacklist_json:
|
|
written_by: "calcPatternBlacklistAuto_() ← F2 (F1 파이프라인 직후 자동 실행)"
|
|
formula_id: "PATTERN_BLACKLIST_AUTO_V1"
|
|
format: "JSON 문자열"
|
|
schema: >
|
|
{ status, triggered_count, total_tickers,
|
|
patterns: [{ ticker, pattern_blacklist_status, accumulated_poor_count,
|
|
total_records, release_condition_met,
|
|
saqg_override, alpha_score_cap, formula_id }],
|
|
pattern_count, computed_at, formula_id }
|
|
read_by:
|
|
- "gas_data_feed.gs applyAlegGate4And5_() → GATE_5 블랙리스트 차단"
|
|
- "gas_harness_rows.gs buildHarnessRows_() → pattern_blacklist_json 일간 출력"
|
|
- "render_operational_report.py render_pattern_blacklist_report()"
|
|
update_frequency: "월 1회 (calcTradeQualityScorer_ 배치 완료 후 자동 연결)"
|
|
note: "TRIGGERED 종목은 ALEG GATE_5에서 BUY 자동 차단됨. 사용자 수동 편집 금지."
|
|
|
|
alpha_feedback_json:
|
|
written_by: "calcAlphaFeedbackLoop_() ← AFL 월간 배치"
|
|
formula_id: "ALPHA_FEEDBACK_LOOP_V1"
|
|
format: "JSON 문자열"
|
|
schema: >
|
|
{ formula_id, as_of, analysis_period, status, cases_analyzed,
|
|
grade_count, eligible_t20_fail_rate, eligible_t60_fail_rate,
|
|
recommended_filter_adjustments: [{ filter_id, current, recommended, action, rationale }],
|
|
grade_summary: [{ grade, t20_total, t20_pass, t20_pass_rate, t20_fail_rate,
|
|
t60_total, t60_pass, t60_pass_rate, t60_fail_rate, status }] }
|
|
read_by:
|
|
- "gas_harness_rows.gs buildHarnessRows_() → alpha_feedback_json 일간 출력"
|
|
- "render_operational_report.py render_alpha_feedback_loop()"
|
|
update_frequency: "월 1회 (calcAlphaFeedbackLoop_ 트리거 실행 시)"
|
|
note: >
|
|
cases_analyzed < 10 이면 DATA_INSUFFICIENT — 권고 없음.
|
|
임계값 자동 변경 금지(Direction AFL). 사용자 수동 편집 금지.
|
|
|
|
operational_rules:
|
|
- "total_asset_krw는 입금·출금 또는 총자산 ±5% 이상 변동 시 갱신한다."
|
|
- "performance_brake 발동 시 risk_budget_override=0.0035 입력 → 자동 반영."
|
|
- "performance_brake 해제(reset_condition 충족) 시 risk_budget_override를 공백으로 되돌린다."
|
|
- "gas_written_cache_keys 섹션의 키는 GAS 배치가 자동 갱신. 사용자 직접 편집 금지."
|