def fc_update_nav(ctx, optid):

    lookback_days = 365
    blacklist = [24, 32, 40]
    factor_ids = [
        '1200000%02d' % i for i in range(1, 40) if i not in blacklist
    ]
    trade_dates = ATradeDate.month_trade_date(begin_date='2018-01-01')
    date = trade_dates[-1]

    start_date = (date -
                  datetime.timedelta(lookback_days)).strftime('%Y-%m-%d')
    end_date = date.strftime('%Y-%m-%d')
    corr0 = load_ind(factor_ids, start_date, end_date)
    res = clusterKMeansBase(corr0, maxNumClusters=10, n_init=100)
    asset_cluster = res[1]
    asset_cluster = dict(
        zip(sorted(asset_cluster), sorted(asset_cluster.values())))

    factor_name = base_ra_index.load()
    for k, v in asset_cluster.iteritems():
        v = np.array(v).astype('int')
        print factor_name.loc[v]

    assets = {}
    for factor_id in factor_ids:
        assets[factor_id] = Asset.load_nav_series(factor_id)
    df_assets = pd.DataFrame(assets)

    db = database.connection('asset')
    metadata = MetaData(bind=db)
    t = Table('ra_composite_asset_nav', metadata, autoload=True)

    for layer in asset_cluster.keys():
        layer_id = 'FC.000001.%d' % (layer + 1)
        layer_assets = asset_cluster[layer]
        layer_nav = df_assets.loc[:, layer_assets]
        layer_ret = layer_nav.pct_change().dropna()
        layer_ret = layer_ret.mean(1)
        layer_ret = layer_ret.reset_index()
        layer_ret.columns = ['ra_date', 'ra_inc']
        layer_ret['ra_nav'] = (1 + layer_ret['ra_inc']).cumprod()
        layer_ret['ra_asset_id'] = layer_id
        df_new = layer_ret.set_index(['ra_asset_id', 'ra_date'])
        df_old = asset_ra_composite_asset_nav.load_nav(layer_id)
        df_new = df_new.reindex(columns=['ra_nav', 'ra_inc'])
        database.batch(db, t, df_new, df_old, timestamp=False)
