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)
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)