量化交易-4-zipline回测例子

量化交易-4-zipline回测例子

@(金融)

上一篇讲到,自己有了一个策略,两根线,上穿买入,下穿,卖出。因此需要一个回测工具,评判策略优劣。在网上寻找了一下, 初步打算使用zipline来进行回测。
由于zipline的demo使用是美股,我稍作修改,使用了自己A股,并且对demo进行了分析,然后将demo的策略换做自己的demo进行分析。

替换美股为A股

替换美股为A股,稍微需要修改一些地方
1. 本地日期需要转换为UTC日期

    dl = DownLoad()
    data = dl.load_data('603600')
    data['yygf'] = data['close']
    transform = DataFrame(data, columns=['yygf'])

    transform.index = data['date']
    transform.index = transform.index.tz_localize('UTC')    #1.这一步比较重要
    # Create and run the algorithm.

    algo = TradingAlgorithm(initialize=initialize, handle_data=handle_data)#2.identifiers=['yygf'] 这个
    results = algo.run(transform).dropna()

    # Plot the portfolio and asset data.
    analyze(results=results)

需要修改的地方,在注释里面都有。总的来说,这个zipline回测比较慢。
有时候,貌似会报出一个连接错误,大多与网络有关系,如果可以,一般不会出问题。但是同样的代码也会有概率成功。这个是永艺股份的数据。
量化交易-4-zipline回测例子_第1张图片
从图形看这个策略比较一般

替换策略

这次准备用上文提到的一个策略进行回测。
只需要修改处理数据里面的东西。折腾发现,替换策略并不是那么容易。 尤其是第二条线用到第一线的结果,这里面存在BarData格式数据,尝试转化,也会出很多问题。因此只好自己实现一个简单的回测。

回测函数

简单来说,就是金叉上穿,实现买入,金叉下穿卖出。

class BackTest(object):
    def __init__(self,data):
        self.raw_data = data   #回测历史数据
        self.left_money = 100000.0 #初始资金
        self.unit_money = 20000.0 #初始资金
        self.shares = 0     #股票数
        self.state = 0  #空仓

        self.H1 = ta.MA(np.asarray(self.raw_data['close']), timeperiod=8,matype=1) #快线
        self.H2 = ta.MA(self.H1, timeperiod=20,matype=1) #慢线
        self.period = 20
        self.money = [self.left_money] * self.period #money的时间图


    def check_every_day(self,long):
        open_price = self.raw_data['open']
        close_price = self.raw_data['close']
        difference = self.H1 - self.H2
        #遍历数据,判断金叉.
        for idx in xrange(long,len(difference)-1):
            signal = self.signal(difference[idx-2],difference[idx-1])
            if signal == 1:
                self.buy(open_price[idx])
            elif signal == -1:
                self.sell(open_price[idx])
            else:
                pass
            value = self.shares * 100 * close_price[idx]
            self.money.append(self.left_money + value)

    def draw_result(self):
        length = -110
        fig = plt.figure()
        ax = fig.add_subplot(211)
        raw_data['time'] = self.raw_data['date'].map(date2num)
        data = DataFrame(raw_data, columns=['time', 'open','close','high','low'])
        data = np.array(data)
        candlestick_ochl(ax,data[length:],width=0.6,colordown=u'g',colorup=u'r')

        plt.grid()
        plt.plot(raw_data['date'][length:], self.H1[length:],color='r',label='H1')
        plt.plot(raw_data['date'][length:], self.H2[length:],color='y',label='H2')

        plt.subplot(2,1,2)
        plt.plot(raw_data['date'][length:],self.money[length:])
        plt.show()

    def sell(self, price):
        if self.shares >0:
            self.left_money += self.shares*price*100
            self.shares = 0
            self.state = 0
    def buy(self, price):
        #一次购买三成股票
        if self.left_money < self.unit_money:
            return None
        shares = int(self.unit_money / price /100)
        self.shares += shares
        self.left_money = self.left_money - shares*price*100
        self.state += 2 #持股比例

    @staticmethod
    def signal(yesterday, today):
        if yesterday <= 0 and today <=0:
            return 0 #继续空仓
        if yesterday <0 and today >0:
            return 1 #买入
        if yesterday >0 and today >0:
            return 1 #买入
        if yesterday >0 and today <=0:
            return -1 #卖出
        return 0

我们依然用永艺股份的数据作为例子。如图
量化交易-4-zipline回测例子_第2张图片

到目前为止,大致流程走了一遍,然后使用通达信程序下单买卖操作。

你可能感兴趣的:(金融)