Пример #1
0
def nav(index_code, index_name, now_date):

    # 参数
    ##################################################################################################################
    # index_name = '中证500'
    # index_code = '000905.SH'
    # now_date = "20180715"

    # 日期
    ##################################################################################################################
    date_series = Date().get_normal_date_series("20130622",
                                                datetime.today(),
                                                period="S")
    date_series.append(now_date)

    # 循环计算基金净值
    ##################################################################################################################
    path = 'E:\\4_代码\\pycharmprojects\\31_雪球优选增强基金\\output_data\\'
    file_name = path + 'select_fund\\' + index_name + '\\' + '基金每期持仓_' + index_name + '.xlsx'
    fund_holding_total = pd.read_excel(file_name,
                                       index_col=[0],
                                       encoding='gbk')
    fund_holding_total['换仓日期'] = fund_holding_total['换仓日期'].map(str)

    nav_total = pd.DataFrame([])

    for i_date in range(0, len(date_series) - 2):

        report_date_str = date_series[i_date]
        report_date_str_after = date_series[i_date + 1]
        print(report_date_str, report_date_str_after)

        fund_holding_date = fund_holding_total[fund_holding_total['换仓日期'] ==
                                               report_date_str]

        fund_code_list = list(fund_holding_date['基金代码'].values)
        fund_data = Fund().get_fund_factor("Repair_Nav", None, None)
        fund_data = fund_data.ix[report_date_str:report_date_str_after,
                                 fund_code_list]
        fund_data = fund_data / fund_data.iloc[0, :]
        fund_data = fund_data.dropna()
        nav_array = fund_data.values
        weight_array = np.row_stack(fund_holding_date.ix[:, '权重'].values)

        fund_data.loc[:, '每日总资产'] = np.dot(nav_array, weight_array)
        fund_data['每日涨跌幅'] = fund_data['每日总资产'].pct_change()
        fund_data = fund_data.dropna()
        nav_total = pd.concat([nav_total, fund_data['每日涨跌幅']], axis=0)

    nav_total = nav_total[~nav_total.index.duplicated()]
    index_pct = Index().get_index_factor(index_code, None, None, ["PCT"])
    result = pd.concat([nav_total, index_pct], axis=1)
    result = result.dropna()
    result.columns = ['基金组合日涨跌', '指数日涨跌']
    result['基金组合累计收益'] = (result['基金组合日涨跌'] + 1).cumprod() - 1
    result['指数累计收益'] = (result['指数日涨跌'] + 1).cumprod() - 1
    result['超额累计收益'] = result['基金组合累计收益'] - result['指数累计收益']

    num_format_pd = pd.DataFrame([], columns=result.columns, index=['format'])
    num_format_pd.ix['format', :] = '0.00%'
    begin_row_number = 0
    begin_col_number = 0
    color = "red"
    file_name = path + 'nav\\' + index_name + '\\' + '基金回测净值_' + index_name + '.xlsx'
    sheet_name = "基金回测净值"
    write_pandas(file_name, sheet_name, begin_row_number, begin_col_number,
                 result, num_format_pd, color)
