2025, Oct 19 16:31

Bloomberg में CALENDAR_NON_SETTLEMENT_DATES से गैर-निपटान दिन कैसे निकालें

Bloomberg में currency टिकर और keyword overrides के साथ CALENDAR_NON_SETTLEMENT_DATES क्वेरी कर गैर-निपटान दिन भरोसेमंद रूप से निकालें और ट्रेडिंग शेड्यूल तय करें.

गैर-निपटान दिनों को ध्यान में रखकर ट्रेडिंग सिस्टम की योजना तभी संभव है जब आप Bloomberg से छुट्टियों के कैलेंडर पहले से मंगवा सकें। बाद में खाली तारीखें “ढूँढ़ने” के लिए blp.bdh पर भरोसा करना काम नहीं करेगा। उद्देश्य है कि CALENDAR_NON_SETTLEMENT_DATES का उपयोग करके किसी दिए गए बाज़ार के आने वाले अव्यापार/गैर-निपटान दिनों को निकाला जाए, और यह सब कोड के जरिए भरोसेमंद तरीके से किया जाए।

समस्या का विवरण

इरादा यह था कि कई टिकरों और देश-कोडों पर लूप चलाकर चुने गए महीने के आस-पास के बड़े विंडो के लिए गैर-निपटान तारीखें पूछी जाएँ। कई टिकर और देश-कोड आज़माने के बावजूद, हर बार परिणाम खाली DataFrame रहा।

import pandas as pd
import numpy as np
from xbbg import blp
from datetime import datetime, timedelta
inst_map = {
    'SOFRRATE Index': ('USD Curncy', 'US'),
    'BISTTREF Index': ('TRY Curncy', 'TU'), 
    'MUTKCALM Index': ('JPY Curncy','JN'),
    'RUONIA Index': ('RUB Cunrcy','R$'),
    'SIBCSORA Index': ('SGD Curncy','SI'),
    'SONIO/N Index': ('GBP Curncy','GB'),
    'SRFXON3 Index': ('CHF Curncy','SZ'),
    'TTHORON Index': ('TWD Curncy','T+')
}
def slide_month(y: int, m: int, delta: int):
    new_m = m + delta
    new_y = y + (new_m - 1) // 12
    new_m = ((new_m - 1) % 12) + 1
    return new_y, new_m
def collect_blackout_days(y: int, m: int):
    s_y, s_m = slide_month(y, m, -1)
    e_y, e_m = slide_month(y, m, +1)
    s_date = datetime(s_y, s_m, 10).strftime('%Y%m%d')
    e_date = datetime(e_y, e_m, 15).strftime('%Y%m%d')
    days_by_index = {}
    for idx, (_, ctry_code) in inst_map.items():
        try:
            out = blp.bds(
                idx,
                'CALENDAR_NON_SETTLEMENT_DATES',
                [
                    f'SETTLEMENT_CALENDAR_CODE={ctry_code}',
                    f'CALENDAR_START_DATE={s_date}',
                    f'CALENDAR_END_DATE={e_date}'
                ]
            )
            holidays = out.get('calendar_non_settlement_dates', [])
            days_by_index[idx] = holidays
        except Exception as err:
            print(f"Error for {idx} : {err}")
            days_by_index[idx] = []
    return days_by_index

गलती कहाँ है और क्यों

यह विफलता blp.bds के लिए रिक्वेस्ट बनाने के तरीके से आती है। पहला, CALENDAR_NON_SETTLEMENT_DATES पूछते समय काम करने वाली क्वेरी एक currency टिकर को लक्ष्य बनाती है। दूसरा, overrides को स्ट्रिंग्स की सूची के बजाय keyword arguments के रूप में देना होता है। लाइब्रेरी के स्रोत से एक अहम बात भी सामने आती है: तीसरा positional argument सूची के लिए नहीं है, इसलिए लिस्ट पास करने पर आउटपुट खाली आना समझ में आता है। अनुपयुक्त टिकर और गलत override फ़ॉर्मेट का संयोजन खाली DataFrames देता है।

सही तरीका

सही कॉल एक currency टिकर का उपयोग करती है और keyword overrides के जरिए कैलेंडर कोड तथा तारीख़-सीमा परिभाषित करती है। परिणामस्वरूप holiday_date कॉलम वाला एक DataFrame मिलता है, जिसमें तिथियाँ yyyy-mm-dd प्रारूप में होती हैं।

from xbbg import blp
holidays = blp.bds(
    'USD Curncy',
    'CALENDAR_NON_SETTLEMENT_DATES',
    SETTLEMENT_CALENDAR_CODE='FD',
    CALENDAR_START_DATE='20250101',
    CALENDAR_END_DATE='20261231'
)
print(holidays)

ध्यान दें: FD, US के लिए कैलेंडर है।

यह क्यों महत्वपूर्ण है

गैर-निपटान दिन pricing runs, cash movements, roll logic और ऑपरेशनल वर्कफ़्लो की शेड्यूलिंग को सीधे प्रभावित करते हैं। तारीख़ें आने से पहले ही Bloomberg से कैलेंडर लेकर आप प्रक्रियाओं को संरेखित कर सकते हैं, मिसिंग प्रिंट्स से उठने वाले झूठे अलर्ट से बच सकते हैं, और डाउनस्ट्रीम सिस्टम को स्थिर रख सकते हैं।

निष्कर्ष

यदि आपको भविष्य की ट्रेडिंग छुट्टियाँ चाहिए, तो सही सिक्योरिटी पर CALENDAR_NON_SETTLEMENT_DATES क्वेरी करें और overrides को keyword arguments के रूप में भेजें। जब भी खाली DataFrame मिले, तो इम्प्लीमेंटेशन के अनुरूप फंक्शन सिग्नेचर और पैरामीटर के फ़ॉर्मेट की जाँच करें, ताकि यह सुनिश्चित हो कि आप positional arguments गलत रूप में नहीं भेज रहे। एक बार रिक्वेस्ट सही बन गई तो holiday_date मानों वाला DataFrame आपकी शेड्यूलिंग लॉजिक में सीधे लगाने के लिए तैयार होगा।

यह लेख StackOverflow के प्रश्न से लिया गया है, जिसे Jstne ने पूछा था, और Jstne के उत्तर पर आधारित है।