def _calc_factor_loading(cls, code, calc_date): """ 计算指定日期、指定个股LNCAP因子载荷 Parameters: -------- :param code: str 个股代码, 如SH600000, 600000 :param calc_date: datetime-like, str 计算日期, 格式: YYYY-MM-DD :return: pd.Series -------- 个股的LNCAP因子载荷 0. code 1. lncap 如果计算失败, 返回None """ # 取得个股的非复权收盘价 df_secu_quote = Utils.get_secu_daily_mkt(code, start=calc_date, fq=False, range_lookup=True) if df_secu_quote is None: return None secu_close = df_secu_quote['close'] # 取得个股最新的A股总股本数据 cap_struct = Utils.get_cap_struct(code, calc_date) if cap_struct is None: return None total_share = cap_struct.total - cap_struct.liquid_b - cap_struct.liquid_h # 计算总市值的自然对数值 lncap = np.log(secu_close * total_share) liquid_cap = secu_close * cap_struct.liquid_a return pd.Series([Utils.code_to_symbol(code), lncap, liquid_cap], index=['code', 'lncap', 'liquid_cap'])
def _calc_factor_loading(cls, code, calc_date): """ 计算指定日期、指定个股的价值因子,包含ep_ttm, bp_lr, ocf_ttm Parameters: -------- :param code: str 个股代码:如600000或SH600000 :param calc_date: datetime-like or str 计算日期,格式YYYY-MM-DD, YYYYMMDD :return: pd.Series -------- 价值类因子值 0. ep_ttm: TTM净利润/总市值 1. bp_lr: 净资产(最新财报)/总市值 2. ocf_ttm: TTM经营性现金流/总市值 若计算失败,返回None """ code = Utils.code_to_symbol(code) calc_date = Utils.to_date(calc_date) # 读取TTM财务数据 ttm_fin_data = Utils.get_ttm_fin_basic_data(code, calc_date) if ttm_fin_data is None: return None # 读取最新财报数据 report_date = Utils.get_fin_report_date(calc_date) fin_basic_data = Utils.get_fin_basic_data(code, report_date) if fin_basic_data is None: return None # 计算总市值 mkt_daily = Utils.get_secu_daily_mkt(code, calc_date, fq=False, range_lookup=True) if mkt_daily.shape[0] == 0: return None cap_struct = Utils.get_cap_struct(code, calc_date) if cap_struct is None: return None total_cap = cap_struct.total - cap_struct.liquid_b - cap_struct.liquid_h total_mkt_cap = total_cap * mkt_daily.close # 计算价值类因子 ep_ttm = ttm_fin_data[ 'NetProfit'] * util_ct.FIN_DATA_AMOUNT_UNIT / total_mkt_cap ocf_ttm = ttm_fin_data[ 'NetOperateCashFlow'] * util_ct.FIN_DATA_AMOUNT_UNIT / total_mkt_cap bp_lr = fin_basic_data[ 'ShareHolderEquity'] * util_ct.FIN_DATA_AMOUNT_UNIT / total_mkt_cap return Series([round(ep_ttm, 6), round(bp_lr, 6), round(ocf_ttm, 6)], index=['ep_ttm', 'bp_lr', 'ocf_ttm'])
def _calc_factor_loading(cls, code, calc_date): """ 计算指定日期、指定个股的规模因子值 Parameters: -------- :param code: str 个股代码,如600000、SH600000 :param calc_date: datetime-like, str 规模因子计算日期,格式YYYY-MM-DD或YYYYMMDD :return: pd.Series -------- 个股规模因子值,各个index对应的含义如下: 0. LnTotalMktCap: 总市值对数 1. LnLiquidMktCap: 流通市值对数 若计算失败,返回None """ # 取得证券截止指定日期最新的非复权行情数据 code = Utils.code_to_symbol(code) calc_date = Utils.to_date(calc_date) mkt_daily = Utils.get_secu_daily_mkt(code, calc_date, fq=False, range_lookup=True) if mkt_daily.shape[0] == 0: return None # 取得证券截止指定日期前最新的股本结构数据 cap_struct = Utils.get_cap_struct(code, calc_date) if cap_struct is None: return None # 计算证券的规模因子 scale_factor = Series() total_cap = cap_struct.total - cap_struct.liquid_b - cap_struct.liquid_h scale_factor['LnTotalMktCap'] = math.log(total_cap * mkt_daily.close) scale_factor['LnLiquidMktCap'] = math.log(cap_struct.liquid_a * mkt_daily.close) return scale_factor