예제 #1
0
def TotalAssetTurnBias(beg_date, end_date):

    # 总资产周转率环减
    # 因子说明:当季度(营业收入TTM / 总资产加权)- 本季度(营业收入TTM / 总资产加权)
    # TTM 为统一财报期

    # param
    #################################################################################
    factor_name = 'TotalAssetTurnBias'
    ipo_num = 90

    # read data
    #################################################################################

    income_q = Stock().get_factor_h5("OperatingIncome", None, 'primary_mfc')
    total_asset = Stock().get_factor_h5("TotalAsset", None, 'primary_mfc')
    total_asset = StockFactorOperate().change_single_quarter_to_ttm_quarter(total_asset)
    total_asset /= 4.0

    turnover = income_q.div(total_asset)
    turnover_qoq = turnover.T.diff().T
    turnover_qoq = StockFactorOperate().change_quarter_to_daily_with_report_date(turnover_qoq, beg_date, end_date)

    # code set & date set
    #################################################################################
    pass

    res = turnover_qoq.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #2
0
파일: PEG.py 프로젝트: rlcjj/quant
def PEG(beg_date, end_date):
    """
    因子说明:PE_TTM / 净利润增长速度

    当两者都是负数的时候 结果也为负数
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'PEG'
    ipo_num = 90

    # read data
    #################################################################################
    net_profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc")
    net_profit = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        net_profit).T
    net_profit_4 = net_profit.shift(4)
    net_profit_g = net_profit / net_profit_4 - 1.0
    net_profit_g_mean = net_profit_g.rolling(window=4).median().T

    report_data = Stock().get_factor_h5("NetProfit" + "Daily", "ReportDate",
                                        'primary_mfc')
    net_profit_g_mean = StockFactorOperate().\
        change_quarter_to_daily_with_disclosure_date(net_profit_g_mean, report_data, beg_date, end_date)

    pe_ttm = Stock().get_factor_h5("PE_ttm", None, "primary_mfc")

    [pe_ttm, net_profit_g_mean
     ] = Stock().make_same_index_columns([pe_ttm, net_profit_g_mean])

    pe_ttm_negative = pe_ttm < 0.0
    net_profit_g_mean_negative = net_profit_g_mean < 0.0
    double_negative = pe_ttm_negative & net_profit_g_mean_negative
    peg = pe_ttm.div(net_profit_g_mean)
    peg[double_negative] = -peg[double_negative]

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = peg.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #3
0
def CFNOTTMIncomeTTMYOYDaily(beg_date, end_date):
    """
    因子说明: 经营活动现金净流量(TTM)/营业收入(TTM)  同比增速
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'CFNOTTMIncomeTTMYOYDaily'
    ipo_num = 90

    # read data
    #################################################################################
    operate_cash = Stock().get_factor_h5("NetOperateCashFlow", None,
                                         "primary_mfc")
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc")

    operate_cash_ttm = StockFactorOperate(
    ).change_single_quarter_to_ttm_quarter(operate_cash)
    income_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        income)

    [operate_cash_ttm, income_ttm
     ] = Stock().make_same_index_columns([operate_cash_ttm, income_ttm])
    ratio = operate_cash_ttm.div(income_ttm).T
    ratio_4 = ratio.shift(4)
    ratio_yoy = ratio / ratio_4 - 1.0
    ratio_yoy = ratio_yoy.T

    report_data = Stock().get_factor_h5("OperatingIncome" + "Daily",
                                        "ReportDate", 'primary_mfc')
    ratio_yoy = StockFactorOperate(
    ).change_quarter_to_daily_with_disclosure_date(ratio_yoy, report_data,
                                                   beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data
    #################################################################################

    res = ratio_yoy.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #4
0
    def get_negative_income_ttm_stock_date(self, date):
        """ 股票池 营业收入TTM为负数的股票 """

        path = StockFactorData().get_h5_path("mfc_primary")
        data = StockFactorData().read_factor_h5(
            factor_name="OperatingIncomeTotal", path=path)
        data_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(
            data)

        quarter_date = Date().get_last_stock_quarter_date(date)

        data_date = pd.DataFrame(data_ttm[quarter_date])
        data_date = data_date.dropna()
        data_date = data_date[data_date[quarter_date] < 0.0]

        filter_stock_list = list(set(data_date.index))
        filter_stock_list.sort()

        name = "NegativeIncomeTTMStockPool"
        sub_path = os.path.join(self.data_path_forbid_pool, name)
        file = os.path.join(sub_path, "%s_%s.csv" % (name, date))

        if not os.path.exists(sub_path):
            os.makedirs(sub_path)

        data_pd = pd.DataFrame([], index=filter_stock_list, columns=[name])
        data_pd.loc[filter_stock_list, name] = data_date.loc[filter_stock_list,
                                                             quarter_date]
        data_pd.to_csv(file)

        return filter_stock_list
예제 #5
0
def AverageHolder(beg_date, end_date):

    """
    因子说明:户均持股比例
    就是持股户数的倒数
    去掉新股和未上市企业
    按照统一的季报日期
    在wind查证 户均持股比例应该是不定期公布的 并不一定是季度公布的数据 603978.SH

    """

    # param
    #################################################################################
    factor_name = 'AverageHolder'
    ipo_num = 90

    # read data
    #################################################################################
    holder = Stock().get_factor_h5("HolderAvgPct", None, "primary_mfc")
    holder = StockFactorOperate().change_quarter_to_daily_with_report_date(holder, beg_date, end_date)
    # ipo = Stock().get_factor_h5("ipo_normal_days", None, "primary_dfc")

    # data precessing
    #################################################################################
    # [holder, ipo] = Stock().make_same_index_columns([holder, ipo])
    # holder[~(ipo > ipo_num)] = np.nan
    # holder[holder > 1.0] = np.nan

    res = holder.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #6
0
def NetProfitDeductedYOYDaily(beg_date, end_date):
    """
    因子说明: 扣除非经常损益归属母公司股东的净利润 的同比增长率
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'NetProfitDeductedYOYDaily'
    ipo_num = 90

    # read data
    #################################################################################
    netprofit_yoy = Stock().get_factor_h5("YoyNetProfit_Deducted", None,
                                          "primary_mfc")

    report_data = Stock().get_factor_h5("OperatingIncomeDaily", "ReportDate",
                                        'primary_mfc')
    netprofit_yoy = StockFactorOperate(
    ).change_quarter_to_daily_with_disclosure_date(netprofit_yoy, report_data,
                                                   beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################
    res = netprofit_yoy.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #7
0
def CFNOYOY(beg_date, end_date):

    """
    因子说明: 经营活动产生的现金流量净额(同比增长率)
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'CFNOYOY'
    ipo_num = 90

    # read data
    #################################################################################
    operate_cash_yoy = Stock().get_factor_h5("NetOperateCashFlowYoY", None, "primary_mfc")
    operate_cash_yoy = StockFactorOperate().change_quarter_to_daily_with_report_date(operate_cash_yoy, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = operate_cash_yoy.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #8
0
def CashMarketValue(beg_date, end_date):
    """
    因子说明: 货币资金/总市值, 根据最新财报更新数据
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'CashMarketValue'
    ipo_num = 90

    # read data
    #################################################################################
    cash = Stock().get_factor_h5("CashEquivalents", None, "primary_mfc")
    total_mv = Stock().get_factor_h5("TotalMarketValue", None, "alpha_dfc")

    cash = StockFactorOperate().change_quarter_to_daily_with_report_date(
        cash, beg_date, end_date)

    [cash, total_mv] = Stock().make_same_index_columns([cash, total_mv])
    cash_price = cash.div(total_mv)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = cash_price.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #9
0
def RetainMarketValue(beg_date, end_date):
    """
    因子说明: 留存收益 / 总市值
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'RetainMarketValue'
    ipo_num = 90

    # read data
    #################################################################################
    retain = Stock().get_factor_h5("RetainedEarnings", None, "primary_mfc")
    mv = Stock().get_factor_h5("TotalMarketValue", None, "alpha_dfc")
    retain = StockFactorOperate().change_quarter_to_daily_with_report_date(
        retain, beg_date, end_date)
    [retain, mv] = Stock().make_same_index_columns([retain, mv])

    retain_ratio = retain.div(mv)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = retain_ratio.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #10
0
파일: NetProfitYOY.py 프로젝트: rlcjj/quant
def NetProfitYOY(beg_date, end_date):
    """
    因子说明: 当季净利润的同比增长
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'NetProfitYOY'
    ipo_num = 90

    # read data
    #################################################################################
    net_profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc").T
    net_profit_4 = net_profit.shift(4)
    netprofit_yoy = net_profit / net_profit_4 - 1.0

    netprofit_yoy = netprofit_yoy.T
    netprofit_yoy = StockFactorOperate(
    ).change_quarter_to_daily_with_report_date(netprofit_yoy, beg_date,
                                               end_date)
    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = netprofit_yoy.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #11
0
def EBITIncomeBias(beg_date, end_date):
    """
    因子说明: 息税前利润/营业总收入 环比增长率
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'EBITIncomeBias'
    ipo_num = 90

    # read data
    #################################################################################
    ebit = Stock().get_factor_h5("EBIT", None, "primary_mfc")
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc")
    [income, ebit] = Stock().make_same_index_columns([income, ebit])
    margin = ebit.div(income).T
    margin = margin.diff().T

    margin = StockFactorOperate().change_quarter_to_daily_with_report_date(
        margin, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################
    res = margin.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #12
0
def NetprofitYOYBiasDaily(beg_date, end_date):
    """
    因子说明:当季 净利润 同比增长 的 环减值
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'NetprofitYOYBiasDaily'
    ipo_num = 90

    # read data
    #################################################################################
    profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc").T
    profit_4 = profit.shift(4)
    profit_yoy = profit / profit_4 - 1.0
    profit_yoy_speed = profit_yoy.diff().T
    report_data = Stock().get_factor_h5("NetProfit" + "Daily", "ReportDate",
                                        'primary_mfc')
    profit_yoy_speed = StockFactorOperate().\
        change_quarter_to_daily_with_disclosure_date(profit_yoy_speed, report_data, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = profit_yoy_speed.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #13
0
def ARAPIncomeTTM(beg_date, end_date):
    """
    因子说明:(预收账款 + 应付账款) / 营业总收入 TTM
    最近一期财报 实时更新
    若有一个为负值 结果为负值
    """

    # param
    #################################################################################
    factor_name = 'ARAPIncomeTTM'
    ipo_num = 90

    # read data
    #################################################################################
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc")
    advance = Stock().get_factor_h5("AdvanceReceipts", None, "primary_mfc")
    payable = Stock().get_factor_h5("AccountsPayable", None, "primary_mfc")

    # data precessing
    #################################################################################
    [advance, payable,
     income] = Stock().make_same_index_columns([advance, payable, income])

    add = advance.add(payable)
    ratio = add.div(income)
    ratio = StockFactorOperate().change_quarter_to_daily_with_report_date(
        ratio, beg_date, end_date)

    res = ratio.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #14
0
def AverageHolderDaily(beg_date, end_date):

    """
    因子说明:户均持股比例
    就是持股户数的倒数
    去掉新股和未上市企业
    按照披露日期
    """

    # param
    #################################################################################
    factor_name = 'AverageHolderDaily'
    ipo_num = 90

    # read data
    #################################################################################
    holder = Stock().get_factor_h5("HolderAvgPct", None, "primary_mfc")
    report_data = Stock().get_factor_h5("OperatingIncomeDaily", "ReportDate", 'primary_mfc')
    holder = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(holder, report_data, beg_date, end_date)
    # ipo = Stock().get_factor_h5("ipo_normal_days", None, "primary_dfc")

    # data precessing
    #################################################################################
    # [holder, ipo] = Stock().make_same_index_columns([holder, ipo])

    res = holder.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #15
0
파일: NetProfitQOQ.py 프로젝트: rlcjj/quant
def NetProfitQOQ(beg_date, end_date):
    """
    因子说明: 净利润环比增长率
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'NetProfitQOQ'
    ipo_num = 90

    # read data
    #################################################################################
    netprofit = Stock().get_factor_h5("NetProfit", None, "primary_mfc").T
    netprofit_1 = netprofit.shift(1)
    netprofit_qoq = netprofit.div(netprofit_1) - 1.0
    netprofit_qoq = netprofit_qoq.T

    netprofit_qoq = StockFactorOperate(
    ).change_quarter_to_daily_with_report_date(netprofit_qoq, beg_date,
                                               end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################
    res = netprofit_qoq.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #16
0
def IncomeYOYDaily(beg_date, end_date):

    """
    因子说明: 当季营收的同比增长
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'IncomeYOYDaily'
    ipo_num = 90

    # read data
    #################################################################################
    net_profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc").T
    net_profit_4 = net_profit.shift(4)
    netprofit_yoy = net_profit / net_profit_4 - 1.0

    netprofit_yoy = netprofit_yoy.T
    report_data = Stock().get_factor_h5("NetProfit" + "Daily", "ReportDate", 'primary_mfc')
    netprofit_yoy = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(netprofit_yoy, report_data, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = netprofit_yoy.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #17
0
def GrossProfitTTMMarketValueDaily(beg_date, end_date):
    """
    因子说明: 毛利润TTM/总市值
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'GrossProfitTTMMarketValueDaily'
    ipo_num = 90

    # read data
    #################################################################################
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc")
    cost = Stock().get_factor_h5("OperatingCost", None, "primary_mfc")
    total_mv = Stock().get_factor_h5("TotalMarketValue", None, "alpha_dfc")

    [income, cost] = Stock().make_same_index_columns([income, cost])
    gross_profit = income - cost

    report_data = Stock().get_factor_h5("OperatingIncome" + "Daily",
                                        "ReportDate", 'primary_mfc')
    gross_profit = StockFactorOperate(
    ).change_quarter_to_daily_with_disclosure_date(gross_profit, report_data,
                                                   beg_date, end_date)

    [total_mv,
     gross_profit] = Stock().make_same_index_columns([total_mv, gross_profit])
    total_mv /= 100000000

    ratio = gross_profit.div(total_mv)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = ratio.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #18
0
def GrossProfitRateBiasDaily(beg_date, end_date):
    """
    因子说明:当季 毛利率TTM - 上季度 毛利率TTM
    毛利率TTM = (营业收入TTM - 营业成本TTM)/ 营业收入TTM
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'GrossProfitRateBiasDaily'
    ipo_num = 90

    # read data
    #################################################################################
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc")
    cost = Stock().get_factor_h5("OperatingCost", None, "primary_mfc")
    income_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        income).T
    cost_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        cost).T

    gross_margin = (income_ttm - cost_ttm) / cost_ttm

    gross_margin_qoq = gross_margin.diff().T

    report_data = Stock().get_factor_h5("OperatingCost" + "Daily",
                                        "ReportDate", 'primary_mfc')
    gross_margin_qoq = StockFactorOperate().\
        change_quarter_to_daily_with_disclosure_date(gross_margin_qoq, report_data, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = gross_margin_qoq.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #19
0
def ROATTMDaily(beg_date, end_date):
    """
    因子说明: ROA
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'ROATTMDaily'
    ipo_num = 90

    # read data
    #################################################################################
    net_profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc")
    asset = Stock().get_factor_h5("TotalAsset", None, "primary_mfc")
    net_profit_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        net_profit)
    asset = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        asset) / 4.0

    [net_profit_ttm,
     asset] = Stock().make_same_index_columns([net_profit_ttm, asset])
    roa = net_profit_ttm.div(asset)

    report_data = Stock().get_factor_h5("NetProfit" + "Daily", "ReportDate",
                                        'primary_mfc')
    roa = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(
        roa, report_data, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = roa.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #20
0
def CFNOTTMTotalDebt(beg_date, end_date):
    """
    因子说明: 经营活动现金净流量(TTM)/负债合计, 根据最新财报更新数据
    披露日期 为 最近财报
    总负债可能是负值 000637.SZ 20120331 应交税费为负值 导致整体负债为负值
    """

    # param
    #################################################################################
    factor_name = 'CFNOTTMTotalDebt'
    ipo_num = 90

    # read data
    #################################################################################
    operate_cash = Stock().get_factor_h5("NetOperateCashFlow", None,
                                         "primary_mfc")
    total_liability = Stock().get_factor_h5("TotalLiability", None,
                                            "primary_mfc")
    operate_cash = StockFactorOperate().change_single_quarter_to_ttm_quarter(
        operate_cash) / 4

    [operate_cash, total_liability
     ] = Stock().make_same_index_columns([operate_cash, total_liability])
    total_liability[total_liability < 0.0] = np.nan
    cfo_td = operate_cash.div(total_liability)

    cfo_td = StockFactorOperate().change_quarter_to_daily_with_report_date(
        cfo_td, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = cfo_td.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #21
0
파일: ROETTM.py 프로젝트: rlcjj/quant
def ROETTM(beg_date, end_date):

    """
    因子说明: ROE
    披露日期 为 统一财报季
    """

    # param
    #################################################################################
    factor_name = 'ROETTM'
    ipo_num = 90

    # read data
    #################################################################################
    net_profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc")
    holder = Stock().get_factor_h5("TotalShareHoldeRequity", None, "primary_mfc")
    net_profit_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(net_profit)
    holder_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(holder) / 4.0

    [net_profit_ttm, holder_ttm] = Stock().make_same_index_columns([net_profit_ttm, holder_ttm])
    roe = net_profit_ttm.div(holder_ttm)

    roe = StockFactorOperate().change_quarter_to_daily_with_report_date(roe, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = roe.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #22
0
def GrossProfitYOYDaily(beg_date, end_date):
    """
    因子说明: 当季毛利润的同比增长
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'GrossProfitYOYDaily'
    ipo_num = 90

    # read data
    #################################################################################
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc").T
    cost = Stock().get_factor_h5("OperatingCost", None, "primary_mfc").T
    [income, cost] = Stock().make_same_index_columns([income, cost])
    gross_profit = income - cost
    gross_profit_4 = gross_profit.shift(4)
    gross_profit_yoy = gross_profit / gross_profit_4 - 1.0

    gross_profit_yoy = gross_profit_yoy.T
    report_data = Stock().get_factor_h5("OperatingIncomeDaily", "ReportDate",
                                        'primary_mfc')
    gross_profit_yoy = StockFactorOperate(
    ).change_quarter_to_daily_with_disclosure_date(gross_profit_yoy,
                                                   report_data, beg_date,
                                                   end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = gross_profit_yoy.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #23
0
def ROEQuarterDaily(beg_date, end_date):
    """
    因子说明: ROE 单季
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'ROEQuarterDaily'
    ipo_num = 90
    beg_date = Date().get_trade_date_offset(beg_date, -250)

    # read data
    #################################################################################
    net_profit = Stock().get_factor_h5("NetProfit", None, "primary_mfc")
    holder = Stock().get_factor_h5("TotalShareHoldeRequity", None,
                                   "primary_mfc")

    [net_profit,
     holder] = Stock().make_same_index_columns([net_profit, holder])
    roe = net_profit.div(holder)

    report_data = Stock().get_factor_h5("NetProfit" + "Daily", "ReportDate",
                                        'primary_mfc')
    roe = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(
        roe, report_data, beg_date, end_date)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = roe.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #24
0
def EPQuarterDaily(beg_date, end_date):
    """
    因子说明: 当季净利润EP
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'EPQuarterDaily'
    ipo_num = 90

    # read data
    #################################################################################
    netprofit = Stock().get_factor_h5("NetProfit", None, "primary_mfc")
    total_mv = Stock().get_factor_h5("TotalMarketValue", None, "alpha_dfc")

    report_data = Stock().get_factor_h5("OperatingIncome" + "Daily",
                                        "ReportDate", 'primary_mfc')
    netprofit = StockFactorOperate(
    ).change_quarter_to_daily_with_disclosure_date(netprofit, report_data,
                                                   beg_date, end_date)

    [total_mv,
     netprofit] = Stock().make_same_index_columns([total_mv, netprofit])
    total_mv /= 100000000

    ratio = netprofit.div(total_mv)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################
    res = ratio.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #25
0
def cal_factor_barra_book_to_price(beg_date, end_date):
    """
    因子说明: 净资产/总市值, 根据最新财报更新数据
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    raw_factor_name = 'RAW_CNE5_BOOK_TO_PRICE'
    factor_name = "NORMAL_CNE5_BOOK_TO_PRICE"

    # read data
    #################################################################################
    holder = Stock().get_factor_h5("TotalShareHoldeRequity", None,
                                   "primary_mfc")
    total_mv = Stock().get_factor_h5("TotalMarketValue", None, "alpha_dfc")

    # data precessing
    #################################################################################
    report_data = Stock().get_factor_h5("OperatingIncome" + "Daily",
                                        "ReportDate", 'primary_mfc')
    holder = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(
        holder, report_data, beg_date, end_date)

    [holder, total_mv] = Stock().make_same_index_columns([holder, total_mv])
    holder_price = holder.div(total_mv)

    pb_data = holder_price.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(pb_data, raw_factor_name, 'barra_risk_dfc')
    pb_data = FactorPreProcess().remove_extreme_value_mad(pb_data)
    pb_data = FactorPreProcess().standardization_free_mv(pb_data)
    Stock().write_factor_h5(pb_data, factor_name, 'barra_risk_dfc')

    return pb_data
예제 #26
0
def BP(beg_date, end_date):

    """
    因子说明: 净资产/总市值, 根据最新财报更新数据
    披露日期 为 最近财报
    """

    # param
    #################################################################################
    factor_name = 'BP'
    ipo_num = 90

    # read data
    #################################################################################
    holder = Stock().get_factor_h5("TotalShareHoldeRequity", None, "primary_mfc")
    total_mv = Stock().get_factor_h5("TotalMarketValue", None, "alpha_dfc")

    report_data = Stock().get_factor_h5("OperatingIncome" + "Daily", "ReportDate", 'primary_mfc')
    holder = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(holder, report_data, beg_date, end_date)

    [holder, total_mv] = Stock().make_same_index_columns([holder, total_mv])
    holder_price = holder.div(total_mv)

    # data precessing
    #################################################################################
    pass

    # calculate data daily
    #################################################################################

    res = holder_price.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #27
0
def AdvanceReceiptsEquityDaily(beg_date, end_date):
    """
    因子说明:预收账款 / 净资产
    财报期 最近可以得到的最新财报
    若有一个为负值 结果为负值
    """

    # param
    #################################################################################
    factor_name = 'AdvanceReceiptsEquityDaily'
    ipo_num = 90

    # read data
    #################################################################################
    advance = Stock().get_factor_h5("AdvanceReceipts", None, "primary_mfc")
    equity = Stock().get_factor_h5("TotalShareHoldeRequity", None,
                                   "primary_mfc")
    report_data = Stock().get_factor_h5("OperatingIncomeDaily", "ReportDate",
                                        'primary_mfc')

    advance = StockFactorOperate(
    ).change_quarter_to_daily_with_disclosure_date(advance, report_data,
                                                   beg_date, end_date)
    equity = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(
        equity, report_data, beg_date, end_date)

    # data precessing
    #################################################################################
    [advance, equity] = Stock().make_same_index_columns([advance, equity])

    # calculate data daily
    #################################################################################
    date_series = Date().get_trade_date_series(beg_date, end_date)

    for i in range(0, len(date_series)):

        current_date = date_series[i]

        if current_date in advance.columns:
            advance_date = advance[current_date]
            equity_date = equity[current_date]
            print('Calculating factor %s at date %s' %
                  (factor_name, current_date))

            data_date = pd.concat([advance_date, equity_date], axis=1)
            data_date.columns = ['advance_date', 'equity_date']
            data_date = data_date.dropna()
            data_date = data_date[data_date['equity_date'] != 0.0]
            data_date[
                'ratio'] = data_date['advance_date'] / data_date['equity_date']

            # 只要有一个是负数 比例为负数
            mimus_index = (data_date['advance_date'] <
                           0.0) | (data_date['equity_date'] < 0.0)
            data_date.loc[mimus_index,
                          'ratio'] = -data_date.loc[mimus_index,
                                                    'ratio'].abs()
        else:
            print('Calculating factor %s at date %s is null' %
                  (factor_name, current_date))
            data_date = pd.DataFrame([],
                                     columns=["ratio"],
                                     index=advance.index)

        if i == 0:
            res = pd.DataFrame(data_date['ratio'].values,
                               columns=[current_date],
                               index=data_date.index)
        else:
            res_add = pd.DataFrame(data_date['ratio'].values,
                                   columns=[current_date],
                                   index=data_date.index)
            res = pd.concat([res, res_add], axis=1)

    res = res.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #28
0
def CFOTTMEVDaily(beg_date, end_date):

    """
    因子说明:经营性现金流入小计 TTM / 企业价值(剔除货币资金)
    TTM 为不同一财报期 最近可以得到的最新财报
    若有一个为负值 结果为负值
    """

    # param
    #################################################################################
    factor_name = 'CFOTTMEVDaily'
    ipo_num = 90

    # read data
    #################################################################################
    cfo = Stock().get_factor_h5("NetOperateCashFlow", None, "primary_mfc")
    cfo_ttm = StockFactorOperate().change_single_quarter_to_ttm_quarter(cfo)

    report_data = Stock().get_factor_h5("OperatingIncomeDaily", "ReportDate", 'primary_mfc')
    cfo_ttm = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(cfo_ttm, report_data, beg_date, end_date)

    ev = Stock().get_factor_h5("Ev2", None, "primary_mfc")

    # data precessing
    #################################################################################
    [cfo_ttm, ev] = Stock().make_same_index_columns([cfo_ttm, ev])

    # calculate data daily
    #################################################################################
    date_series = Date().get_trade_date_series(beg_date, end_date)

    for i in range(0, len(date_series)):

        current_date = date_series[i]

        if current_date in ev.columns:
            ev_date = ev[current_date]
            ttm_date = cfo_ttm[current_date]
            print('Calculating factor %s at date %s' % (factor_name, current_date))

            data_date = pd.concat([ttm_date, ev_date], axis=1)
            data_date.columns = ['ttm', 'ev']
            data_date['ev'] /= 100000000.0
            data_date = data_date.dropna()
            data_date = data_date[data_date['ev'] != 0.0]
            data_date['ratio'] = data_date['ttm'] / data_date['ev']

            # 只要有一个是负数 比例为负数
            mimus_index = (data_date['ev'] < 0.0) | (data_date['ttm'] < 0.0)
            data_date.loc[mimus_index, 'ratio'] = - data_date.loc[mimus_index, 'ratio'].abs()
        else:
            print('Calculating factor %s at date %s is null' % (factor_name, current_date))
            data_date = pd.DataFrame([], columns=["ratio"], index=ev.index)

        if i == 0:
            res = pd.DataFrame(data_date['ratio'].values, columns=[current_date], index=data_date.index)
        else:
            res_add = pd.DataFrame(data_date['ratio'].values, columns=[current_date], index=data_date.index)
            res = pd.concat([res, res_add], axis=1)

    res = res.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #29
0
파일: IncomeTTMEV.py 프로젝트: rlcjj/quant
def IncomeTTMEV(beg_date, end_date):

    """
    因子说明:营业总收入TTM / 企业价值(剔除货币资金)
    TTM 为统一财报期
    若有一个为负值 结果为负值
    """

    # param
    ################################################################################
    factor_name = "IncomeTTMEV"
    ipo_num = 90

    # read data
    #################################################################################
    operating_income = Stock().get_factor_h5("OperatingIncomeTotal", None, "primary_mfc")
    ev = Stock().get_factor_h5("Ev2", None, "primary_mfc")
    operating_income = StockFactorOperate().change_single_quarter_to_ttm_quarter(operating_income)
    operating_income = StockFactorOperate().change_quarter_to_daily_with_report_date(operating_income, beg_date, end_date)

    # data precessing
    #################################################################################
    [operating_income, ev] = Stock().make_same_index_columns([operating_income, ev])

    # calculate data daily
    #################################################################################
    date_series = Date().get_trade_date_series(beg_date, end_date)

    for i in range(0, len(date_series)):

        current_date = date_series[i]

        if current_date in ev.columns:
            ev_date = ev[current_date]
            operating_income_date = operating_income[current_date]
            print('Calculating factor %s at date %s' % (factor_name, current_date))

            data_date = pd.concat([operating_income_date, ev_date], axis=1)
            data_date.columns = ['income_ttm', 'ev']
            data_date['ev'] /= 100000000.0
            data_date = data_date.dropna()
            data_date = data_date[data_date['ev'] != 0.0]
            data_date['ratio'] = data_date['income_ttm'] / data_date['ev']

            # 只要有一个是负数 比例为负数
            mimus_index = (data_date['ev'] < 0.0) | (data_date['income_ttm'] < 0.0)
            data_date.loc[mimus_index, 'ratio'] = - data_date.loc[mimus_index, 'ratio'].abs()
        else:
            print('Calculating factor %s at date %s is null' % (factor_name, current_date))
            data_date = pd.DataFrame([], columns=["ratio"], index=ev.index)

        if i == 0:
            res = pd.DataFrame(data_date['ratio'].values, columns=[current_date], index=data_date.index)
        else:
            res_add = pd.DataFrame(data_date['ratio'].values, columns=[current_date], index=data_date.index)
            res = pd.concat([res, res_add], axis=1)

    res = res.T.dropna(how='all').T
    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res
예제 #30
0
def ROICTTMDaily(beg_date, end_date):

    """
    因子说明:(营业收入TTM - 营业成本TTM) / 全部投入资本
    TTM 为不同一财报期 最近可以得到的最新财报
    若有一个为负值 结果为负值
    """

    # param
    #################################################################################
    factor_name = "ROICTTMDaily"
    ipo_num = 90

    # read data
    #################################################################################
    cost = Stock().get_factor_h5("OperatingCost", None, "primary_mfc")
    income = Stock().get_factor_h5("OperatingIncome", None, "primary_mfc")
    investcapital = Stock().get_factor_h5("Investcapital", None, "primary_mfc")

    cost = StockFactorOperate().change_single_quarter_to_ttm_quarter(cost)
    income = StockFactorOperate().change_single_quarter_to_ttm_quarter(income)
    investcapital = StockFactorOperate().change_single_quarter_to_ttm_quarter(investcapital)
    investcapital /= 4.0

    report_data = Stock().get_factor_h5("OperatingIncomeDaily", "ReportDate", 'primary_mfc')
    cost = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(cost, report_data, beg_date, end_date)
    income = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(income, report_data, beg_date, end_date)
    investcapital = StockFactorOperate().change_quarter_to_daily_with_disclosure_date(investcapital, report_data, beg_date, end_date)



    # data precessing
    #################################################################################
    [cost, income, investcapital] = Stock().make_same_index_columns([cost, income, investcapital])

    # calculate data daily
    #################################################################################
    date_series = Date().get_trade_date_series(beg_date, end_date)

    for i in range(0, len(date_series)):

        current_date = date_series[i]

        if current_date in cost.columns:

            cost_date = cost[current_date]
            income_date = income[current_date]
            investcapital_date = investcapital[current_date]
            print('Calculating factor %s at date %s' % (factor_name, current_date))

            data_date = pd.concat([cost_date, income_date, investcapital_date], axis=1)
            data_date.columns = ['cost', 'income', 'investcapital']

            """ 这里本来应该对行业做一些调整
            filename = in_path[0:len(in_path)-13] + "DataSet\\industry_citic.txt"
            industry = pd.read_table(filename, index_col=[0], encoding='gbk', header=None)
            cost_industry = pd.concat([operating_cost_ttm, industry], axis=1)
            cost_industry.columns = ['value', 'industry']
            filter1 = cost_industry['industry'].map(lambda x: x in ['银行', '非银行金融'])
            filter2 = cost_industry['industry'].map(lambda x: x is np.nan)
            filter_total = filter1 & filter2
            cost_industry.ix[filter_total, 'value'] = 0.0
            operating_cost_ttm = pd.DataFrame(cost_industry['value'].values,
            index=cost_industry.index, columns=[curent_date])
            """

            data_date['diff'] = data_date['income'] - data_date['cost']
            data_date = data_date.dropna()
            data_date = data_date[data_date['investcapital'] != 0.0]
            data_date['ratio'] = data_date['diff'] / data_date['investcapital']

            # 只要有一个是负数 比例为负数
            mimus_index = (data_date['diff'] < 0.0) | (data_date['investcapital'] < 0.0)
            data_date.loc[mimus_index, 'ratio'] = - data_date.loc[mimus_index, 'ratio'].abs()
        else:
            print('Calculating factor %s at date %s is null' % (factor_name, current_date))
            data_date = pd.DataFrame([], columns=["ratio"], index=cost.index)

        if i == 0:
            res = pd.DataFrame(data_date['ratio'].values, columns=[current_date], index=data_date.index)
        else:
            res_add = pd.DataFrame(data_date['ratio'].values, columns=[current_date], index=data_date.index)
            res = pd.concat([res, res_add], axis=1)

    res = res.T.dropna(how='all').T

    # save data
    #############################################################################
    Stock().write_factor_h5(res, factor_name, "alpha_dfc")
    return res