Example #1
0
 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'])
Example #2
0
    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'])
Example #3
0
 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'])
Example #4
0
    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'])
Example #5
0
    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'])