Home >  > Python事件化回测双均线

Python事件化回测双均线

0

事件回测的最大好处是基本上可以避免未来函数的出现。

代码如下:

1# -*- coding: utf-8 -*-
2 
3from __future__ import division
4 
5# %matplotlib inline
6 
7import tushare as ts
8import pandas as pd
9import numpy as np
10 
11data = ts.get_hist_data("510050",start="2017-01-01",end="2017-09-08")
12data = data.sort_values("date")
13df = pd.DataFrame()
14df['close'] = data['close']
15df['change'] = df['close']- df['close'].shift(1)
16df = df.dropna()  #将带有Na的去掉,返回一个新的对像
17 
18close5_array = np.zeros(5)    #缓存过去5天收盘价
19close20_array = np.zeros(20)
20last_signal = 0              #最近交易信号,初始化为0。因为双均线策略要使用前一天的收盘价,就需要将信号缓存下来,第2天计算仓位的时候使用
21last_pos = 0                 #最近的持仓,初始化为0
22 
23dr_list = []   #每日盈亏结果列表
24 
25class DailyResult:
26    """每日盈亏结果"""
27    def _init__(self):
28        self.date = ''
29        self.close = 0
30        self.change = 0
31        self.pos = 0
32        self.last_pos = 0     #昨日持仓
33 
34        self.pnl = 0
35        self.fee = 0
36        self.net_pnl = 0
37 
38    def calculate(self,date,close,change, last_signal, last_pos):
39        """计算每日盈亏"""
40        #赋值原始数据
41        self.date = date
42        self.close  = close
43        self.change = change
44        self.pos = last_signal
45        self.last_pos = last_pos
46 
47        #计算结果数据
48        self.pnl = self.change * self.pos
49        self.fee = abs(self.pos-self.last_pos) * 1.5/10000
50        self.net_pnl = self.pnl - self.fee
51 
52#运行回溯
53#iterrows生成迭代器,enumerate在迭代过程中返回当前的变量的计数情况。df刚好有date, close, change三列。叠代过程中会以tuple的形式返回每一行,其中的第一个元素是日期,第二个元素是数值段。
54for i, row in enumerate(df.iterrows()):
55    date = row[0]
56    close =row[1]['close']
57    change = row[1]['change']
58 
59    #将数组中的数据平移一格
60    close5_array[0:4] = close5_array[1:5]
61    close20_array[0:19] = close20_array[1:20]
62 
63    #将新数据添加到数组末尾
64    close5_array[-1] = close
65    close20_array[-1] = close
66 
67    #如果尚未有20个数据点的缓存数量,则不执行后续逻辑
68    if i < 20:
69        continue
70 
71    #计算当日持仓盈亏
72    dr = DailyResult()
73    dr.calculate(date, close, change, last_signal,last_pos)
74 
75    dr_list.append(dr)
76 
77    #记录当日持仓
78    last_pos = dr.pos
79 
80    #计算信号数据
81    ma5 = close5_array.mean()
82    ma20 = close20_array.mean()
83    if ma5 > ma20:
84        last_signal = 10000
85    else:
86        last_signal = -10000
87 
88#显示回测结果
89result_df = pd.DataFrame()
90result_df['net_pnl'] = [dr.net_pnl for dr in dr_list]    #将dailyresult列表中的数据转换为pandas的dataframe
91result_df.index = [dr.date for dr in dr_list]              #添加日期索引
92 
93result_df['cum_pnl'] = result_df['net_pnl'].cumsum()    #累积求和
94result_df['cum_pnl'].plot()

在jupyter运行结果如下:

暧昧帖

本文暂无标签

发表评论

*

*