결론
윈도우 PC의 Bloomberg Desktop API를 주간 데이터 생산기와 실시간 보유물건 감시기 두 갈래로 나눈다.
- 주간 생산기는
//blp/refdata를 중심으로 포트폴리오 종목, 현재값, 3년 일별 시계열을 받아 현재 레벨·52주 범위 위치·1년/3년 시그마·동종 대비 상대가치를 계산한다. - 실시간 감시기는
//blp/mktdata를 별도 프로세스로 두고, 실제 반환되는 가격·호가 필드만 구독해 보유물건 움직임을 알린다. - 포트폴리오 자동 인입의 공식 경로는
//blp/refdata의PortfolioDataRequest다. 다만 공개 근거는 2014년 Bloomberg 공식 가이드이므로 현재 해리 계정에서 실제 응답이 오는지는 회사 단말에서 1회 검증해야 한다. USIG_스프레드_20260731.xlsx는 46개 지수·종목의 값은 정상적으로 담겼지만, 어떤 Bloomberg 필드를 호출했는지와 실제 관측일이 남아 있지 않다. 다음 버전부터service/request/field/security/value_date를 모든 행에 보존한다.
현재 확인된 열린 서비스만으로 추천 후보 탐색과 근거 숫자 생산은 가능하다. 다만 “왜 움직였는지”라는 원인 설명은 이 서비스 목록만으로 확정할 수 없다. 기존 외사 리서치·Bloomberg 뉴스 파이프라인을 붙여 사람이 확인해야 한다.
1. 실제 파일 확인
USIG_스프레드_20260731.xlsx를 직접 읽어 확인한 내용:
- 시트 1개, 58행 × 11열, 수식 없는 값 파일
- 실데이터 46개: 전체지수 3, 등급 4, 만기 6, 섹터 8, 개별채권 25
- KB국민은행·농협은행은 비활성 자리로 남아 있어 실데이터 25개에 포함되지 않음
- 현재 OAS, 1주 전, 1개월 전, 52주 최저·최고, 52주 범위 위치, 3년 위치까지 존재
- Bloomberg 필드명, 가격 기준(bid/mid), 요청 종류, 실제 값 날짜는 파일에 없음
예를 들어 기술 섹터의 52주 범위 위치는 93.7%, 통신은 98.1%로 상단에 가깝고, 에너지는 17.3%, 헬스케어는 12.3%로 하단에 가깝다. 여기서 상단은 OAS가 넓다는 뜻이므로 자기 역사만 보면 싸 보이지만, 신용 이벤트 때문에 넓어진 것일 수 있어 자동 추천으로 바로 승격하면 안 된다.
지금의 52주 백분위는 일별 관측치의 순위를 센 통계적 백분위가 아니라 다음 식의 최저·최고 범위 위치다.
52주 범위 위치 = (현재 OAS - 52주 최저) / (52주 최고 - 52주 최저) × 100
이후 파일에서는 명칭을 52주 범위위치로 바꾸고, 실제 일별 관측치 순위인 경험적 백분위를 별도 칸으로 둔다.
2. 열린 서비스의 업무 적용
| 서비스 | 실제 역할 | 네 가지 업무에 닿는 사용법 | 우선순위·한계 |
|---|---|---|---|
//blp/refdata |
현재·참조값, 역사 시계열, 포트폴리오, 장중 틱·바 요청 | 추천 후보의 OAS·수익률·등급·만기·콜 구조, 1년/3년 시그마, 보유물건 주간 가격 근거 | 핵심. 주간 생산기의 본체 |
//blp/apiflds |
Bloomberg 필드 사전 검색·설명 | 사용 필드 정의와 적용 가능 여부를 저장해 “어떤 숫자냐”에 답함 | 필수 통제. 필드 추측 방지 |
//blp/instruments |
종목·커브·국채 검색 | 포트폴리오에서 받은 식별자를 정규화하고 만기 국채·커브 후보를 찾음 | 필수 보조. 가격을 주는 서비스는 아님 |
//blp/mktdata |
실시간·지연 시세 구독 | 보유물건 bid/ask/price/OAS가 실제 구독될 경우 급변 감시, 고객 문의 전 가격 변화 확인 | 별도 실시간 프로세스. 필드별 지원·권한 확인 필요 |
//blp/mktbar |
거래 체결 기준 실시간 장중 바 | 활발한 국채·ETF·지수의 장중 고저·종가 흐름으로 고객 질문 준비 | 회사채는 거래가 드물 수 있고 공식 가이드상 trade 기반이라 핵심 OAS 감시에는 부적합 |
//blp/tasvc |
과거·장중·실시간 기술분석 study | 추세·변동성 보조 신호 | 주간 OAS 통계는 HistoricalDataRequest로 직접 계산하는 편이 정의가 투명함. study 이름·파라미터는 단말 스키마 확인 필요 |
//blp/srcref |
EID별 tick size·브로커/조건코드·거래상태 참조 | 실시간 데이터의 호가 단위와 상태코드를 해석할 때 사용 | 추천 신호가 아니라 데이터 해석 보조 |
//blp/pagedata |
GPGX 페이지의 지정 행 구독 | 실제로 쓰는 딜러 가격 페이지가 GPGX로 제공될 때만 보유물건 가격 보조 | 일반 Bloomberg 화면이나 뉴스 전체를 읽는 기능이 아님. 페이지 번호가 없으면 사용하지 않음 |
//blp/exrsvc |
공개 Bloomberg 자료에서 용도 확인 못 함 | 지금은 사용하지 않음 | 회사 단말에서 서비스 operation과 schema를 덤프한 뒤 판단 |
emsx와 dlps는 열린 서비스가 아니므로 주문 라우팅과 데이터 라이선스 배포는 설계 범위에서 제외한다. 결과물은 해리 내부 판단용으로만 쓴다.
네 가지 목적별 산출물
고객에게 제안할 종목 찾기
- 자기 역사: 현재 OAS, 52주 범위 위치, 1년·3년 z-score
- 시장 대비: 같은 종목의 OAS에서 섹터·등급·만기 기준지수 OAS를 각각 뺀 상대 스프레드
- 움직임: 주간·월간 변화와 전 종목 중 이동폭 순위
- 판정:
싸다가 아니라검토 후보로 표시. 신용 이벤트·등급·유동성을 확인한 뒤 사람이 승격
제안 근거 숫자
한 문장에 다음 다섯 숫자가 같이 나오게 한다.
현재 OAS 204bp, 전주 대비 29bp 축소, 1년 평균 대비 +1.3σ, 52주 범위 상단 94%, 동일 섹터 대비 +Xbp.
X는 동일한 가격 기준과 공통 관측일이 확보된 경우에만 계산한다.
고객 질문 미리 준비
- “이번 주 얼마나 움직였나” → 주간·월간 변화
- “역사적으로 싼가” → 1년/3년 z-score와 경험적 백분위
- “시장 전체가 넓어진 건가, 이 종목만 그런가” → 섹터·등급·만기 대비 상대 스프레드
- “왜 움직였나” → API는 이상 종목만 표시. 원인은 외사 리서치·뉴스·등급 이벤트로 확인
- “어디부터 위험 신호인가” → 1σ/2σ 밴드와 최근 고점, 이벤트 일정
보유물건 가격 근거
- 주간: 기준일 OAS·수익률·가격과 자기 역사, 상대 스프레드
- 장중:
mktdata에서 실제 반환되는 bid/ask/price 필드와 업데이트 시각 - 거래 활발한 벤치마크:
mktbar장중 흐름 - 표시 원칙: 화면에
필드명·가격 소스·관측시각을 항상 붙이고, 오래된 값은 가격 근거로 쓰지 않음
3. 포트폴리오 종목 자동 인입
공식 문서로 확인된 경로
- 서비스:
//blp/refdata - 요청:
PortfolioDataRequest - 포트폴리오 식별자: Bloomberg
PRTU <GO>화면 우측 상단의 Portfolio ID, 예시 형식UXXXXXXX-X Client - 요청 가능 필드:
PORTFOLIO_MEMBER,PORTFOLIO_MPOSITION,PORTFOLIO_MWEIGHT,PORTFOLIO_DATA - 과거 포트폴리오: override
REFERENCE_DATE=yyyymmdd - 대형 응답은
PARTIAL_RESPONSE뒤 최종RESPONSE로 올 수 있으므로 모두 합쳐야 함
session.openService("//blp/refdata")
svc = session.getService("//blp/refdata")
req = svc.createRequest("PortfolioDataRequest")
req.getElement("securities").appendValue(PORTFOLIO_ID)
for field in (
"PORTFOLIO_MEMBER",
"PORTFOLIO_MPOSITION",
"PORTFOLIO_MWEIGHT",
"PORTFOLIO_DATA",
):
req.getElement("fields").appendValue(field)
아직 확인되지 않은 부분
공개 근거는 2014년 공식 개발자 가이드다. 따라서 다음을 회사 PC에서 확인하기 전에는 “포트폴리오 자동 인입 성공”으로 쓰지 않는다.
- 해리가 말한 워크시트가
PRTU/PORT포트폴리오인지 확인. 단순 Launchpad 목록이면 이 요청 대상이 아닐 수 있음 - 현재 Desktop API의
//blp/refdata에PortfolioDataRequestoperation이 실제 존재하는지 확인 - 네 필드별 응답 구조와 채권 식별자 형식 확인
- 현재일과
REFERENCE_DATE1회씩 요청해 종목 수·포지션·비중을 화면과 대조 - 권한 오류와 빈 포트폴리오를 구분
현재 Python BLPAPI는 서비스의 operation과 각 operation의 request schema를 읽을 수 있다. 첫 실행에서 service.operations() 또는 numOperations()/getOperation()과 requestDefinition()을 저장하면 오래된 문서에 의존하지 않고 회사 단말의 실제 스키마를 확인할 수 있다.
성공하면 손입력 목록은 삭제하지 않고 비상용으로 남긴다. 우선순위는 PortfolioDataRequest → 전주 성공 목록 → 수동 목록이며, 뒤 경로를 썼으면 결과 상단에 대체 사실을 표시한다.
4. 통계 판단 설계
필수 데이터
각 지수와 채권에 동일한 OAS 정의로 HistoricalDataRequest를 보내 3년 일별 시계열을 받는다.
service: //blp/refdata
request: HistoricalDataRequest
securities: Bloomberg 식별자 배열
fields: 회사 PC에서 검증된 OAS 필드 1개
startDate: 기준일 3년 전
endDate: 기준일
periodicitySelection: DAILY
현재 값 파일에는 실제 사용한 OAS field가 없으므로 OAS_SPREAD_MID나 OAS_SPREAD_BID 중 무엇이 맞다고 여기서 확정하지 않는다. 다음 실행에서 apiflds 설명, History 지원 여부, 실제 응답, 단말 YAS 화면을 대조한 뒤 하나를 고정한다. 지수와 개별채권의 필드가 다르면 정의·가격 기준을 메타데이터에 따로 기록한다.
항목별 계산
| 구분 | 계산 | 의미 |
|---|---|---|
| 현재 레벨 | 기준일 실제 OAS | 고객에게 제시할 기준값 |
| 52주 범위 위치 | (현재-최저)/(최고-최저) |
0%는 타이트, 100%는 와이드 |
| 경험적 백분위 | 과거 일별값 중 현재 이하 비율 | 최저·최고 한 번의 이상치 영향을 줄임 |
| 1년·3년 평균 | 유효 관측치 평균 | 정상 레벨 기준 |
| 1년·3년 표준편차 | 표본 표준편차, ddof=1 |
변동성 단위 |
| z-score | (현재-평균)/표준편차 |
양수는 평균보다 와이드, 음수는 타이트 |
| 1σ·2σ 범위 | 평균 ± 1σ/2σ |
평범·주의·이례 구간 |
| 상대 스프레드 | 종목 OAS-비교지수 OAS |
시장 전체 움직임과 종목 고유 움직임 분리 |
| 상대 z-score | 상대 스프레드의 1년·3년 z | 동종 대비 싼지 판단 |
해석 규칙
|z| ≤ 1: 통상 범위1 < |z| ≤ 2: 눈여겨볼 수준|z| > 2: 이례적. 추천이 아니라 원인 검증 우선z > 0: 과거 평균보다 와이드, 상대적으로 싼 방향z < 0: 과거 평균보다 타이트, 상대적으로 비싼 방향- 1년과 3년 z 부호가 다르면
기간 판단 엇갈림 - 범위 위치와 경험적 백분위가 20%p 이상 다르면
분포 왜곡/이상치 확인
위 경계는 Bloomberg 기준이 아니라 데스크 운영 규칙이다. 데이터가 쌓이면 실제 판매·가격결과와 대조해 조정한다.
데이터 품질 규칙
- 1년 유효 관측치 180개 미만, 3년 500개 미만이면 해당 시그마를
표본 부족으로 표시 - 결측치를 앞 값으로 채우지 않음
- 표준편차가 0이면 z-score 계산하지 않음
- 종목과 비교지수의 상대값은 같은 날짜가 있는 날만 사용
- 요청 종료일과 실제 마지막 값 날짜를 함께 저장. 기준일보다 오래되면
stale - 서로 다른 OAS 정의, bid/mid, 통화, 가격 소스를 한 시계열로 이어붙이지 않음
- 신규채권은 자기 1년/3년 이력이 없으므로 섹터·등급·만기 비교만 제공하고
자기 역사 없음표시
추천 후보 판정
한 숫자로 순위를 확정하지 않는다. 다음 세 문이 모두 열린 종목만 검토 후보로 보낸다.
- 자기 역사: 1년 z-score가 +1 이상 또는 경험적 백분위 80 이상
- 동종 대비: 섹터·등급·만기 중 적어도 둘에서 상대 스프레드가 와이드
- 설명 가능성: 등급변경·실적·신규발행·소송 등 명백한 위험 이유를 리서치/뉴스에서 검토
+2σ 이상 와이드는 싸다는 뜻보다 시장이 위험을 새로 가격에 넣었을 가능성이 먼저이므로 경고 후보로 분리한다.
5. 윈도우 주간 스크립트 사양
실행 순서
- 접속 점검: Desktop API 세션 시작, 열린 서비스 목록과 오류 저장
- 스키마 기록:
refdata,apiflds,instruments,exrsvc의 operation·request schema 저장 - 기준일 확정: 전주 금요일까지 대표 IG 지수에서 실제 마지막 관측일을 찾음. 미국 휴일이면 직전 반환일 사용
- 포트폴리오 읽기:
PortfolioDataRequest; 현재와 기준일 종목 수를 PRTU 화면과 대조 - 식별자 정규화:
instruments로 Bloomberg 식별자, ISIN/CUSIP, 통화, 만기 확인 - 필드 검증:
apiflds의FieldInfoRequest로 사용 필드 설명과 유형 저장 - 현재값 조회:
ReferenceDataRequest로 OAS·수익률·가격·등급·만기 등 실제 검증된 필드 조회 - 역사 조회:
HistoricalDataRequest로 기준일 포함 3년 일별 OAS 수집 - 통계 계산: 범위 위치, 경험적 백분위, 1년/3년 평균·표준편차·z-score, 상대 스프레드
- 품질검사: 누락·권한·필드 부적용·오래된 값·중복·단위 오류를 행별로 기록
- 산출물 생성: Excel, 원시 데이터, 맥 전달용 값을 같은 기준일로 출력
파일에 반드시 담을 열
as_of_target, value_date, portfolio_id, category,
security_id, bbg_security, isin, cusip, issuer, currency,
rating, maturity, sector, duration,
oas_field, oas_price_source, oas_current, oas_w1, oas_m1,
range_52w_low, range_52w_high, range_position_52w,
percentile_1y, mean_1y, std_1y, z_1y, n_1y,
percentile_3y, mean_3y, std_3y, z_3y, n_3y,
sector_spread, rating_spread, maturity_spread,
relative_z_1y, relative_z_3y,
service, request_type, status, error_text, collected_at
출력물
USIG_스프레드_YYYYMMDD.xlsx: 해리가 보는 주간 파일요약: 제안 검토·경고·리치 후보포트폴리오: PRTU 원목록과 포지션·비중지수: 전체·등급·만기·섹터종목: 25개 이상 자동 확장통계: 1년/3년 평균·시그마·표본수오류: 미수집 이유메타데이터: 서비스·요청·필드·실제 관측일raw/YYYYMMDD/*.json: 원응답과 request metadatahistory/oas_history.parquet: 일별 시계열 누적EXPORT_VALUES_YYYYMMDD.csv: 맥 파이프라인 전달용 값weekly_signal_YYYYMMDD.json: 기존 US IG 발표자료와 리서치 파이프라인 입력
중복·갱신 규칙
- 원시 시계열 키:
security_id + oas_field + value_date - 같은 키·같은 값은 건너뜀
- 같은 키에 값이 바뀌면 기존 값을 지우지 않고
revision과 수집시각을 추가 - 포트폴리오 변경은
added/removed/size_changed로 기록 - 자동 목록 실패 시 수동 목록을 쓸 수 있으나 결과 첫 줄에
포트폴리오 API 실패로 전주/수동 목록 사용표시 - 일부 종목 실패 때문에 전체 파일을 버리지 않되, 실패 행을 정상값처럼 숨기지 않음
실시간 감시기는 분리
주간 스크립트에 장시간 mktdata 구독을 섞지 않는다. 별도 inventory_monitor.py가 회사 PC 로그인 중에만 작동하도록 한다.
- 대상: PRTU에서
보유/세일즈태그가 있는 종목 - 알림: bid/ask/price/OAS 중 회사 PC에서 실제 스트리밍이 확인된 필드만 사용
- 조건: 주간 통계 밴드 이탈, 당일 급변, 값 stale
- 메시지: 종목, 현재값, 변화폭, 관측시각, 필드명
- 주문 전송 기능 없음
6. 회사 단말 1회 검증 목록
PortfolioDataRequestoperation 존재 및 한 포트폴리오 응답PORTFOLIO_MEMBER,PORTFOLIO_MPOSITION,PORTFOLIO_MWEIGHT,PORTFOLIO_DATA반환 구조와 화면 종목 수 일치- 실제 OAS field mnemonic, bid/mid 기준, History 지원 여부
- 지수와 채권 각각 1개에 3년
HistoricalDataRequest성공 - PRTU 종목 추가·삭제 후 API 목록 변화
mktdata에서 회사채 bid/ask/price/OAS 중 실제 갱신되는 필드exrsvcoperation/schema 덤프. 용도 확인 전 업무 연결 금지- 기준일이 미국 휴일일 때 직전 실제 관측일 선택
- Excel의 현재값과 API 원응답 5개 표본 일치
근거 자료
- Bloomberg Open API Core Developer Guide: 서비스별 역할,
HistoricalDataRequest,mktdata,mktbar,apiflds,instruments,pagedata,tasvc— https://data.bloomberglp.com/professional/sites/10/2017/03/BLPAPI-Core-Developer-Guide.pdf - Bloomberg API Developer's Guide 2.54:
PortfolioDataRequest, Portfolio ID, 네 포트폴리오 필드,REFERENCE_DATE— https://data.bloomberglp.com/professional/sites/4/blpapi-developers-guide-2.54.pdf - Bloomberg BLPAPI Python 3.24.2
Service: 서비스의 operation·schema 조회 — https://bloomberg.github.io/blpapi-docs/python/3.24.2/_autosummary/blpapi.Service.html - Bloomberg BLPAPI Python 3.24.2
Operation:requestDefinition()— https://bloomberg.github.io/blpapi-docs/python/3.24.2/_autosummary/blpapi.Operation.html - Bloomberg API Library: Desktop/API 라이브러리 공식 안내 — https://professional.bloomberg.com/support/api-library/