def loop_back(code: str, begin: date, parameters: tuple) -> tuple: mongo = Mongo() dic = mongo.load_info(code) name, typ = dic['name'], dic['type'] print(name, typ) name = '{}({})'.format(name if len(name) <= 10 else name[: 8] + '..', code[4:]) if typ in ['指数型', 'QDII'] and parameters[1]: # as exp ≠ 0 dic = mongo.get_threshold(code[4:]) index, refer, thr = dic['_id'], dic['参考指标'], dic['低估'] parameters += (thr, refer) print(parameters) df = mongo.load_valuation([index]) df = df.rename({index: 'valuation'}, axis=1) else: df = mongo.load_close_price('sh000985') # use '中证全指' as valuation df = df.rename({'close': 'valuation'}, axis=1) df['date'] = pd.to_datetime(df['date']) # print(df[(df['date'] > begin) & (df['date'].dt.dayofweek == 1)]) df2 = mongo.load_close_price(code) # print(df2[(df2['date'] > begin) & (df2['date'].dt.dayofweek == 1)]) df = pd.merge(df, df2, on='date', how='outer') df = df.sort_values('date') df.fillna(method='ffill', inplace=True) # fill NaN with previous value df.fillna({'close': 1.0}, inplace=True) # no previous value, fill with 1.0 weekday = 1 # choose Tuesday, Mon: 0, Tue: 1, ... Sun: 6 df = df[(df['date'] > begin) & (df['date'].dt.dayofweek == weekday)] # print(df) df['每期定投金额'] = df.apply(lambda x: increment(x, *parameters), axis=1) df['累计定投金额'] = df['每期定投金额'].cumsum() fee_rate = 0.001 df['每期持仓数量'] = df['每期定投金额'] / df['close'] * (1 - fee_rate) df['累计持仓数量'] = df['每期持仓数量'].cumsum() df['累计持仓净值'] = df['close'] * df['累计持仓数量'] df['现金流'] = - df['每期定投金额'] m = df.shape[0] # number of row cumulative_amount = df.iloc[m - 1, df.columns.get_loc('累计定投金额')] cumulative_net = df.iloc[m - 1, df.columns.get_loc('累计持仓净值')] hold_gain = cumulative_net - cumulative_amount df.iloc[m - 1, df.columns.get_loc('现金流')] += cumulative_net return_rate = xirr(df, 'date', '现金流') df = df.rename({'累计持仓净值': name}, axis=1).set_index('date') df = df.sort_index() df.index.name = None # print(df) return (name, cumulative_amount, cumulative_net, hold_gain, return_rate), df[['累计定投金额', name]]
def get_scale(code: str, mongo=None) -> tuple: if not mongo: mongo = Mongo() name = mongo.load_info(code)['name'] scale = mongo.load_indicator(code)['total_tna'] return name, scale