Пример #2
0
def allocate_benchmark_comp(ctx):
    index_ids = ['120000016', '120000010']
    data = {}
    for _id in index_ids:
        data[_id] = base_ra_index_nav.load_series(_id)
    df = pd.DataFrame(data)

    composite_asset_ids = [
        '20201', '20202', '20203', '20204', '20205', '20206', '20207', '20208'
    ]

    data = {}

    for _id in composite_asset_ids:
        nav = asset_ra_composite_asset_nav.load_nav(_id)
        nav = nav.reset_index()
        nav = nav[['ra_date', 'ra_nav']]
        nav = nav.set_index(['ra_date'])
        data[_id] = nav.ra_nav

    bench_df = pd.DataFrame(data)
    benchmark_df = pd.concat([bench_df, df],
                             axis=1,
                             join_axes=[bench_df.index])

    conn = MySQLdb.connect(**config.db_asset)
    conn.autocommit(True)

    dfs = []
    for i in range(0, 10):
        sql = 'select on_date as date, on_nav as nav from on_online_nav where on_online_id = 80000%d and on_type = 8' % i
        df = pd.read_sql(sql, conn, index_col=['date'], parse_dates=['date'])
        df.columns = ['risk_' + str(i)]
        dfs.append(df)

    df = pd.concat(dfs, axis=1)

    conn.close()

    df = pd.concat([df, benchmark_df], axis=1, join_axes=[df.index])
    df = df.fillna(method='pad')
    df = df.rename(
        columns={
            'risk_0': '风险10',
            'risk_1': '风险1',
            'risk_2': '风险2',
            'risk_3': '风险3',
            'risk_4': '风险4',
            'risk_5': '风险5',
            'risk_6': '风险6',
            'risk_7': '风险7',
            'risk_8': '风险8',
            'risk_9': '风险9',
            '20201': '风险2比较基准',
            '20202': '风险3比较基准',
            '20203': '风险4比较基准',
            '20204': '风险5比较基准',
            '20205': '风险6比较基准',
            '20206': '风险7比较基准',
            '20207': '风险8比较基准',
            '20208': '风险9比较基准',
            '120000016': '风险10比较基准',
            '120000010': '风险1比较基准'
        })
    cols = [
        '风险1', '风险2', '风险3', '风险4', '风险5', '风险6', '风险7', '风险8', '风险9', '风险10',
        '风险1比较基准', '风险2比较基准', '风险3比较基准', '风险4比较基准', '风险5比较基准', '风险6比较基准',
        '风险7比较基准', '风险8比较基准', '风险9比较基准', '风险10比较基准'
    ]
    df = df[cols]

    #df.to_csv('online_benchmark.csv', encoding='gbk')

    result_df = pd.DataFrame(columns=df.columns)
    last_day = df.index[-1]
    #print(last_day)
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 当日'] = df.pct_change().iloc[-1]
    result_df.loc[
        df.index[-1].strftime('%Y-%m-%d') +
        ' 过去一周'] = df.loc[last_day] / df.loc[last_day - timedelta(weeks=1)] - 1
    result_df.loc[
        df.index[-1].strftime('%Y-%m-%d') +
        ' 过去一月'] = df.loc[last_day] / df.loc[last_day - timedelta(days=31)] - 1
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 过去三个月'] = df.loc[last_day] / df.loc[last_day -
                                                        timedelta(days=91)] - 1
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 过去六个月'] = df.loc[last_day] / df.loc[last_day - timedelta(
                      days=182)] - 1
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 过去一年'] = df.loc[last_day] / df.loc[last_day -
                                                       timedelta(days=365)] - 1
    #result_df.to_csv('智能组合收益与比较基准收益比较.csv', encoding='gbk')

    df = result_df

    df = df.reset_index()
    df['date'] = pd.Series(None)
    df['statistics_type'] = pd.Series(None)
    df = df.apply(split_ct, axis=1)
    df.pop('index')
    df.set_index('date', inplace=True)
    cols_list = list(df.columns)
    cols_list.insert(0, cols_list.pop(-1))
    df = df[cols_list]

    if len(df) < 1:
        print("无数据需要插入")
        return
    # 开始注入数据
    engine = database.connection('asset')
    Session = sessionmaker(bind=engine)
    session = Session()

    for i in range(len(df)):
        ins = asset_allocate.smart_risk(sir_date=df.index[i],
                                        sir_statistics_type=df.iloc[i, 0],
                                        sir_risk1=df.iloc[i, 1],
                                        sir_risk2=df.iloc[i, 2],
                                        sir_risk3=df.iloc[i, 3],
                                        sir_risk4=df.iloc[i, 4],
                                        sir_risk5=df.iloc[i, 5],
                                        sir_risk6=df.iloc[i, 6],
                                        sir_risk7=df.iloc[i, 7],
                                        sir_risk8=df.iloc[i, 8],
                                        sir_risk9=df.iloc[i, 9],
                                        sir_risk10=df.iloc[i, 10],
                                        sir_risk1_standard=df.iloc[i, 11],
                                        sir_risk2_standard=df.iloc[i, 12],
                                        sir_risk3_standard=df.iloc[i, 13],
                                        sir_risk4_standard=df.iloc[i, 14],
                                        sir_risk5_standard=df.iloc[i, 15],
                                        sir_risk6_standard=df.iloc[i, 16],
                                        sir_risk7_standard=df.iloc[i, 17],
                                        sir_risk8_standard=df.iloc[i, 18],
                                        sir_risk9_standard=df.iloc[i, 19],
                                        sir_risk10_standard=df.iloc[i, 20])
        session.add(ins)
        session.commit()
        print("成功插入了 %d 条数据;" % (i + 1))
