virtual-insanity
← 리포트 목록

Bloomberg BLPAPI 해외채권 세일즈 활용 방법론

2026-08-02 claude

결론

윈도우 PC의 Bloomberg Desktop API를 주간 데이터 생산기와 실시간 보유물건 감시기 두 갈래로 나눈다.

  1. 주간 생산기는 //blp/refdata를 중심으로 포트폴리오 종목, 현재값, 3년 일별 시계열을 받아 현재 레벨·52주 범위 위치·1년/3년 시그마·동종 대비 상대가치를 계산한다.
  2. 실시간 감시기는 //blp/mktdata를 별도 프로세스로 두고, 실제 반환되는 가격·호가 필드만 구독해 보유물건 움직임을 알린다.
  3. 포트폴리오 자동 인입의 공식 경로는 //blp/refdata의 PortfolioDataRequest다. 다만 공개 근거는 2014년 Bloomberg 공식 가이드이므로 현재 해리 계정에서 실제 응답이 오는지는 회사 단말에서 1회 검증해야 한다.
  4. 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에서 확인하기 전에는 “포트폴리오 자동 인입 성공”으로 쓰지 않는다.

  1. 해리가 말한 워크시트가 PRTU/PORT 포트폴리오인지 확인. 단순 Launchpad 목록이면 이 요청 대상이 아닐 수 있음
  2. 현재 Desktop API의 //blp/refdata에 PortfolioDataRequest operation이 실제 존재하는지 확인
  3. 네 필드별 응답 구조와 채권 식별자 형식 확인
  4. 현재일과 REFERENCE_DATE 1회씩 요청해 종목 수·포지션·비중을 화면과 대조
  5. 권한 오류와 빈 포트폴리오를 구분

현재 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. 자기 역사: 1년 z-score가 +1 이상 또는 경험적 백분위 80 이상
  2. 동종 대비: 섹터·등급·만기 중 적어도 둘에서 상대 스프레드가 와이드
  3. 설명 가능성: 등급변경·실적·신규발행·소송 등 명백한 위험 이유를 리서치/뉴스에서 검토

+2σ 이상 와이드는 싸다는 뜻보다 시장이 위험을 새로 가격에 넣었을 가능성이 먼저이므로 경고 후보로 분리한다.

5. 윈도우 주간 스크립트 사양

실행 순서

  1. 접속 점검: Desktop API 세션 시작, 열린 서비스 목록과 오류 저장
  2. 스키마 기록: refdata, apiflds, instruments, exrsvc의 operation·request schema 저장
  3. 기준일 확정: 전주 금요일까지 대표 IG 지수에서 실제 마지막 관측일을 찾음. 미국 휴일이면 직전 반환일 사용
  4. 포트폴리오 읽기: PortfolioDataRequest; 현재와 기준일 종목 수를 PRTU 화면과 대조
  5. 식별자 정규화: instruments로 Bloomberg 식별자, ISIN/CUSIP, 통화, 만기 확인
  6. 필드 검증: apiflds의 FieldInfoRequest로 사용 필드 설명과 유형 저장
  7. 현재값 조회: ReferenceDataRequest로 OAS·수익률·가격·등급·만기 등 실제 검증된 필드 조회
  8. 역사 조회: HistoricalDataRequest로 기준일 포함 3년 일별 OAS 수집
  9. 통계 계산: 범위 위치, 경험적 백분위, 1년/3년 평균·표준편차·z-score, 상대 스프레드
  10. 품질검사: 누락·권한·필드 부적용·오래된 값·중복·단위 오류를 행별로 기록
  11. 산출물 생성: 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 metadata
  • history/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회 검증 목록

  1. PortfolioDataRequest operation 존재 및 한 포트폴리오 응답
  2. PORTFOLIO_MEMBER, PORTFOLIO_MPOSITION, PORTFOLIO_MWEIGHT, PORTFOLIO_DATA 반환 구조와 화면 종목 수 일치
  3. 실제 OAS field mnemonic, bid/mid 기준, History 지원 여부
  4. 지수와 채권 각각 1개에 3년 HistoricalDataRequest 성공
  5. PRTU 종목 추가·삭제 후 API 목록 변화
  6. mktdata에서 회사채 bid/ask/price/OAS 중 실제 갱신되는 필드
  7. exrsvc operation/schema 덤프. 용도 확인 전 업무 연결 금지
  8. 기준일이 미국 휴일일 때 직전 실제 관측일 선택
  9. Excel의 현재값과 API 원응답 5개 표본 일치

근거 자료