def expr_div_ave_y(a, b): ''' name = a/ ((b1 + b2)/2) ''' return Div( Get(a, period='y'), Div(Sum(Get(b, period='y'), Before(Get(b, period='y'), past_year=1)), Value(2)))
def test_cash_flow_free_y(self): m = inv.cashflow_free_y().expr v = m.eval(self.stock, 2019, 1) s1 = Get('n_cashflow_act', period='y').eval(self.stock, 2019, 1) s2 = Get('c_pay_acq_const_fiolta', period='y').eval(self.stock, 2019, 1) self.assertEqual(s1-s2, v)
def test_interest_bearing_liab_y(self): v = balance_sheet.interest_bearing_liab_y().expr.eval( self.stock, 2019, 1) s1 = Get('lt_borr', period='y').eval(self.stock, 2019, 1) s2 = Get('st_borr', period='y').eval(self.stock, 2019, 1) s3 = Get('bond_payable', period='y').eval(self.stock, 2019, 1) s4 = Get('lt_payable', period='y').eval(self.stock, 2019, 1) s5 = Get('non_cur_liab_due_1y', period='y').eval(self.stock, 2019, 1) self.assertEqual(s1 + s2 + s3 + s4 + s5, v)
def test_net_operating_cycle(self): m = op.net_operating_cycle().expr v = m.eval(self.stock, 2019, 1) s1 = Get('f_days_inventory_y').eval(self.stock, 2019, 1) s2 = Get('f_days_accounts_receiv_y', period='y').eval(self.stock, 2019, 1) s3 = Get('f_days_prepayment_y', period='y').eval(self.stock, 2019, 1) s4 = Get('f_days_acct_payable_y', period='y').eval(self.stock, 2019, 1) s5 = Get('f_days_adv_receipts_y', period='y').eval(self.stock, 2019, 1) self.assertEqual(s1 + s2 + s3 - s4 - s5, v)
def metrics_ratio(name: str, a: str, b: str, display: str, period: str = None): '''name = a / b Arg: period: y ''' if period == 'y': return MetricsMeta(f'{name}_y.r', Div(Get(f'{a}_y'), Get(f'{b}_y')), display=display) return MetricsMeta(f'{name}.r', Div(Get(a), Get(b)), display=display)
def test_cumulative(self): class StockStub(ExprCtx): def get_metrics(self, name: str, year: int, quarter: int): return 1 stock = StockStub() get = Get('cumulative') v = get.eval(stock, 2019, 1) self.assertEqual(1, v) print(get, '\r\n')
def test_f_revenue_q_r_y2y(self): m = income.revenue_q_r_y2y() # (2019.1 - 2018.1)/2018.1 v = m.expr.eval(self.stock, 2019, 1) s1 = Get('revenue').eval(self.stock, 2019, 1) s2 = Get('revenue').eval(self.stock, 2018, 1) self.assertEqual((s1 - s2) / s2, v) # (2019.4 - 2018.4)/2018.4 v = m.expr.eval(self.stock, 2019, 4) self.assertEqual((8 - 4) / 4, v)
def test_f_income_attr_p_q_r_y2y(self): m = income.income_attr_p_q_r_y2y() # (2019.1 - 2018.1)/2018.1 v = m.expr.eval(self.stock, 2019, 1) s1 = Get('n_income_attr_p').eval(self.stock, 2019, 1) s2 = Get('n_income_attr_p').eval(self.stock, 2018, 1) self.assertEqual((s1 - s2) / s2, v) # (2019.4 - 2018.4)/2018.4 v = m.expr.eval(self.stock, 2019, 4) s1 = Get('n_income_attr_p').eval(self.stock, 2019, 4) s2 = Get('n_income_attr_p').eval(self.stock, 2018, 4) self.assertEqual((s1 - s2) / s2, v)
def test_increment_q4(self): class StockStub(ExprCtx): def get_metrics(self, name: str, year: int, quarter: int): if year == 2019 and quarter == 4: return 3 elif year == 2019 and quarter == 3: return 1 stock = StockStub() get = Get('increment', increment=True) v = get.eval(stock, 2019, 4) self.assertEqual(2, v) print(get, '\r\n')
def test_income_attr_p_ttm(self): m = income.income_attr_p_ttm() # (2019.1 - 2018.1)/2018.1 v = m.expr.eval(self.stock, 2019, 1) s1 = Get('n_income_attr_p', increment=True, var_type='f').eval(self.stock, 2019, 1) s2 = Get('n_income_attr_p', increment=True, var_type='f').eval(self.stock, 2018, 4) s3 = Get('n_income_attr_p', increment=True, var_type='f').eval(self.stock, 2018, 3) s4 = Get('n_income_attr_p', increment=True, var_type='f').eval(self.stock, 2018, 2) self.assertEqual(s1 + s2 + s3 + s4, v)
def test_q10(self): class StockStub(ExprCtx): d = { 2016: {4: -5}, 2017: {1: -1, 2: -2, 3: -3, 4: -4}, 2018: {1: -1, 2: -2, 3: -3, 4: -4}, 2019: {1: 1} } def get_metrics(self, name: str, year: int, quarter: int): return self.d[year][quarter] stock = StockStub() rg = Range(Get('m'), quarter_count=10) v = rg.eval(stock, 2019, 1) self.assertEqual(10, len(v)) self.assertEqual(1, v[0]) self.assertEqual(-4, v[1]) self.assertEqual(-3, v[2]) self.assertEqual(-2, v[3]) self.assertEqual(-1, v[4]) self.assertEqual(-4, v[5]) self.assertEqual(-3, v[6]) self.assertEqual(-2, v[7]) self.assertEqual(-1, v[8]) self.assertEqual(-5, v[9])
def test_past_q3_current_year(self): class StockStub(ExprCtx): def get_metrics(self, name: str, year: int, quarter: int): d = {2019: {1: 1}} return d[year][quarter] stock = StockStub() past = Before(Get('m'), past_quarter=3) v = past.eval(stock, 2019, 4) self.assertEqual(1, v) print(past, '\r\n')
def test_past_year(self): class StockStub(ExprCtx): def get_metrics(self, name: str, year: int, quarter: int): d = {2017: {4: 4}} return d[year][quarter] stock = StockStub() past = Before(Get('m'), past_year=1) v = past.eval(stock, 2019, 1) self.assertEqual(4, v) print(past, '\r\n')
def test_q1(self): class StockStub(ExprCtx): def get_metrics(self, name: str, year: int, quarter: int): if year == 2019 and quarter == 1: return 1 stock = StockStub() rg = Range(Get('m'), quarter_count=1) v = rg.eval(stock, 2019, 1) self.assertEqual(1, len(v)) self.assertEqual(1, v[0]) print(rg, '\r\n')
def test_q2(self): class StockStub(ExprCtx): d = { 2019: {1: 1, 2: 2} } def get_metrics(self, name: str, year: int, quarter: int): return self.d[year][quarter] stock = StockStub() rg = Range(Get('m'), quarter_count=2) v = rg.eval(stock, 2019, 2) self.assertEqual(2, len(v)) self.assertEqual(2, v[0]) self.assertEqual(1, v[1])
def test_q5(self): class StockStub(ExprCtx): d = { 2018: {4: -4}, 2019: {1: 1, 2: 2, 3: 3, 4: 4} } def get_metrics(self, name: str, year: int, quarter: int): return self.d[year][quarter] stock = StockStub() rg = Range(Get('m'), quarter_count=5) v = rg.eval(stock, 2019, 4) self.assertEqual(5, len(v)) self.assertEqual(4, v[0]) self.assertEqual(3, v[1]) self.assertEqual(2, v[2]) self.assertEqual(1, v[3]) self.assertEqual(-4, v[4])
def test_days_acct_payable_y(self): m = op.days_acct_payable_y().expr v = m.eval(self.stock, 2019, 1) s1 = Get('f_acct_payable_ave_y').eval(self.stock, 2019, 1) s2 = Get('oper_cost', period='y').eval(self.stock, 2019, 1) self.assertEqual(360 * s1 / s2, v)
def expr_div_ave(a, b, past_quarter): ''' name = a/ ((b1 + b2)/2) ''' return Div(Get(a), Div(Sum(Get(b), Before(Get(b), past_quarter)), Value(2)))
def expr_for_past(expr: Expr, *names: str): return expr([Get(name) for name in names])
def metrics_r_y2y(name: str, display: str): '''季度累计同比增长率''' return MetricsMeta(f'{name}.r_y2y', Div(Get(f'{name}.y2y'), Before(Get(name), past_quarter=4)), display=display)
def metrics_y_r_y2y(name: str, display: str): '''年度同比增长率''' return MetricsMeta(f'{name}_y.r_y2y', Div(Get(f'{name}_y.y2y'), Before(Get(f'{name}_y'), past_year=1)), display=display)
def metrics_y_y2y(name: str, display: str): '''年度同比增长值''' name_y = f'{name}_y' return MetricsMeta(f'{name}_y.y2y', Sub(Get(name_y), Before(Get(name_y), past_year=1)), display=display)
def test_inventories_y_y2y(self): v = balance_sheet.inventories_q_y2y().expr.eval(self.stock, 2019, 1) s1 = Get('inventories').eval(self.stock, 2018, 4) s2 = Get('inventories').eval(self.stock, 2018, 4) self.assertEqual(s1 - s2, v)
def test_days_adv_receipts_y(self): m = op.days_adv_receipts_y().expr v = m.eval(self.stock, 2019, 1) s1 = Get('f_adv_receipts_ave_y').eval(self.stock, 2019, 1) s2 = Get('c_fr_sale_sg', period='y').eval(self.stock, 2019, 1) self.assertEqual(360 * s1 / s2, v)
def test_quick_ratio_y(self): v = balance_sheet.quick_ratio_y().expr.eval(self.stock, 2019, 1) s1 = Get('f_quick_y').eval(self.stock, 2019, 1) s2 = Get('total_cur_liab', period='y').eval(self.stock, 2019, 1) self.assertEqual(s1 / s2, v)
def test_accounts_receiv_y_y2y(self): v = balance_sheet.accounts_receiv_y_y2y().expr.eval( self.stock, 2019, 1) s1 = Get('accounts_receiv').eval(self.stock, 2018, 4) s2 = Get('accounts_receiv').eval(self.stock, 2017, 4) self.assertEqual(s1 - s2, v)
def test_quick_y(self): v = balance_sheet.quick_y().expr.eval(self.stock, 2019, 1) s1 = Get('total_cur_assets', period='y').eval(self.stock, 2019, 1) s2 = Get('inventories', period='y').eval(self.stock, 2019, 1) s3 = Get('prepayment', period='y').eval(self.stock, 2019, 1) self.assertEqual(s1 - s2 - s3, v)
def metrics_y(name: str, display: str): '''年度值''' return MetricsMeta(f'{name}_y', Get(name, period='y'), display=display)
def test_assets_liab_ratio_y(self): v = balance_sheet.assets_liab_ratio_y().expr.eval(self.stock, 2019, 1) s1 = Get('total_liab', period='y').eval(self.stock, 2019, 1) s2 = Get('f_total_assets_y', period='y').eval(self.stock, 2019, 1) self.assertEqual(s1 / s2, v)