// tradingData.jsx — 트레이딩 데스크 현업 요구 반영 데이터. // 수급 상위 · 시장경보 · 지분공시 · 딜러 한도(SA/투자/손절매/비율) · KOSPI 델타. // ---- 베타·변동성 산출 기간 프리셋 ---- const BETA_PERIODS = ['1M', '3M', '6M', '1Y']; const PERIOD_ADJ = { '1M': { v: 1.18, b: 1.06 }, '3M': { v: 1.00, b: 1.00 }, '6M': { v: 0.91, b: 0.97 }, '1Y': { v: 0.85, b: 0.94 } }; // ---- 종목 메타 — 베타(3M 기준)·연변동성·거래소 시장경보 ---- const EQ_META = { '005930': { beta: 1.12, vol: 21, alert: null }, '373220': { beta: 1.35, vol: 36, alert: '투자주의' }, '207940': { beta: 0.88, vol: 27, alert: null }, '000270': { beta: 1.04, vol: 23, alert: null }, '035420': { beta: 1.18, vol: 30, alert: null }, '035720': { beta: 1.22, vol: 34, alert: '투자경고' }, '005490': { beta: 1.24, vol: 32, alert: null }, '105560': { beta: 0.94, vol: 19, alert: null }, '055550': { beta: 0.92, vol: 18, alert: null }, '006400': { beta: 1.28, vol: 33, alert: '투자주의' }, '068270': { beta: 0.96, vol: 29, alert: null }, '012330': { beta: 1.02, vol: 22, alert: null } }; function eqMeta(t) { return EQ_META[t] || { beta: 1.0, vol: 25, alert: null }; } function eqBeta(t, period = '3M') { return +(eqMeta(t).beta * PERIOD_ADJ[period].b).toFixed(2); } function eqVol(t, period = '3M') { return +(eqMeta(t).vol * PERIOD_ADJ[period].v).toFixed(1); } // 시장경보 → pill kind (매수 시 위탁증거금 예탁 필요) const MKT_ALERT_KIND = { '투자주의': 'warn', '투자경고': 'alert', '투자위험': 'alert' }; // ---- 수급 동향 — 주체별 순매수 상위 Top 5 (5영업일 누적, 억원) ---- const FLOW_TOP = { '외국인': [ { ticker: '000660', name: 'SK하이닉스', sector: '반도체', amt: 8420 }, { ticker: '005930', name: '삼성전자', sector: '반도체', amt: 6210 }, { ticker: '005380', name: '현대차', sector: '자동차', amt: 3840 }, { ticker: '105560', name: 'KB금융', sector: '금융', amt: 2130 }, { ticker: '267260', name: 'HD현대일렉트릭', sector: '전력기기', amt: 1660 }], '연기금': [ { ticker: '005930', name: '삼성전자', sector: '반도체', amt: 2840 }, { ticker: '068270', name: '셀트리온', sector: '바이오', amt: 1120 }, { ticker: '000270', name: '기아', sector: '자동차', amt: 980 }, { ticker: '005490', name: 'POSCO홀딩스', sector: '소재', amt: 860 }, { ticker: '035420', name: 'NAVER', sector: '인터넷', amt: 740 }], '기관': [ { ticker: '000660', name: 'SK하이닉스', sector: '반도체', amt: 4210 }, { ticker: '010120', name: 'LS ELECTRIC', sector: '전력기기', amt: 1830 }, { ticker: '005380', name: '현대차', sector: '자동차', amt: 1540 }, { ticker: '055550', name: '신한지주', sector: '금융', amt: 1210 }, { ticker: '207940', name: '삼성바이오로직스', sector: '바이오', amt: 990 }] }; // ---- 지분공시 모니터링 — IBK 그룹 합산 지분율 (지분투자 + 트레이딩 보유) ---- // 5% 이상 보유 종목은 1%p 변동 시 '주식등의 대량보유상황 보고'(5%룰) 대상. const STAKE_WATCH = [ { ticker: '010120', name: 'LS ELECTRIC', holder: '지분투자 + 자기매매', stake: 7.85, last: 7.12, rule: '5%룰 · 1%p 변동 보고', room: 0.27, status: '공시 임박' }, { ticker: '068270', name: '셀트리온', holder: '지분투자 + 트레이딩', stake: 6.31, last: 5.84, rule: '5%룰 · 1%p 변동 보고', room: 0.53, status: '주의' }, { ticker: '035720', name: '카카오', holder: '트레이딩 + 신탁', stake: 5.08, last: 5.02, rule: '5%룰 · 1%p 변동 보고', room: 0.94, status: '여유' }, { ticker: '012330', name: '현대모비스', holder: '지분투자', stake: 5.44, last: 5.31, rule: '5%룰 · 1%p 변동 보고', room: 0.87, status: '여유' }, { ticker: '006400', name: '삼성SDI', holder: '트레이딩', stake: 4.62, last: null, rule: '5% 신규 보고 대상 접근', room: 0.38, status: '주의' }]; const STAKE_KIND = { '공시 임박': 'alert', '주의': 'warn', '여유': 'ok' }; // ---- 손절매한도 — 종목 단위 손절 구간 (매입가 대비 등락률, -5/-10/-15/-20%) ---- // 손절매는 종목 단위 의사결정: 각 보유 종목이 어느 구간에 도달했는지를 표시한다. const STOP_LADDER = [-5, -10, -15, -20]; const STOP_ZONES = [ { v: 0, l: '정상', kind: 'ok' }, { v: 1, l: '-5%', kind: 'warn' }, { v: 2, l: '-10%', kind: 'warn' }, { v: 3, l: '-15%', kind: 'alert' }, { v: 4, l: '-20%', kind: 'alert' }]; function stopZoneOf(ret) { return ret <= -20 ? 4 : ret <= -15 ? 3 : ret <= -10 ? 2 : ret <= -5 ? 1 : 0; } // 포트폴리오 내 구간별 도달 종목 수 [정상, -5, -10, -15, -20] function stopCounts(pf) { const c = [0, 0, 0, 0, 0]; pf.holds.forEach((h) => { const u = UMAP[h.id]; if (u) c[stopZoneOf(u.ret)]++; }); return c; } // 종목별 손절 구간 셀 — 4구간 미니 래더 + 현재 구간 라벨 function StopZoneCell({ ret }) { const z = stopZoneOf(ret); const zone = STOP_ZONES[z]; return ( 0 ? '+' : ''}${ret.toFixed(1)}%`} style={{ display: 'inline-flex', alignItems: 'center', gap: 8, justifyContent: 'flex-end' }}> {[1, 2, 3, 4].map((i) => = 3 ? T.alert : T.warn : T.c150 }} />)} {zone.l} ); } // ---- 딜러 한도 — SA(표준방법) 한도 · 투자한도 · 비율 한도 ---- // 한도 설정 권한: 리스크총괄부 / 조회·활용: 트레이딩 부서. // sa: 표준방법(Standardized Approach)으로 산출한 시장리스크 한도 [현재값, 배정 한도] (억). // invest: 배정 투자가능금액 대비 현재 집행액 [집행, 배정] (억). // ratio: 단일 종목 집중도 한도 — 시가총액 비중 cap(%) vs 현재 최대 max(%). const DEALER_LIMITS = { '20180417': { sa: [128, 160], invest: [3240, 3600], ratio: { cap: 3.0, max: 1.86, n: 'SK하이닉스' } }, // 62% 정상 '20191103': { sa: [96, 120], invest: [2620, 3000], ratio: { cap: 2.5, max: 2.13, n: '셀트리온' } }, // 85% 주의 '20200622': { sa: [118, 130], invest: [2980, 3200], ratio: { cap: 2.0, max: 2.18, n: 'LS ELECTRIC' } }, // 109% 초과 '20190718': { sa: [102, 140], invest: [3270, 3800], ratio: null }, // 비율한도 미적용 '20170815': { sa: [92, 110], invest: [6130, 7000], ratio: null }, '20210309': { sa: [88, 120], invest: [7480, 8000], ratio: null }, '20160527': { sa: [121, 150], invest: [8920, 9500], ratio: null }, '20151001': { sa: [84, 102], invest: [5560, 6000], ratio: null }, '20220214': { sa: [47, 58], invest: [2980, 3100], ratio: null } }; function dealerLimit(emp) { return DEALER_LIMITS[emp] || null; } function limUtil(pair) { return pair[0] / pair[1] * 100; } function utilColor(pct) { return pct >= 100 ? T.alert : pct >= 80 ? T.warn : T.c900; } // ---- KOSPI 기준 델타 — 보유주식 베타 가중 노출 (억원) ---- // KOSPI 1% 변동 시 평가손익 ≈ 델타 × 1%. function kospiDelta(pf, period = '3M') { return pf.holds.reduce((s, h) => { const u = UMAP[h.id]; if (!u || u.type !== '주식') return s; return s + pf.value * h.w / 100 * (u.beta || 1) * PERIOD_ADJ[period].b; }, 0); } Object.assign(window, { BETA_PERIODS, PERIOD_ADJ, EQ_META, eqMeta, eqBeta, eqVol, MKT_ALERT_KIND, FLOW_TOP, STAKE_WATCH, STAKE_KIND, STOP_LADDER, STOP_ZONES, stopZoneOf, stopCounts, StopZoneCell, DEALER_LIMITS, dealerLimit, limUtil, utilColor, kospiDelta });