def bdh(tickers, flds=None, start_date=None, end_date='today', adjust=None, **kwargs) -> pd.DataFrame: """ Bloomberg historical data Args: tickers: ticker(s) flds: field(s) start_date: start date end_date: end date - default today adjust: `all`, `dvd`, `normal`, `abn` (=abnormal), `split`, `-` or None exact match of above words will adjust for corresponding events Case 0: `-` no adjustment for dividend or split Case 1: `dvd` or `normal|abn` will adjust for all dividends except splits Case 2: `adjust` will adjust for splits and ignore all dividends Case 3: `all` == `dvd|split` == adjust for all Case 4: None == Bloomberg default OR use kwargs **kwargs: overrides Returns: pd.DataFrame """ logger = logs.get_logger(bdh, **kwargs) if flds is None: flds = ['Last_Price'] e_dt = utils.fmt_dt(end_date, fmt='%Y%m%d') if start_date is None: start_date = pd.Timestamp(e_dt) - pd.Timedelta(weeks=8) s_dt = utils.fmt_dt(start_date, fmt='%Y%m%d') request = process.create_request( service='//blp/refdata', request='HistoricalDataRequest', **kwargs, ) process.init_request(request=request, tickers=tickers, flds=flds, start_date=s_dt, end_date=e_dt, adjust=adjust, **kwargs) logger.debug(f'Sending request to Bloomberg ...\n{request}') conn.send_request(request=request, **kwargs) res = pd.DataFrame(process.rec_events(process.process_hist, **kwargs)) if kwargs.get('raw', False): return res if res.empty or any(fld not in res for fld in ['ticker', 'date']): return pd.DataFrame() return (res.set_index(['ticker', 'date']).unstack(level=0).rename_axis( index=None, columns=[None, None]).swaplevel( 0, 1, axis=1).reindex(columns=utils.flatten(tickers), level=0).reindex(columns=utils.flatten(flds), level=1))
def dividend(tickers, typ='all', start_date=None, end_date=None, **kwargs) -> pd.DataFrame: """ Bloomberg dividend / split history Args: tickers: list of tickers typ: dividend adjustment type `all`: `DVD_Hist_All` `dvd`: `DVD_Hist` `split`: `Eqy_DVD_Hist_Splits` `gross`: `Eqy_DVD_Hist_Gross` `adjust`: `Eqy_DVD_Adjust_Fact` `adj_fund`: `Eqy_DVD_Adj_Fund` `with_amt`: `DVD_Hist_All_with_Amt_Status` `dvd_amt`: `DVD_Hist_with_Amt_Status` `gross_amt`: `DVD_Hist_Gross_with_Amt_Stat` `projected`: `BDVD_Pr_Ex_Dts_DVD_Amts_w_Ann` start_date: start date end_date: end date **kwargs: overrides Returns: pd.DataFrame """ kwargs.pop('raw', None) if isinstance(tickers, str): tickers = [tickers] tickers = [t for t in tickers if ('Equity' in t) and ('=' not in t)] fld = const.DVD_TPYES.get(typ, typ) if (fld == 'Eqy_DVD_Adjust_Fact') and ('Corporate_Actions_Filter' not in kwargs): kwargs[ 'Corporate_Actions_Filter'] = 'NORMAL_CASH|ABNORMAL_CASH|CAPITAL_CHANGE' if start_date: kwargs['DVD_Start_Dt'] = utils.fmt_dt(start_date, fmt='%Y%m%d') if end_date: kwargs['DVD_End_Dt'] = utils.fmt_dt(end_date, fmt='%Y%m%d') return bds(tickers=tickers, flds=fld, col_maps=const.DVD_COLS, **kwargs)
def missing_info(**kwargs) -> str: """ Full infomation for missing query """ func = kwargs.pop('func', 'unknown') if 'ticker' in kwargs: kwargs['ticker'] = kwargs['ticker'].replace('/', '_') for dt in ['dt', 'start_dt', 'end_dt', 'start_date', 'end_date']: if dt not in kwargs: continue kwargs[dt] = utils.fmt_dt(kwargs[dt]) info = utils.to_str(kwargs, fmt='{value}', sep='/')[1:-1] return f'{func}/{info}'
def beqs(screen, asof=None, typ='PRIVATE', group='General', **kwargs) -> pd.DataFrame: """ Bloomberg equity screening Args: screen: screen name asof: as of date typ: GLOBAL/B (Bloomberg) or PRIVATE/C (Custom, default) group: group name if screen is organized into groups Returns: pd.DataFrame """ logger = logs.get_logger(beqs, **kwargs) service = conn.bbg_service(service='//blp/refdata', **kwargs) request = service.createRequest('BeqsRequest') request.set('screenName', screen) request.set('screenType', 'GLOBAL' if typ[0].upper() in ['G', 'B'] else 'PRIVATE') request.set('Group', group) if asof: overrides = request.getElement('overrides') ovrd = overrides.appendElement() ovrd.setElement('fieldId', 'PiTDate') ovrd.setElement('value', utils.fmt_dt(asof, '%Y%m%d')) logger.debug(f'Sending request to Bloomberg ...\n{request}') conn.send_request(request=request, **kwargs) res = pd.DataFrame(process.rec_events(func=process.process_ref, **kwargs)) if res.empty: if kwargs.get('trial', 0): return pd.DataFrame() else: return beqs(screen=screen, asof=asof, typ=typ, group=group, trial=1, **kwargs) if kwargs.get('raw', False): return res cols = res.field.unique() return (res.set_index(['ticker', 'field']).unstack(level=1).rename_axis( index=None, columns=[None, None ]).droplevel(axis=1, level=0).loc[:, cols].pipe(pipeline.standard_cols))
def trail_info(**kwargs) -> dict: """ Convert info to proper format for databse Returns: dict """ kwargs['func'] = kwargs.pop('func', 'unknown') if 'ticker' in kwargs: kwargs['ticker'] = kwargs['ticker'].replace('/', '_') for dt in ['dt', 'start_dt', 'end_dt', 'start_date', 'end_date']: if dt not in kwargs: continue kwargs[dt] = utils.fmt_dt(kwargs[dt]) return kwargs
def dividend(tickers, typ='all', start_date=None, end_date=None, **kwargs): """ Dividend history Args: tickers: list of tickers typ: `all`, `dvd`, `split`, `split`, `gross`, `adjust`, `adj_fund`, `with_amt`, `dvd_amt`, `gross_amt`, `projected` start_date: start date end_date: end date **kwargs: overrides Returns: pd.DataFrame Examples: >>> dividend( ... tickers=['C US Equity', 'NVDA US Equity', 'MS US Equity'], ... start_date='2018-01-01', end_date='2018-05-01' ... ).rename_axis(None).loc[:, [ ... 'ex_date', 'rec_date', 'dvd_amt' ... ]].round(2) ex_date rec_date dvd_amt C US Equity 2018-02-02 2018-02-05 0.32 MS US Equity 2018-04-27 2018-04-30 0.25 MS US Equity 2018-01-30 2018-01-31 0.25 NVDA US Equity 2018-02-22 2018-02-23 0.15 """ if isinstance(tickers, str): tickers = [tickers] tickers = [t for t in tickers if ('Equity' in t) and ('=' not in t)] fld = { 'all': 'DVD_Hist_All', 'dvd': 'DVD_Hist', 'split': 'Eqy_DVD_Hist_Splits', 'gross': 'Eqy_DVD_Hist_Gross', 'adjust': 'Eqy_DVD_Adjust_Fact', 'adj_fund': 'Eqy_DVD_Adj_Fund', 'with_amt': 'DVD_Hist_All_with_Amt_Status', 'dvd_amt': 'DVD_Hist_with_Amt_Status', 'gross_amt': 'DVD_Hist_Gross_with_Amt_Stat', 'projected': 'BDVD_Pr_Ex_Dts_DVD_Amts_w_Ann', }.get(typ, typ) if (fld == 'Eqy_DVD_Adjust_Fact') and ('Corporate_Actions_Filter' not in kwargs): kwargs['Corporate_Actions_Filter'] = 'NORMAL_CASH|ABNORMAL_CASH|CAPITAL_CHANGE' if fld in [ 'DVD_Hist_All', 'DVD_Hist', 'Eqy_DVD_Hist_Gross', 'DVD_Hist_All_with_Amt_Status', 'DVD_Hist_with_Amt_Status', ]: if start_date: kwargs['DVD_Start_Dt'] = utils.fmt_dt(start_date, fmt='%Y%m%d') if end_date: kwargs['DVD_End_Dt'] = utils.fmt_dt(end_date, fmt='%Y%m%d') kwargs['col_maps'] = { 'Declared Date': 'dec_date', 'Ex-Date': 'ex_date', 'Record Date': 'rec_date', 'Payable Date': 'pay_date', 'Dividend Amount': 'dvd_amt', 'Dividend Frequency': 'dvd_freq', 'Dividend Type': 'dvd_type', 'Amount Status': 'amt_status', 'Adjustment Date': 'adj_date', 'Adjustment Factor': 'adj_factor', 'Adjustment Factor Operator Type': 'adj_op', 'Adjustment Factor Flag': 'adj_flag', 'Amount Per Share': 'amt_ps', 'Projected/Confirmed': 'category', } return bds(tickers=tickers, flds=fld, raw=False, **kwargs)
def bdh(tickers, flds, start_date, end_date='today', adjust=None, **kwargs): """ Bloomberg historical data Args: tickers: ticker(s) flds: field(s) start_date: start date end_date: end date - default today adjust: `all`, `dvd`, `normal`, `abn` (=abnormal), `split`, `-` or None exact match of above words will adjust for corresponding events Case 0: `-` no adjustment for dividend or split Case 1: `dvd` or `normal|abn` will adjust for all dividends except splits Case 2: `adjust` will adjust for splits and ignore all dividends Case 3: `all` == `dvd|split` == adjust for all Case 4: None == Bloomberg default OR use kwargs **kwargs: overrides Returns: pd.DataFrame Examples: >>> bdh( ... tickers='VIX Index', flds=['High', 'Low', 'Last_Price'], ... start_date='2018-02-05', end_date='2018-02-07', ... ).round(2).transpose().rename_axis((None, None)) 2018-02-05 2018-02-06 2018-02-07 VIX Index High 38.80 50.30 31.64 Low 16.80 22.42 21.17 Last_Price 37.32 29.98 27.73 >>> bdh( ... tickers='AAPL US Equity', flds='Px_Last', ... start_date='20140605', end_date='20140610', adjust='-' ... ).round(2) ticker AAPL US Equity field Px_Last 2014-06-05 647.35 2014-06-06 645.57 2014-06-09 93.70 2014-06-10 94.25 >>> bdh( ... tickers='AAPL US Equity', flds='Px_Last', ... start_date='20140606', end_date='20140609', ... CshAdjNormal=False, CshAdjAbnormal=False, CapChg=False, ... ).round(2) ticker AAPL US Equity field Px_Last 2014-06-06 645.57 2014-06-09 93.70 """ logger = logs.get_logger(bdh, level=kwargs.pop('log', logs.LOG_LEVEL)) # Dividend adjustments if isinstance(adjust, str) and adjust: if adjust == 'all': kwargs['CshAdjNormal'] = True kwargs['CshAdjAbnormal'] = True kwargs['CapChg'] = True else: kwargs['CshAdjNormal'] = 'normal' in adjust or 'dvd' in adjust kwargs['CshAdjAbnormal'] = 'abn' in adjust or 'dvd' in adjust kwargs['CapChg'] = 'split' in adjust con, _ = create_connection() elms = assist.proc_elms(**kwargs) ovrds = assist.proc_ovrds(**kwargs) if isinstance(tickers, str): tickers = [tickers] if isinstance(flds, str): flds = [flds] s_dt = utils.fmt_dt(start_date, fmt='%Y%m%d') e_dt = utils.fmt_dt(end_date, fmt='%Y%m%d') logger.info( f'loading historical data from Bloomberg:\n' f'{assist.info_qry(tickers=tickers, flds=flds)}' ) return con.bdh( tickers=tickers, flds=flds, elms=elms, ovrds=ovrds, start_date=s_dt, end_date=e_dt, ).rename_axis(None)
def dividend(tickers, typ='all', start_date=None, end_date=None, **kwargs) -> pd.DataFrame: """ Bloomberg dividend / split history Args: tickers: list of tickers typ: dividend adjustment type `all`: `DVD_Hist_All` `dvd`: `DVD_Hist` `split`: `Eqy_DVD_Hist_Splits` `gross`: `Eqy_DVD_Hist_Gross` `adjust`: `Eqy_DVD_Adjust_Fact` `adj_fund`: `Eqy_DVD_Adj_Fund` `with_amt`: `DVD_Hist_All_with_Amt_Status` `dvd_amt`: `DVD_Hist_with_Amt_Status` `gross_amt`: `DVD_Hist_Gross_with_Amt_Stat` `projected`: `BDVD_Pr_Ex_Dts_DVD_Amts_w_Ann` start_date: start date end_date: end date **kwargs: overrides Returns: pd.DataFrame """ kwargs.pop('raw', None) if isinstance(tickers, str): tickers = [tickers] tickers = [t for t in tickers if ('Equity' in t) and ('=' not in t)] fld = { 'all': 'DVD_Hist_All', 'dvd': 'DVD_Hist', 'split': 'Eqy_DVD_Hist_Splits', 'gross': 'Eqy_DVD_Hist_Gross', 'adjust': 'Eqy_DVD_Adjust_Fact', 'adj_fund': 'Eqy_DVD_Adj_Fund', 'with_amt': 'DVD_Hist_All_with_Amt_Status', 'dvd_amt': 'DVD_Hist_with_Amt_Status', 'gross_amt': 'DVD_Hist_Gross_with_Amt_Stat', 'projected': 'BDVD_Pr_Ex_Dts_DVD_Amts_w_Ann', }.get(typ, typ) if (fld == 'Eqy_DVD_Adjust_Fact') and ('Corporate_Actions_Filter' not in kwargs): kwargs[ 'Corporate_Actions_Filter'] = 'NORMAL_CASH|ABNORMAL_CASH|CAPITAL_CHANGE' if fld in [ 'DVD_Hist_All', 'DVD_Hist', 'Eqy_DVD_Hist_Gross', 'DVD_Hist_All_with_Amt_Status', 'DVD_Hist_with_Amt_Status', ]: if start_date: kwargs['DVD_Start_Dt'] = utils.fmt_dt(start_date, fmt='%Y%m%d') if end_date: kwargs['DVD_End_Dt'] = utils.fmt_dt(end_date, fmt='%Y%m%d') return bds(tickers=tickers, flds=fld, col_maps={ 'Declared Date': 'dec_date', 'Ex-Date': 'ex_date', 'Record Date': 'rec_date', 'Payable Date': 'pay_date', 'Dividend Amount': 'dvd_amt', 'Dividend Frequency': 'dvd_freq', 'Dividend Type': 'dvd_type', 'Amount Status': 'amt_status', 'Adjustment Date': 'adj_date', 'Adjustment Factor': 'adj_factor', 'Adjustment Factor Operator Type': 'adj_op', 'Adjustment Factor Flag': 'adj_flag', 'Amount Per Share': 'amt_ps', 'Projected/Confirmed': 'category', }, **kwargs)