量化交易-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回测比较慢。
有时候,貌似会报出一个连接错误,大多与网络有关系,如果可以翻墙,一般不会出问题。但是同样的代码也会有概率成功。这个是永艺股份的数据。
这里写图片描述
从图形看这个策略比较一般

替换策略

这次准备用上文提到的一个策略进行回测。
只需要修改处理数据里面的东西。折腾发现,替换策略并不是那么容易。 尤其是第二条线用到第一线的结果,这里面存在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

我们依然用永艺股份的数据作为例子。如图
这里写图片描述

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

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
股票回测量化交易中非常重要的一环,它可以通过历史数据对交易策略进行模拟和评估,从而评估策略的可行性和优劣性。在Python中,有很多开源的量化交易框架可以用来进行股票回测,如zipline、backtrader等。 下面是一个使用zipline框架进行简单交易策略回测例子: 1. 安装zipline ```python pip install zipline ``` 2. 编写交易策略代码 ```python from zipline.api import order_target_percent, record, symbol def initialize(context): context.asset = symbol('AAPL') def handle_data(context, data): # 获取过去10天的收盘价 prices = data.history(context.asset, 'price', 10, '1d') # 计算平均价 mean_price = prices.mean() # 如果当前价格低于平均价,则买入 if data.current(context.asset, 'price') < mean_price: # 调整持仓比例至100% order_target_percent(context.asset, 1.0) # 否则卖出 else: # 调整持仓比例至0% order_target_percent(context.asset, 0.0) # 记录当前持仓比例 record(position=context.portfolio.positions[context.asset].amount) ``` 3. 运行回测 ```python from zipline import run_algorithm from zipline.api import symbol from datetime import datetime start = datetime(2016, 1, 1) end = datetime(2017, 1, 1) result = run_algorithm( start=start, end=end, initialize=initialize, capital_base=10000, handle_data=handle_data, bundle='quandl' ) ``` 在上述代码中,我们定义了一个简单的交易策略,即如果当前价格低于过去10天的平均价,则买入,否则卖出。然后我们使用zipline框架进行回测,设定回测开始和结束时间、初始资本、数据来源等参数,最终得到回测结果。 需要注意的是,这只是一个简单的例子,实际的交易策略可能会更加复杂,需要考虑更多的因素。另外,在进行股票回测时,也需要注意避免过度拟合或过度优化,以免出现回测虚高的情况。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值