|
|
@@ -0,0 +1,356 @@
|
|
|
+// 시장 데이터 도메인 타입 — Backend Application/Features/Api/Stocks/{GetIndices,GetEtp,...}/Response.cs 대응
|
|
|
+// 직렬화 주의: 필드명은 camelCase. enum 은 Web.Api Program.cs 에 JsonStringEnumConverter 미등록 →
|
|
|
+// Response DTO 에서 enum 은 숫자(정수)로 직렬화됨 (Paper 의 문자열 enum 과 다름).
|
|
|
+// 쿼리스트링으로 보낼 때는 ASP.NET model binding 이 enum 멤버명 문자열도 허용하므로 이름으로 전송한다.
|
|
|
+
|
|
|
+// ── enum (응답 = 숫자, 요청 = 멤버명 문자열) ──
|
|
|
+
|
|
|
+// 지수 계열 (MarketIndexSeries)
|
|
|
+export const MarketIndexSeries = {
|
|
|
+ KOSPI: 1,
|
|
|
+ KOSDAQ: 2,
|
|
|
+ KRX: 3,
|
|
|
+ Bond: 4,
|
|
|
+ Derivative: 5
|
|
|
+} as const;
|
|
|
+export type MarketIndexSeriesValue = (typeof MarketIndexSeries)[keyof typeof MarketIndexSeries];
|
|
|
+
|
|
|
+export const MARKET_INDEX_SERIES_LABEL: Record<MarketIndexSeriesValue, string> = {
|
|
|
+ [MarketIndexSeries.KOSPI]: 'KOSPI',
|
|
|
+ [MarketIndexSeries.KOSDAQ]: 'KOSDAQ',
|
|
|
+ [MarketIndexSeries.KRX]: 'KRX',
|
|
|
+ [MarketIndexSeries.Bond]: '채권',
|
|
|
+ [MarketIndexSeries.Derivative]: '파생'
|
|
|
+};
|
|
|
+
|
|
|
+// ETP 종류 (EtpType) — 요청 파라미터명 'type'
|
|
|
+export const EtpType = {
|
|
|
+ ETF: 1,
|
|
|
+ ETN: 2,
|
|
|
+ ELW: 3
|
|
|
+} as const;
|
|
|
+export type EtpTypeValue = (typeof EtpType)[keyof typeof EtpType];
|
|
|
+export type EtpTypeName = keyof typeof EtpType;
|
|
|
+
|
|
|
+export const ETP_TYPE_LABEL: Record<EtpTypeValue, string> = {
|
|
|
+ [EtpType.ETF]: 'ETF',
|
|
|
+ [EtpType.ETN]: 'ETN',
|
|
|
+ [EtpType.ELW]: 'ELW'
|
|
|
+};
|
|
|
+
|
|
|
+// 채권 시장 (BondMarket) — 요청 파라미터명 'market'
|
|
|
+export const BondMarket = {
|
|
|
+ KtsGovt: 1,
|
|
|
+ General: 2,
|
|
|
+ Small: 3
|
|
|
+} as const;
|
|
|
+export type BondMarketValue = (typeof BondMarket)[keyof typeof BondMarket];
|
|
|
+export type BondMarketName = keyof typeof BondMarket;
|
|
|
+
|
|
|
+export const BOND_MARKET_LABEL: Record<BondMarketValue, string> = {
|
|
|
+ [BondMarket.KtsGovt]: '국채전문',
|
|
|
+ [BondMarket.General]: '일반채권',
|
|
|
+ [BondMarket.Small]: '소액채권'
|
|
|
+};
|
|
|
+
|
|
|
+// 선물 종류 (FuturesKind) — 요청 파라미터명 'kind'
|
|
|
+export const FuturesKind = {
|
|
|
+ General: 1,
|
|
|
+ StockKospi: 2,
|
|
|
+ StockKosdaq: 3
|
|
|
+} as const;
|
|
|
+export type FuturesKindValue = (typeof FuturesKind)[keyof typeof FuturesKind];
|
|
|
+export type FuturesKindName = keyof typeof FuturesKind;
|
|
|
+
|
|
|
+export const FUTURES_KIND_LABEL: Record<FuturesKindValue, string> = {
|
|
|
+ [FuturesKind.General]: '일반선물',
|
|
|
+ [FuturesKind.StockKospi]: '주식선물(코스피)',
|
|
|
+ [FuturesKind.StockKosdaq]: '주식선물(코스닥)'
|
|
|
+};
|
|
|
+
|
|
|
+// 옵션 종류 (OptionsKind) — 요청 파라미터명 'kind'
|
|
|
+export const OptionsKind = {
|
|
|
+ General: 1,
|
|
|
+ StockKospi: 2,
|
|
|
+ StockKosdaq: 3
|
|
|
+} as const;
|
|
|
+export type OptionsKindValue = (typeof OptionsKind)[keyof typeof OptionsKind];
|
|
|
+export type OptionsKindName = keyof typeof OptionsKind;
|
|
|
+
|
|
|
+export const OPTIONS_KIND_LABEL: Record<OptionsKindValue, string> = {
|
|
|
+ [OptionsKind.General]: '일반옵션',
|
|
|
+ [OptionsKind.StockKospi]: '주식옵션(코스피)',
|
|
|
+ [OptionsKind.StockKosdaq]: '주식옵션(코스닥)'
|
|
|
+};
|
|
|
+
|
|
|
+// 옵션 권리유형 (OptionRightType)
|
|
|
+export const OptionRightType = {
|
|
|
+ Call: 1,
|
|
|
+ Put: 2
|
|
|
+} as const;
|
|
|
+export type OptionRightTypeValue = (typeof OptionRightType)[keyof typeof OptionRightType];
|
|
|
+
|
|
|
+export const OPTION_RIGHT_TYPE_LABEL: Record<OptionRightTypeValue, string> = {
|
|
|
+ [OptionRightType.Call]: '콜',
|
|
|
+ [OptionRightType.Put]: '풋'
|
|
|
+};
|
|
|
+
|
|
|
+// 상품(파생상품시장) 시장 (CommodityMarket) — 요청 파라미터명 'market'
|
|
|
+export const CommodityMarket = {
|
|
|
+ Oil: 1,
|
|
|
+ Gold: 2,
|
|
|
+ Emission: 3
|
|
|
+} as const;
|
|
|
+export type CommodityMarketValue = (typeof CommodityMarket)[keyof typeof CommodityMarket];
|
|
|
+export type CommodityMarketName = keyof typeof CommodityMarket;
|
|
|
+
|
|
|
+export const COMMODITY_MARKET_LABEL: Record<CommodityMarketValue, string> = {
|
|
|
+ [CommodityMarket.Oil]: '석유',
|
|
|
+ [CommodityMarket.Gold]: '금',
|
|
|
+ [CommodityMarket.Emission]: '배출권'
|
|
|
+};
|
|
|
+
|
|
|
+// 금리 유형 (RateType) — 요청 파라미터명 'type'
|
|
|
+export const RateType = {
|
|
|
+ Loan: 1,
|
|
|
+ International: 2
|
|
|
+} as const;
|
|
|
+export type RateTypeValue = (typeof RateType)[keyof typeof RateType];
|
|
|
+export type RateTypeName = keyof typeof RateType;
|
|
|
+
|
|
|
+export const RATE_TYPE_LABEL: Record<RateTypeValue, string> = {
|
|
|
+ [RateType.Loan]: '대출금리',
|
|
|
+ [RateType.International]: '국제금리'
|
|
|
+};
|
|
|
+
|
|
|
+// 공시 법인구분 (corpCls — 문자열 Y/K/N/E)
|
|
|
+export type CorpClsCode = 'Y'|'K'|'N'|'E';
|
|
|
+
|
|
|
+export const CORP_CLS_LABEL: Record<CorpClsCode, string> = {
|
|
|
+ Y: '유가',
|
|
|
+ K: '코스닥',
|
|
|
+ N: '코넥스',
|
|
|
+ E: '기타'
|
|
|
+};
|
|
|
+
|
|
|
+// ── GET /api/market/indices ──
|
|
|
+export interface MarketIndexRow {
|
|
|
+ series: MarketIndexSeriesValue;
|
|
|
+ name: string;
|
|
|
+ close: number;
|
|
|
+ changeVal: number;
|
|
|
+ // 등락률 basis point (%×100)
|
|
|
+ flucRateBp: number;
|
|
|
+ tradeDate: string;
|
|
|
+}
|
|
|
+
|
|
|
+export interface MarketIndicesResponse {
|
|
|
+ list: MarketIndexRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/etp ──
|
|
|
+export interface EtpRow {
|
|
|
+ type: EtpTypeValue;
|
|
|
+ code: string;
|
|
|
+ name: string;
|
|
|
+ close: number;
|
|
|
+ changeAmount: number;
|
|
|
+ changeRate: number;
|
|
|
+ volume: number;
|
|
|
+ tradeValue: number;
|
|
|
+ marketCap: number|null;
|
|
|
+ nav: number|null;
|
|
|
+ baseIndexName: string|null;
|
|
|
+ underlying: string|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface EtpResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: EtpRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/bonds ──
|
|
|
+export interface BondRow {
|
|
|
+ market: BondMarketValue;
|
|
|
+ code: string;
|
|
|
+ name: string;
|
|
|
+ close: number;
|
|
|
+ changeAmount: number;
|
|
|
+ yieldToMaturity: number|null;
|
|
|
+ volume: number;
|
|
|
+ tradeValue: number;
|
|
|
+ maturityYears: string|null;
|
|
|
+ issueType: string|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface BondsResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: BondRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/futures ──
|
|
|
+export interface FuturesRow {
|
|
|
+ kind: FuturesKindValue;
|
|
|
+ isuCode: string;
|
|
|
+ isuName: string;
|
|
|
+ close: number;
|
|
|
+ changeAmount: number;
|
|
|
+ settlePrice: number|null;
|
|
|
+ volume: number;
|
|
|
+ tradeValue: number;
|
|
|
+ openInterest: number|null;
|
|
|
+ productName: string|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface FuturesResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: FuturesRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/options ──
|
|
|
+export interface OptionsRow {
|
|
|
+ kind: OptionsKindValue;
|
|
|
+ isuCode: string;
|
|
|
+ isuName: string;
|
|
|
+ rightType: OptionRightTypeValue;
|
|
|
+ strikePrice: number|null;
|
|
|
+ close: number;
|
|
|
+ changeAmount: number;
|
|
|
+ impliedVolatility: number|null;
|
|
|
+ volume: number;
|
|
|
+ tradeValue: number;
|
|
|
+ openInterest: number|null;
|
|
|
+ productName: string|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface OptionsResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: OptionsRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/commodities ──
|
|
|
+export interface CommodityRow {
|
|
|
+ market: CommodityMarketValue;
|
|
|
+ code: string;
|
|
|
+ name: string;
|
|
|
+ close: number;
|
|
|
+ changeAmount: number|null;
|
|
|
+ changeRate: number|null;
|
|
|
+ weightedDiscussionPrice: number|null;
|
|
|
+ volume: number;
|
|
|
+ tradeValue: number;
|
|
|
+}
|
|
|
+
|
|
|
+export interface CommoditiesResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: CommodityRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/esg/securities ──
|
|
|
+export interface EsgSecurityRow {
|
|
|
+ name: string;
|
|
|
+ close: number;
|
|
|
+ changeAmount: number;
|
|
|
+ changeRate: number;
|
|
|
+ listedShares: number;
|
|
|
+ volume: number;
|
|
|
+ tradeValue: number;
|
|
|
+}
|
|
|
+
|
|
|
+export interface EsgSecuritiesResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: EsgSecurityRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/esg/indices ──
|
|
|
+export interface EsgIndexRow {
|
|
|
+ name: string;
|
|
|
+ close: number;
|
|
|
+ changeVal: number;
|
|
|
+ // 등락률 basis point (%×100)
|
|
|
+ flucRateBp: number;
|
|
|
+ constituentCount: number;
|
|
|
+ volume: number;
|
|
|
+ value: number;
|
|
|
+}
|
|
|
+
|
|
|
+export interface EsgIndicesResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: EsgIndexRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/esg/sri-bonds ──
|
|
|
+export interface SriBondRow {
|
|
|
+ code: string;
|
|
|
+ issuerName: string;
|
|
|
+ sriBondType: string;
|
|
|
+ name: string;
|
|
|
+ listDate: string|null;
|
|
|
+ issueDate: string|null;
|
|
|
+ redemptionDate: string|null;
|
|
|
+ couponRate: number|null;
|
|
|
+ issueAmount: number;
|
|
|
+ listAmount: number;
|
|
|
+ bondType: string|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface SriBondsResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: SriBondRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/exchange-rates ──
|
|
|
+export interface ExchangeRateRow {
|
|
|
+ currencyUnit: string;
|
|
|
+ currencyName: string;
|
|
|
+ dealBasRate: number;
|
|
|
+ // 전신환 받으실 때
|
|
|
+ ttb: number|null;
|
|
|
+ // 전신환 보내실 때
|
|
|
+ tts: number|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface ExchangeRatesResponse {
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: ExchangeRateRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/market/interest-rates ──
|
|
|
+export interface InterestRateRow {
|
|
|
+ itemName: string;
|
|
|
+ rate: number|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface InterestRatesResponse {
|
|
|
+ type: RateTypeValue;
|
|
|
+ total: number;
|
|
|
+ tradeDate: string|null;
|
|
|
+ list: InterestRateRow[];
|
|
|
+}
|
|
|
+
|
|
|
+// ── GET /api/disclosures · GET /api/stocks/{code}/disclosures ──
|
|
|
+export interface DisclosureRow {
|
|
|
+ rceptNo: string;
|
|
|
+ corpCode: string;
|
|
|
+ corpName: string;
|
|
|
+ stockCode?: string|null;
|
|
|
+ corpCls: string;
|
|
|
+ reportNm: string;
|
|
|
+ flrNm: string;
|
|
|
+ rceptDt: string;
|
|
|
+ rm: string|null;
|
|
|
+}
|
|
|
+
|
|
|
+export interface DisclosuresResponse {
|
|
|
+ total: number;
|
|
|
+ list: DisclosureRow[];
|
|
|
+}
|