Skip to content

Gov Price Sync (Bulk) #104

Gov Price Sync (Bulk)

Gov Price Sync (Bulk) #104

name: Gov Price Sync (Bulk)
# engines.gather — 공공데이터포털(data.go.kr) 일별 전종목 주가 → HF dataset publish.
# 출력: gov/prices/date/{YYYY}.parquet (전종목 횡단) + gov/prices/company/{code}.parquet (종목별).
# 엔진(quant/scan/analysis)은 이 결과를 hfBulk.loadFiltered(category=govPrices)로 소비.
on:
schedule:
# gov 는 각 거래일치를 '다음 영업일' 오후(~13:33 KST) 발행 — 신규 데이터가 나오는 날은 평일뿐:
# 월=금요일치, 화=월요일치, 수=화, 목=수, 금=목요일치. 토·일은 발행 없음(2026-06-13~14 실측:
# 금 6/12·토 6/13 모두 gov totalCount=0, 독립 소스엔 6/12 거래 존재 = 휴장 아닌 미발행).
# 따라서 fetch 슬롯 = gov 발행일과 동일한 월~금(1-5) + --lookback 4. 각 평일 run 이 그날 gov 가
# 갓 발행한 직전 거래일치를 수집(금요일치=월요일 run 최초). 토요일 fetch 는 신규 발행분이 없어
# 무의미 → 토요일은 derive 슬롯만 유지. 일요일도 제외.
# ⚠ 옛 '1-5=금요일 영구누락' 경고는 lookback=1 시절 artifact — lookback 4 에선 월요일 run 이
# 금요일치를 lookback 으로 수집하므로 1-5 가 완전. 화~토(2-6)은 월요일 사각지대 + 무의미한
# 토요일 fetch 라 금요일치를 화요일까지 1일 지연시켰다(2026-06-14 정정).
# 정각(:00) cron 은 GH 혼잡 미발화 잦아 :40/:10 회피. idempotent — 기수집분 재요청 skip ~44s.
- cron: '40 4 * * 1-5' # KST 13:40 월~금 — gov 갓 발행분(직전 거래일치) 1차 수집
- cron: '40 5 * * 1-5' # KST 14:40 월~금 — 발행 지연·1차 미발화 catch-up
- cron: '10 11 * * 1-5' # KST 20:10 월~금 — backstop (잔여 + lookback catch-up)
- cron: '10 13 * * 6' # KST 22:10 토 — 회사별 전종목 파생 리프레시 (date 기수집분 재배치, API 호출 0)
workflow_dispatch:
inputs:
basDt:
description: '기준일자 YYYYMMDD (기본 어제)'
required: false
mode:
description: 'daily=일별 upsert / derive=회사별 전종목 파생'
default: 'daily'
type: choice
options: ['daily', 'derive']
permissions:
contents: read
# engines.data — 모든 HF push 워크플로우는 단일 그룹으로 직렬화 (sliding-window 429 회피).
concurrency:
group: hf-dataset-push
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync
- name: Restore gov price parquet cache
uses: actions/cache/restore@v5
with:
path: data/gov/prices
key: dartlab-gov-prices-${{ github.run_id }}
restore-keys: dartlab-gov-prices-
- name: Build gov price parquet + push to HF
env:
DATA_GO_KR_KEY: ${{ secrets.DATA_GO_KR_KEY }}
HF_TOKEN: ${{ secrets.HF_TOKEN }}
run: |
if [ "${{ github.event.schedule }}" = "10 13 * * 6" ] || [ "${{ github.event.inputs.mode }}" = "derive" ]; then
uv run python -X utf8 .github/scripts/sync/buildGovData.py --derive-companies
else
uv run python -X utf8 .github/scripts/sync/buildGovData.py --daily --lookback 4 ${{ github.event.inputs.basDt && format('--basDt {0}', github.event.inputs.basDt) || '' }}
fi
- name: Build prices-snapshot.json + push to HF (daily only)
# date 샤드 upsert 직후 같은 러너 로컬 캐시 재사용 — landing 시세 스냅샷 신선도 동기화.
# derive 분기는 가격 신규 수집이 없으므로 제외.
if: ${{ github.event.schedule != '10 13 * * 6' && github.event.inputs.mode != 'derive' }}
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
run: uv run python -X utf8 .github/scripts/prebuild/buildPricesSnapshot.py
- name: Save gov price parquet cache
uses: actions/cache/save@v5
if: always()
with:
path: data/gov/prices
key: dartlab-gov-prices-${{ github.run_id }}
- name: Summary
if: always()
run: |
echo "## Gov Price Sync (Bulk)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 항목 | 값 |" >> $GITHUB_STEP_SUMMARY
echo "|------|------|" >> $GITHUB_STEP_SUMMARY
echo "| Trigger | ${{ github.event_name }} ${{ github.event.schedule }} |" >> $GITHUB_STEP_SUMMARY
echo "| HF dataset | \`eddmpython/dartlab-data/gov/prices\` |" >> $GITHUB_STEP_SUMMARY
echo "| 출력 | \`gov/prices/date/{YYYY}.parquet\` + \`gov/prices/company/{code}.parquet\` |" >> $GITHUB_STEP_SUMMARY