Пример #2
0
def weight_top10stock_good_date(report_date):

    report_date = Date().change_to_str(report_date)
    data = Fund().get_fund_holding_stock_date(report_date)
    data = data[['FundCode', 'Weight', 'StockCode']]

    pool = Fund().get_fund_pool_code(report_date, "基金持仓基准基金池")
    fund_code = list(set(pool))
    fund_code.sort()

    weight = Fund().get_fund_factor("Total_Asset", date_list=[report_date]).T
    weight = weight.dropna()

    # 根据业绩 筛选股票池 其他还和原来一样
    ###############################################################################################
    end_0 = int(report_date)
    begin_0 = int(report_date) - 10000
    end_1 = int(report_date) - 10000
    begin_1 = int(report_date) - 20000
    end_2 = int(report_date) - 20000
    begin_2 = int(report_date) - 30000
    print(end_0, end_1, end_2)

    code_str = ','.join(fund_code)

    data0 = w.wss(code_str, "NAV_adj_return",
                  "startDate=" + str(begin_0) + ";endDate=" + str(end_0))
    data0 = pd.DataFrame(data0.Data, columns=data0.Codes, index=[str(end_0)]).T

    data1 = w.wss(code_str, "NAV_adj_return",
                  "startDate=" + str(begin_1) + ";endDate=" + str(end_1))
    data1 = pd.DataFrame(data1.Data, columns=data1.Codes, index=[str(end_1)]).T

    data2 = w.wss(code_str, "NAV_adj_return",
                  "startDate=" + str(begin_2) + ";endDate=" + str(end_2))
    data2 = pd.DataFrame(data2.Data, columns=data2.Codes, index=[str(end_2)]).T

    performance = pd.concat([data0, data1, data2], axis=1)
    performance = performance.dropna()
    rank = performance.rank(ascending=False)

    rank = rank.dropna()
    rank /= len(rank)

    rank['rank_mean'] = rank[[str(end_0), str(end_1), str(end_2)]].mean(axis=1)
    rank['rank_std'] = rank[[str(end_0), str(end_1), str(end_2)]].std(axis=1)

    rank['rank_mean_plus_std'] = rank['rank_mean'] + rank['rank_std']
    rank = rank.sort_values(by=['rank_mean_plus_std'], ascending=True)

    size = max(2, np.ceil(0.15 * len(rank)))
    rank_good = rank[0:int(size)]
    rank_good = pd.concat([performance, rank_good], axis=1)
    rank_good = rank_good.dropna()
    rank_good = rank_good.sort_values(by=['rank_mean_plus_std'])
    fund_code = list(rank_good.index)
    print(fund_code)

    ###############################################################################################

    if len(fund_code) == 0:
        pass
    else:
        fund_code.sort()

        for i_fund in range(len(fund_code)):

            fund = fund_code[i_fund]
            print(fund)
            data_fund = data[data['FundCode'] == fund]
            data_fund = data_fund.dropna(subset=['Weight'])
            data_fund = data_fund.sort_values(by=['Weight'], ascending=False)

            try:
                asset = weight.ix[fund, str(report_date)]
                asset /= 100000000
            except Exception as e:
                asset = 1.0

            if i_fund == 0:
                data_fund_top10 = data_fund.iloc[:10, :]
                data_fund_top10[
                    "Asset_Weight"] = data_fund_top10['Weight'] * asset
                top10_weight = data_fund_top10['Weight'].sum()
                if top10_weight < 30:
                    data_fund_top10 = pd.DataFrame([],
                                                   columns=data_fund.columns)
            else:
                data_fund_top10_add = data_fund.iloc[:10, :]
                data_fund_top10_add[
                    "Asset_Weight"] = data_fund_top10_add['Weight'] * asset
                top10_weight = data_fund_top10_add['Weight'].sum()
                if top10_weight < 30:
                    data_fund_top10_add = pd.DataFrame(
                        [], columns=data_fund.columns)
                data_fund_top10 = pd.concat(
                    [data_fund_top10, data_fund_top10_add], axis=0)

        stock_code = list(set(data_fund_top10['StockCode'].values))
        stock_code.sort()
        weight_sum = data_fund_top10['Asset_Weight'].sum()
        weight_code = pd.DataFrame([],
                                   index=stock_code,
                                   columns=['Asset_Weight'])

        for i_stock in range(len(stock_code)):
            stock = stock_code[i_stock]
            data_stock = data_fund_top10[data_fund_top10['StockCode'] == stock]
            stock_weight_sum = data_stock['Asset_Weight'].sum()
            weight_code.ix[stock,
                           'Asset_Weight'] = stock_weight_sum / weight_sum

        weight_code.index = weight_code.index.map(lambda x: x[0:6] + '-CN')

        out_path = os.path.join(Fund().data_path_holder,
                                "fund_holding_benchmark")
        out_path = os.path.join(out_path, "weight_quarter_top10_good")
        if not os.path.exists(out_path):
            os.makedirs(out_path)
        out_file = os.path.join(
            out_path, "weight_quarter_top10_good_" + report_date + '.csv')
        print(out_file)
        weight_code.to_csv(out_file, header=None)
def weight_allstock_holding_date(report_date):

    report_date = Date().change_to_str(report_date)
    data = Fund().get_fund_holding_stock_date(report_date)
    data = data[['FundCode', 'Weight', 'StockCode']]

    pool = Fund().get_fund_pool_code(report_date, "基金持仓基准基金池")
    fund_code = list(set(pool))
    fund_code.sort()

    weight = Fund().get_fund_factor("Total_Asset", date_list=[report_date]).T
    weight = weight.dropna()

    for i_fund in range(len(fund_code)):

        fund = fund_code[i_fund]
        data_fund = data[data['FundCode'] == fund]
        data_fund = data_fund.dropna(subset=['Weight'])
        data_fund = data_fund.sort_values(by=['Weight'], ascending=False)

        try:
            asset = weight.ix[fund, report_date]
            asset /= 100000000
        except Exception as e:
            asset = 1.0

        if i_fund == 0:
            data_fund_all = data_fund.copy()
            data_fund_all["Asset_Weight"] = data_fund_all['Weight'] * asset
            all_weight = data_fund_all['Weight'].sum()
            if all_weight < 60:
                data_fund_all = pd.DataFrame([], columns=data_fund.columns)
        else:
            data_fund_all_add = data_fund.copy()
            data_fund_all_add[
                "Asset_Weight"] = data_fund_all_add['Weight'] * asset
            all_weight = data_fund_all_add['Weight'].sum()
            if all_weight < 60:
                data_fund_all_add = pd.DataFrame([], columns=data_fund.columns)
            data_fund_all = pd.concat([data_fund_all, data_fund_all_add],
                                      axis=0)

    stock_code = list(set(data_fund_all['StockCode'].values))
    stock_code.sort()
    weight_sum = data_fund_all['Asset_Weight'].sum()
    weight_code = pd.DataFrame([], index=stock_code, columns=['Asset_Weight'])

    for i_stock in range(len(stock_code)):
        stock = stock_code[i_stock]
        data_stock = data_fund_all[data_fund_all['StockCode'] == stock]
        stock_weight_sum = data_stock['Asset_Weight'].sum()
        weight_code.ix[stock, 'Asset_Weight'] = stock_weight_sum / weight_sum

    weight_code.index = weight_code.index.map(lambda x: x[0:6] + '-CN')
    out_path = os.path.join(Fund().data_path_holder, "fund_holding_benchmark")
    out_path = os.path.join(out_path, "weight_halfyear_all")
    if not os.path.exists(out_path):
        os.makedirs(out_path)
    out_file = os.path.join(out_path,
                            "weight_halfyear_all_" + report_date + '.csv')
    print(out_file)
    weight_code.to_csv(out_file, header=None)