Пример #3
0
def allocate_benchmark_comp(ctx):

    index_ids = ['120000016', '120000010']
    data = {}
    for _id in index_ids:
        data[_id] = base_ra_index_nav.load_series(_id)
    df = pd.DataFrame(data)

    composite_asset_ids = [
        '20201', '20202', '20203', '20204', '20205', '20206', '20207', '20208'
    ]

    data = {}

    for _id in composite_asset_ids:
        nav = asset_ra_composite_asset_nav.load_nav(_id)
        nav = nav.reset_index()
        nav = nav[['ra_date', 'ra_nav']]
        nav = nav.set_index(['ra_date'])
        data[_id] = nav.ra_nav

    bench_df = pd.DataFrame(data)
    benchmark_df = pd.concat([bench_df, df],
                             axis=1,
                             join_axes=[bench_df.index])

    conn = MySQLdb.connect(**config.db_asset)
    conn.autocommit(True)

    dfs = []
    for i in range(0, 10):
        sql = 'select on_date as date, on_nav as nav from on_online_nav where on_online_id = 80000%d and on_type = 8' % i
        df = pd.read_sql(sql, conn, index_col=['date'], parse_dates=['date'])
        df.columns = ['risk_' + str(i)]
        dfs.append(df)

    df = pd.concat(dfs, axis=1)

    conn.close()

    df = pd.concat([df, benchmark_df], axis=1, join_axes=[df.index])
    df = df.fillna(method='pad')
    df = df.rename(
        columns={
            'risk_0': '风险10',
            'risk_1': '风险1',
            'risk_2': '风险2',
            'risk_3': '风险3',
            'risk_4': '风险4',
            'risk_5': '风险5',
            'risk_6': '风险6',
            'risk_7': '风险7',
            'risk_8': '风险8',
            'risk_9': '风险9',
            '20201': '风险2比较基准',
            '20202': '风险3比较基准',
            '20203': '风险4比较基准',
            '20204': '风险5比较基准',
            '20205': '风险6比较基准',
            '20206': '风险7比较基准',
            '20207': '风险8比较基准',
            '20208': '风险9比较基准',
            '120000016': '风险10比较基准',
            '120000010': '风险1比较基准'
        })
    cols = [
        '风险1', '风险2', '风险3', '风险4', '风险5', '风险6', '风险7', '风险8', '风险9', '风险10',
        '风险1比较基准', '风险2比较基准', '风险3比较基准', '风险4比较基准', '风险5比较基准', '风险6比较基准',
        '风险7比较基准', '风险8比较基准', '风险9比较基准', '风险10比较基准'
    ]
    df = df[cols]

    result_df = pd.DataFrame(columns=df.columns)
    last_day = df.index[-1]
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 当日'] = df.pct_change().iloc[-1]
    result_df.loc[
        df.index[-1].strftime('%Y-%m-%d') +
        ' 过去一周'] = df.loc[last_day] / df.loc[last_day - timedelta(weeks=1)] - 1
    result_df.loc[
        df.index[-1].strftime('%Y-%m-%d') +
        ' 过去一月'] = df.loc[last_day] / df.loc[last_day - timedelta(days=31)] - 1
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 过去三个月'] = df.loc[last_day] / df.loc[last_day -
                                                        timedelta(days=91)] - 1
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 过去六个月'] = df.loc[last_day] / df.loc[last_day - timedelta(
                      days=182)] - 1
    result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                  ' 过去一年'] = df.loc[last_day] / df.loc[last_day -
                                                       timedelta(days=365)] - 1
    result_df.to_csv('智能组合收益与比较基准收益比较.csv', encoding='gbk')
Пример #4
0
def allocate_benchmark_comp():

    index_ids = ['120000016', '120000010']
    data = {}
    for _id in index_ids:
        data[_id] = base_ra_index_nav.load_series(_id)
    df = pd.DataFrame(data)

    composite_asset_ids = [
        '20201', '20202', '20203', '20204', '20205', '20206', '20207', '20208'
    ]

    data = {}

    for _id in composite_asset_ids:
        nav = asset_ra_composite_asset_nav.load_nav(_id)
        nav = nav.reset_index()
        nav = nav[['ra_date', 'ra_nav']]
        nav = nav.set_index(['ra_date'])
        data[_id] = nav.ra_nav

    bench_df = pd.DataFrame(data)
    benchmark_df = pd.concat([bench_df, df],
                             axis=1,
                             join_axes=[bench_df.index])

    conn = MySQLdb.connect(**config.db_asset)
    conn.autocommit(True)

    dfs = []
    for i in range(0, 10):
        sql = 'select on_date as date, on_nav as nav from on_online_nav where on_online_id = 80000%d and on_type = 8' % i
        df = pd.read_sql(sql, conn, index_col=['date'], parse_dates=['date'])
        df.columns = ['risk_' + str(i)]
        dfs.append(df)

    df = pd.concat(dfs, axis=1)

    conn.close()

    df = pd.concat([df, benchmark_df], axis=1, join_axes=[df.index])
    df = df.fillna(method='pad')
    df = df.rename(
        columns={
            'risk_0': '风险10',
            'risk_1': '风险1',
            'risk_2': '风险2',
            'risk_3': '风险3',
            'risk_4': '风险4',
            'risk_5': '风险5',
            'risk_6': '风险6',
            'risk_7': '风险7',
            'risk_8': '风险8',
            'risk_9': '风险9',
            '20201': '风险2比较基准',
            '20202': '风险3比较基准',
            '20203': '风险4比较基准',
            '20204': '风险5比较基准',
            '20205': '风险6比较基准',
            '20206': '风险7比较基准',
            '20207': '风险8比较基准',
            '20208': '风险9比较基准',
            '120000016': '风险10比较基准',
            '120000010': '风险1比较基准'
        })
    cols = [
        '风险1', '风险2', '风险3', '风险4', '风险5', '风险6', '风险7', '风险8', '风险9', '风险10',
        '风险1比较基准', '风险2比较基准', '风险3比较基准', '风险4比较基准', '风险5比较基准', '风险6比较基准',
        '风险7比较基准', '风险8比较基准', '风险9比较基准', '风险10比较基准'
    ]
    df = df[cols]

    result_df = pd.DataFrame(columns=df.columns)
    last_day = df.index[-1]
    print(last_day)
    first_day = df.index[0]
    print(first_day)
    #result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 当日'] = df.pct_change().iloc[-1]
    #result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去一周'] = df.loc[last_day] / df.loc[last_day - timedelta(weeks = 1)] - 1
    #result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去一月'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 31)] - 1
    #result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去三个月'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 91)] - 1
    #result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去六个月'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 182)] - 1
    #result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去一年'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 365)] - 1

    # 非滚动战胜概率
    length = len(df) // 7
    #    length = len(df)//31
    #    length = len(df)//91
    #    length = len(df)//182
    #    length = len(df)//365
    k1 = 0
    k2 = 0
    k3 = 0
    k4 = 0
    k5 = 0
    k6 = 0
    k7 = 0
    k8 = 0
    k9 = 0
    k10 = 0
    days = df.index.values
    for i in range(length):
        num = -1 - i * 7
        #        num = -1 - i*31
        #        num = -1 - i*91
        #        num = -1 - i*182
        #        num = -1 - i*365
        last_day = pd.to_datetime(str(days[num]))
        result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                      ' 过去一周'] = df.loc[last_day] / df.loc[
                          last_day - timedelta(weeks=1)] - 1
        #       result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去一月'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 31)] - 1
        #       result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去三个月'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 91)] - 1
        #       result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去六个月'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 182)] - 1
        #       result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去一年'] = df.loc[last_day] / df.loc[last_day - timedelta(days = 365)] - 1
        if result_df['风险1'][0] > result_df['风险1比较基准'][0]:
            k1 += 1
        if result_df['风险2'][0] > result_df['风险2比较基准'][0]:
            k2 += 1
        if result_df['风险3'][0] > result_df['风险3比较基准'][0]:
            k3 += 1
        if result_df['风险4'][0] > result_df['风险4比较基准'][0]:
            k4 += 1
        if result_df['风险5'][0] > result_df['风险5比较基准'][0]:
            k5 += 1
        if result_df['风险6'][0] > result_df['风险6比较基准'][0]:
            k6 += 1
        if result_df['风险7'][0] > result_df['风险7比较基准'][0]:
            k7 += 1
        if result_df['风险8'][0] > result_df['风险8比较基准'][0]:
            k8 += 1
        if result_df['风险9'][0] > result_df['风险9比较基准'][0]:
            k9 += 1
        if result_df['风险10'][0] > result_df['风险10比较基准'][0]:
            k10 += 1


