Beispiel #1
0
    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
Beispiel #2
0
    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()
Beispiel #3
0
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()