def analyze(file_name, merge_stock_operation_detail=False): account_type = re.sub('_normalized\.xls', '', file_name) flow_records = pd.read_excel(file_name, encoding='gbk') SinaQuote.reset() broker_processor = globals()['normal'] init_account = Account(None) for i, row in flow_records.iterrows(): broker_processor.handle_row(row, init_account, i==0) init_account.calculate_init_cash_if_no_remain_amount(flow_records) init_account.print_position() init_account.print_init_position() init_account_value = init_account.calculate_init_position_value(20140101) init_date = int(init_account.get_init_date()) print init_date print init_account_value print init_account.init_cash account = Account( init_account ) account_status_data = [] #print "%d: %s" % (1, account.report_init()) process_day = datetime(2014,1,1) init_day = datetime(init_date/10000, init_date%10000/100, init_date%100) while process_day < init_day: account.set_date(int(process_day.strftime('%Y%m%d'))) account.calculate_nv() print account.get_status_data() account_status_data.append(account.get_status_data()) process_day = compute.next_bday(process_day) for i, row in flow_records.iterrows(): d = broker_processor.get_row_date(row) row_date = datetime(d/10000, d%10000/100, d%100) while row_date > process_day: account.calculate_nv(int(process_day.strftime('%Y%m%d'))) print account.get_status_data() #if process_day == datetime(2014,2,24) or process_day == datetime(2014,2,25): # account.print_position() #if int(process_day.strftime('%Y%m%d')) == 20140509 or int(process_day.strftime('%Y%m%d')) == 20140512: #account.report_position_detail() account_status_data.append(account.get_status_data()) process_day = compute.next_bday(process_day) account.set_date(int(process_day.strftime('%Y%m%d'))) broker_processor.handle_row(row, account, i==0) account.calculate_nv() # 每个操作必须重新计算净值 #print account.get_status_data(), d, row['operation'], row['actual_amount'], row['stock_code'], row['stock_name'] while process_day <= datetime(2014,12,31): account.calculate_nv(int(process_day.strftime('%Y%m%d'))) print account.get_status_data() account_status_data.append(account.get_status_data()) process_day = compute.next_bday(process_day) account.set_date(int(process_day.strftime('%Y%m%d'))) df_nv_history = pd.DataFrame(data=account_status_data, columns=account.get_status_columns()) (uid, name) = get_uid_name() out_file_name = uid + '_' + name + '_' + account_type + u'_分析结果' + datetime.now().strftime('%Y%m%d%H%M%S') + '.xls' if merge_stock_operation_detail: out_file_name = u'/Users/jiangbin/百度云同步盘/work/for_renjie/'+out_file_name (profit_sum_list, profit_detail_df_list) = account.get_profit_detail(20141231) #df_profit_detail = pd.DataFrame(data=profit_list, columns=profit_columns) df_profit_sum = pd.DataFrame(data=profit_sum_list, columns=[u'代码', u'名称', u'累计赢利']) df_init_position = init_account.get_init_position_dataframe() df_final_position = account.get_position_dataframe(20141231) #account.stock_position.get_detail_stock_flow(20141231) buy_sell_count = account.buy_sell_count df_overview = pd.DataFrame() with pd.ExcelWriter(out_file_name) as writer: df_overview = print_result_overview(account_type, df_nv_history, buy_sell_count, writer) df_nv_history.to_excel(writer, sheet_name=u'净值历史', encoding='gbk') df_profit_sum = add_stock_code_prefix(df_profit_sum, u'代码') df_profit_sum.to_excel(writer, sheet_name=u'个股赢利汇总', encoding='gbk') write_profit_detail(writer, profit_detail_df_list, merge_stock_operation_detail) df_init_position[u'类型'] = u'期初持仓' df_final_position[u'类型'] = u'期末持仓' df_position_all = pd.concat([df_init_position, df_final_position]) df_position_all = add_stock_code_prefix(df_position_all, u'代码') change_init_date(df_position_all) df_position_all.to_excel(writer, sheet_name=u'期初期末持仓', encoding='gbk') return df_overview