# 滚动战胜概率
#    length = len(df)-7
#    length = len(df)//7
    length = len(df) // 30
    k1 = 0
    k2 = 0
    k3 = 0
    k4 = 0
    k5 = 0
    k6 = 0
    k7 = 0
    k8 = 0
    k9 = 0
    k10 = 0
    days = df.index.values
    for i in range(length):
        #        num = -1 - i
        #        num = -1 - i*7
        #        num = -1 - i*30
        last_day = pd.to_datetime(str(days[num]))
        delta_day = last_day - timedelta(days=31)
        choose_dates = df[df.index <= delta_day].index.values
        if len(choose_dates) == 0:
            break
        delta_day = pd.to_datetime(str(choose_dates.max()))
        #        result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去一周'] = df.loc[last_day] / df.loc[delta_day] - 1
        result_df.loc[df.index[-1].strftime('%Y-%m-%d') +
                      ' 过去一月'] = df.loc[last_day] / df.loc[delta_day] - 1
        #        result_df.loc[df.index[-1].strftime('%Y-%m-%d') + ' 过去三个月'] = df.loc[last_day] / df.loc[delta_day] - 1
        if result_df['风险1'][0] > result_df['风险1比较基准'][0]:
            k1 += 1
        if result_df['风险2'][0] > result_df['风险2比较基准'][0]:
            k2 += 1
        if result_df['风险3'][0] > result_df['风险3比较基准'][0]:
            k3 += 1
        if result_df['风险4'][0] > result_df['风险4比较基准'][0]:
            k4 += 1
        if result_df['风险5'][0] > result_df['风险5比较基准'][0]:
            k5 += 1
        if result_df['风险6'][0] > result_df['风险6比较基准'][0]:
            k6 += 1
        if result_df['风险7'][0] > result_df['风险7比较基准'][0]:
            k7 += 1
        if result_df['风险8'][0] > result_df['风险8比较基准'][0]:
            k8 += 1
        if result_df['风险9'][0] > result_df['风险9比较基准'][0]:
            k9 += 1
        if result_df['风险10'][0] > result_df['风险10比较基准'][0]:
            k10 += 1

    r1 = k1 / length
    r2 = k2 / length
    r3 = k3 / length
    r4 = k4 / length
    r5 = k5 / length
    r6 = k6 / length
    r7 = k7 / length
    r8 = k8 / length
    r9 = k9 / length
    r10 = k10 / length

    print([r1, r2, r3, r4, r5, r6, r7, r8, r9, r10])