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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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