def initData(self, start_day, end_day): #数据初始化, 生成数据面板 days = (start_day, end_day) hisdat_start_day = help.MyDate.s_Dec(start_day, -100) self.panel_hisdat = stock.DataSources.getHisdatPanl( self.codes, (hisdat_start_day, end_day)) if start_day == '': start_day = hisdat_start_day fenshi_start_day = help.MyDate.s_Dec(start_day, -5) fenshi_days = (fenshi_start_day, help.MyDate.s_Dec(end_day, 1)) if self.mode & self.enum.hisdat_five_mode == self.enum.hisdat_five_mode: self.panel_fiveminHisdat = stock.DataSources.getFiveMinHisdatPanl( self.codes, fenshi_days) if self.mode == BackTestPolicy.enum.tick_mode: self.dict_fenshi = stock.DataSources.getFenshiPanl( self.codes, fenshi_days) else: self.dict_fenshi = None #self.panel_fiveminHisdat = None for policy in self.policys: policy.data.set_datasource(self.panel_hisdat, self.dict_fenshi, \ self.panel_fiveminHisdat) #修正日期 if self.mode & self.enum.hisdat_mode == self.enum.hisdat_mode: if self.mode & self.enum.hisdat_five_mode == self.enum.hisdat_five_mode: df = self.panel_fiveminHisdat[self.codes[0]] else: df = self.panel_hisdat[self.codes[0]] else: df = self.dict_fenshi[self.codes[0]] if len(df) > 0: end_day = agl.datetime_to_date(df.index[-1]) start_day = help.MyDate.s_Dec(start_day, 2) return start_day, end_day
def _Report(self, policy, start_day, end_day, last_close): policy._getAccount().Report(end_day, last_close, True) #绘制图形 if hasattr(policy, 'Report'): policy.Report() #end_day = help.MyDate.s_Dec(end_day, 1) #bars = stock.CreateFenshiPd(self.code, start_day, end_day) if self.mode == 0: bars = self.dict_fenshi[self.codes[0]] if len(bars) == 0: return bars = bars.resample('1min').mean() bars['c'] = bars['p'] else: #日线 bars = self.panel_hisdat[self.codes[0]] if self.mode & self.enum.hisdat_five_mode == self.enum.hisdat_five_mode: bars = self.panel_fiveminHisdat[self.codes[0]] bars['positions'] = 0 bars = bars.dropna() df = policy._getAccount().ChengJiao() df_zhijing = policy._getAccount().ZhiJing() init_money = df_zhijing.iloc[0]['资产'] df_zhijing = df_zhijing[bars.index[0]:] df_changwei = policy._getAccount().ChengJiao() cols = ['买卖标志', '委托数量'] df_flag = df_changwei[cols[0]].map(lambda x: x == '证券卖出' and -1 or 1) df_changwei[cols[1]] *= df_flag changwei = df_changwei[cols[1]].cumsum() if self.mode == self.enum.hisdat_mode: df.index = df.index.map(lambda x: agl.datetime_to_date(x)) #bars.is_copy = False for i in range(len(df)): index = df.index[i] bSell = bool(df.iloc[i]['买卖标志'] == '证券卖出') if index in bars.index: bars.at[index, 'positions'] = agl.where(bSell, -1, 1) #同步资金到bar #df_zhijing.is_copy = False df_zhijing = copy.deepcopy(df_zhijing) # 为了避免赋值警告 df_zhijing['changwei'] = changwei if self.mode == self.enum.hisdat_mode: df_zhijing.index = df_zhijing.index.map( lambda x: agl.datetime_to_date(x)) bars = bars.join(df_zhijing) bars = bars.fillna(method='pad') #同步价格的动态总资产 bars['资产'] = bars['可用'] + bars['changwei'] * bars['c'] zhican = (bars['资产'] - init_money) / init_money * 100 zhican = zhican.fillna(0) if sys.version > '3': title = '%s %s' % (self.codes[0], stock.GetCodeName(self.codes[0])) else: title = '%s %s' % (self.codes[0], stock.GetCodeName( self.codes[0]).decode('utf8')) ui.TradeResult_Boll(agl.where(policy.pl, policy.pl, pl), bars, \ stock.GuiYiHua(zhican),\ stock.GuiYiHua(bars['changwei']), title=title) if policy.pl is not None: #if policy.pl.explicit: policy.pl.publish()
def ShowTradeResult2(pl, bars, signals, zhijin, changwei,signal_dependent_num=0, freq=300, title=''): """绘制策略的交易结果, 交易剔除了非交易时间, 资金未剔除, 因此两者的xtick看起来是不一致的 注意,bars不能有nan,否则画不出箭头 bars: pd.DateFrame 日线等数据集 index为时间 收盘为['c'] signals: pd.DateFrame 信号 包含技术指标 index同bars zhijin: pd.Serias 资金结果 changwei: 当前仓位 signal_dependent_num: 显示signals里的依赖线 freq: 坐标的间隔 """ # Plot two charts to assess trades and equity curve pl.figure #fig = pl.figure() pl.close() fig = pl.gcf() fig.patch.set_facecolor('white') # Set the outer colour to white ax1 = fig.add_subplot(211, ylabel='Price in RMB') if title != '': pl.title(title, fontproperties=getFont()) #思路, 把时间转整数,显示时再把整数转时间字符串 # 为了去除非交易时间, 把index 转换为整数 date_ticks = copy.deepcopy(bars.index) indexs = np.arange(len(bars)) bars.index = indexs signals.index = indexs if len(bars) == len(zhijin): if zhijin is not None: zhijin.index = indexs if changwei is not None: changwei.index = indexs # Plot the AAPL closing price overlaid with the moving averages bars['c'].plot(ax=ax1, color='r', lw=2.) #显示信号产生的依据, 最好是使用固定的值, 比如信号线1-n, range(n) if signal_dependent_num>0: signals[np.array(range(signal_dependent_num), dtype=str)].plot(ax=ax1, lw=2.) #signals[['short_ma', 'long_ma']].plot(ax=ax1, lw=2.) # Plot the "buy" trades against AAPL ax1.plot(signals.loc[signals.positions == 1.0].index, bars['c'][signals.positions == 1.0], '^', markersize=10, color='m') # Plot the "sell" trades against AAPL ax1.plot(signals.loc[signals.positions == -1.0].index, bars['c'][signals.positions == -1.0], 'v', markersize=10, color='k') # Plot the equity curve in dollars ax2 = fig.add_subplot(212, ylabel='Portfolio value in RMB') if zhijin is not None and len(zhijin)>1: zhijin.plot(ax=ax2, lw=2.) legends = ['zhijing'] if changwei is not None and len(changwei)>1: changwei.plot(ax=ax2) legends.append('changwei') ax2.legend(legends,loc=0) #剔除非交易时间 #freq = 300 ax1.set_xticks(indexs[::freq]) date_ticks = date_ticks.map(lambda x : agl.datetime_to_date(x)) ax1.set_xticklabels(date_ticks[::freq], rotation=45, ha='right') if len(bars) == len(zhijin): ax2.set_xticks(indexs[::freq]) ax2.set_xticklabels(date_ticks[::freq], rotation=45, ha='right') # Plot the figure #fig.show() pl.show() pl.close()