def _calc_factor_loading(cls, code, calc_date): """ 计算指定日期、指定个股的BTOP因子载荷 Paramters: -------- :param code: str 个股代码, 如SH600000, 600000 :param calc_date: datetime-like, str 计算日期, 格式: YYYY-MM-DD :return: pd.Series -------- 个股的BTOP因子载荷 0. code 1. btop 如果计算失败, 返回None """ # 读取个股的财务数据 fin_report_date = Utils.get_fin_report_date(calc_date) fin_basic_data = Utils.get_fin_basic_data(code, fin_report_date) if fin_basic_data is None: return None # 读取个股的市值因子(LNCAP) df_lncap = cls._LNCAP_Cache.get(Utils.datetimelike_to_str(calc_date, dash=False)) if df_lncap is None: lncap_path = os.path.join(factor_ct.FACTOR_DB.db_path, risk_ct.LNCAP_CT.db_file) df_lncap = Utils.read_factor_loading(lncap_path, Utils.datetimelike_to_str(calc_date, dash=False)) cls._LNCAP_Cache.set(Utils.datetimelike_to_str(calc_date, dash=False), df_lncap) secu_lncap = df_lncap[df_lncap['id'] == Utils.code_to_symbol(code)] if secu_lncap.empty: return None flncap = secu_lncap.iloc[0]['factorvalue'] # 账面市值比=净资产/市值 btop = (fin_basic_data['TotalAsset'] - fin_basic_data['TotalLiability']) * 10000 / np.exp(flncap) return pd.Series([Utils.code_to_symbol(code), btop], index=['code', 'btop'])
def _calc_factor_loading(cls, code, calc_date): """ 计算指定日期、指定个股DTOA因子载荷 Parameters: -------- :param code: str 个股代码, 如SH600000, 600000 :param calc_date: datetime-like, str 计算日期, 格式: YYYY-MM-DD :return: pd.Series -------- 个股的DTOA因子载荷 0. code 1. dtoa 如果计算失败, 返回None """ code = Utils.code_to_symbol(code) 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 # td为负债总额, ta为总资产 td = fin_basic_data['TotalLiability'] if np.isnan(td): return None ta = fin_basic_data['TotalAsset'] if np.isnan(ta): return None if abs(ta) < utils_con.TINY_ABS_VALUE: return None # dtoa = td / ta dtoa = td / ta return pd.Series([code, dtoa], index=['code', 'dtoa'])
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): """ 计算指定日期、指定个股MLEV因子载荷 Parameters: -------- :param code: str 个股代码, 如Sh600000, 600000 :param calc_date: datetime-like, str 计算日期, 格式: YYYY-MM-DD :return: pd.Series -------- 个股的MLEV因子载荷 0. code 1. mlev 如果计算失败, 返回None """ code = Utils.code_to_symbol(code) report_date = Utils.get_fin_report_date(calc_date) # 读取个股最新财务报表摘要数据 fin_summary_data = Utils.get_fin_summary_data(code, report_date) # ld为个股长期负债的账面价值, 如果缺失长期负债数据, 则用负债总计代替 if fin_summary_data is None: return None ld = fin_summary_data['TotalNonCurrentLiabilities'] if np.isnan(ld): ld = fin_summary_data['TotalLiabilities'] if np.isnan(ld): return None ld *= 10000.0 # pe为优先股账面价值, 对于A股pe设置为0 pe = 0.0 # 读取个股市值数据 lncap_path = os.path.join(factor_ct.FACTOR_DB.db_path, risk_ct.LNCAP_CT.db_file) lncap_factor_loading = Utils.read_factor_loading( lncap_path, Utils.datetimelike_to_str(calc_date, dash=False), code) if lncap_factor_loading.empty: return None me = np.exp(lncap_factor_loading['factorvalue']) # mlev = (me + pe + ld)/me mlev = (me + pe + ld) / me return pd.Series([code, mlev], index=['code', 'mlev'])
def _calc_factor_loading(cls, code, calc_date): """ 计算指定日期、指定个股BLEV因子载荷 Parameters: -------- :param code: str 个股代码, 如SH600000, 600000 :param calc_date: datetime-like, str 计算日期, 格式: YYYY-MM-DD :return: pd.Series -------- 个股的BLEV因子载荷 0. code 1. blev 如果计算失败, 返回None """ code = Utils.code_to_symbol(code) report_date = Utils.get_fin_report_date(calc_date) # 读取个股最新财务报表摘要数据 fin_summary_data = Utils.get_fin_summary_data(code, report_date) if fin_summary_data is None: return None be = fin_summary_data['TotalShareholderEquity'] if np.isnan(be): return None if abs(be) < utils_con.TINY_ABS_VALUE: return None ld = fin_summary_data['TotalNonCurrentLiabilities'] if np.isnan(ld): ld = fin_summary_data['TotalLiabilities'] if np.isnan(ld): return None pe = 0 # blev = (be + pe + ld) / be blev = (be + pe + ld) / be return pd.Series([code, blev], index=['code', 'blev'])