DATA1.docx
1.1 datafeed
在一开始我们就讨论过datafeed,也就是cerebro的本源,数据。我们看一下上次我们的策略是怎么来的。
dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True) dataframe['openinterest'] = 0 data = bt.feeds.PandasData(dataname=dataframe, fromdate = datetime.datetime(2015, 1, 1), todate = datetime.datetime(2016, 12, 31) ) # Add the Data Feed to Cerebro cerebro.adddata(data)
我们的数据是从一个dfqc的csv文件里面来的,这里,可能大家没有这个数据,之前上传的csdn,不只是还没通过还是怎么的。今天就把他存到百度云,大家有需要的可以自行下载。这是东风汽车的股票数据,是从wind上获取的。大家没有wind也可以用tushare之类的免费api获得。
链接:http://pan.baidu.com/s/1slnULbv 密码:wi3k
文件里面的数据大概是这样的:
2014-03-13 00:00:00.005,1.425,1.434,1.449,1.418,457767208.02014-03-14 00:00:00.005,1.429,1.422,1.436,1.416,196209439.02014-03-17 00:00:00.005,1.433,1.434,1.437,1.422,250946201.02014-03-18 00:00:00.005,1.434,1.425,1.437,1.424,245516577.02014-03-19 00:00:00.005,1.423,1.419,1.423,1.406,331866195.02014-03-20 00:00:00.005,1.412,1.408,1.434,1.407,379443759.02014-03-21 00:00:00.005,1.406,1.463,1.468,1.403,825467935.0
dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
大家注意我们把csv读入pandas的参数,index_col=0表示第一列时间数据是作为pandas 的index的,parse_dates=Ture是自动把数据中的符合日期的格式变成datetime类型。为什么要这样呢?其实读入后的pandas长怎么样都是由backtrader规定的。
1.2 strategy中的data
大家不知道有没有注意,strategy的初始化函数(init)中,
self.dataclose = self.datas[0].close
有这样一句。在backtrader中,self.datas[0] 与self.data是等价的,换句话说,同一个东西不同的叫法罢了。为什么会有前面这种,笔者认为,backtrader应当可以支持多个datafeed,目前还没有使用到,先按下不表。
看看前面的pandas的要求的结构,我们就知道,不仅仅有self.datas[0].close,还会有self.datas[0].open。也确实如此。只是我们通常拿close作为一个价格基准罢了。这里,
self.datas[0].close
返回的是一个lines。lines是backtrader一个很重要的概念,我们可以理解为时间序列流,这类数据,后面可以跟index,也就是说,可以有
self.datas[0].close[0]
self.datas[0].close[1]
self.datas[0].close[-1]
等等,但是这里的index是有意义的,0代表当前时刻,-1代表前一时刻,1代表后一时刻,一次类推。
所以在next中使用self.dataclose[0],self.dataclose[-1]就很好理解了。
DATA2.docx
SSA就是奇异谱分析。
奇异谱分析是近年来兴起的一种研究非线性时间序列数据的强大的方法。它根据所观测到的时间序列构造出轨迹矩阵,并对轨迹矩阵进行分解、重构,从而提取出代表原时间序列不同成分的信号,如长期趋势信号、周期信号、噪声信号等,从而对时间序列的结构进行分析,并可进一步预测。
说的通俗点,我们平时用均线,但是有一个问题,均线虽然算法本质上有平滑噪音的含义,但是有时候,也把重要的信息给平滑掉了。所以,我们是不是除了平滑这样的方法之外,要开拓新的方法来分离噪音和有用信息呢。
图像的压缩给我们一个很重要的启示,就是谱分解,如果不知道什么是谱分解的话,只要知道,这是一种先分解,然后获取重要信息的一种方法即可。
奇异谱分解的基本思想很简单,分成如下几个步骤:
2.1将时间序列转化为轨迹矩阵
假设有一个时间序列,当然,对于我们而言,就是股价:Y(T)=(y(1),⋯,y(T))
X=(y1,y2,y3,⋯ym;
y2,y3,y4,⋯ym+1;
..................................
..................................
yn,yn+1,yn+2,⋯,yT)
就变成了这样一个n*m的矩阵。
其中,m为选取的窗口长度,可以当做MA中的窗口长度一样理解。n=T-m+1。
2.2 SVD分解与矩阵重构
计算X.T*X并对其进行奇异值分解(SVD),从而得到其m个特征值
λ1≥λ2≥⋯≥λm≥0
然后按照从大到小的原则进行矩阵重构。笔者建议大家看一下SVD分解的相关内容,可以更好的理解这一部分。
假设重构后的矩阵为
X=(x1,1 x1,2 x1,3 ⋯ x1,m;
x2,1 x2,2 x2,3 ⋯ x2,m+1
..........................
..........................
xn,1 xn,2 xn,3 ⋯ xn,n+m−1)
2.3序列重构
可是我们要的是像MA一样的线呀,现在这个显然不是,所以我们要再把矩阵变成时间序列。方法还是有很多的,比如最常用的有对角相加:
y1=x1,1 y2=(x1,2 + x2,1)/2 y3=(x1,3 + x2,2 + x3,1)/3
......
2.4 接下来,我们就用代码实现上面的这些步骤。
def get_window_matrix(self, input_array, t, m): # 将时间序列变成矩阵 temp = [] n = t - m + 1 for i in range(n): temp.append(input_array[i:i + m]) window_matrix = np.array(temp) return window_matrix def svd_reduce(self, window_matrix): # svd分解 u, s, v = np.linalg.svd(window_matrix) m1, n1 = u.shape m2, n2 = v.shape index = s.argmax() # get the biggest index u1 = u[:, index] v1 = v[index] u1 = u1.reshape((m1, 1)) v1 = v1.reshape((1, n2)) value = s.max() new_matrix = value * (np.dot(u1, v1)) return new_matrix def recreate_array(self, new_matrix, t, m): # 时间序列重构 ret = [] n = t - m + 1 for p in range(1, t + 1): if p < m: alpha = p elif p > t - m + 1: alpha = t - p + 1 else: alpha = m sigma = 0 for j in range(1, m + 1): i = p - j + 1 if i > 0 and i < n + 1: sigma += new_matrix[i - 1][j - 1] ret.append(sigma / alpha) return ret def SSA(self, input_array, t, m): window_matrix = self.get_window_matrix(input_array, t, m) new_matrix = self.svd_reduce(window_matrix) new_array = self.recreate_array(new_matrix, t, m) return new_array
这里,我们调用SSA函数就可以获得重构后的时间序列。
那么按照逻辑,重构后的时间序列我们选取最后一个,就是我们要的当天的SSA了,然后就可以像趋势线一样使用。
DATA3.docx
大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。大数据是时下较为热门的一个话题,本人最近一两年一直参与一款BI(商业智能)产品的前端开发工作,准备写一个系列的文章来阐述产品的需求场景以及与前端有关的技术实现方案,也算是对开发过程所做的一个总结。
首先要谈的就是需求,所有的产品策划方案、技术实现细节,最终都是为了满足需求,抛开需求,一切的夸夸其谈都只是纸上谈兵。那么一款BI(商业智能)有哪些需求,它是如何服务业务方产品更好的成长的呢。
假设我是业务方淘宝网,在web、iPhone、Android三个端都有相应的产品。
需求场景一:日活用户量UV
我想看最近一周,我产品的日活用户量的变化趋势;我想看我的用户在各个国家、省份、城市的分布情况;我想看用户在web、iPhone、Android三个端的分布情况;如果发现某个城市的UV很高的话,就可以在选择在这个城市做线下活动推广等等;
为此,我们推出了事件分析功能