예제 #1
0
파일: loopback.py 프로젝트: sunxiaoou/py
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]]
예제 #2
0
파일: loopback.py 프로젝트: sunxiaoou/py
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