最近身体不适,写不动文章了,找出之前写过两篇经典的老文分享给大家。
0
引言
斯蒂文想用聚宽 (JoinQuant) 写一个股票投资的量化策略,首先需要收集大量的数据。(下面聚宽代码基本上可以一看就懂,详细的代码解释见本帖第四章)
阶段一
斯蒂文查了查 2019 年 1 月 3 日平安银行 (000001.XSHE) 的收盘价,发现是 9.28,他默默将这个单数字存到 X0 里。
X0 = get_price( '000001.XSHE',
start_date='2019-01-03',
end_date='2019-01-03',
frequency='daily',
fields=['close'] )
X0 又称为标量 (scalar),或更严谨的称为 0 维张量 (0D tensor)。
阶段二
单天股票价格太少,至少要算一些均值、标准差这些统计量吧。
斯蒂文从一天的数据扩展到一年,下载了从 2019 年 1 月 3 日起过去一年的平安银行历史收盘价,存到 X1 里。
X1 = get_price( '000001.XSHE',
start_date='2018-01-03',
end_date='2019-01-03',
frequency='daily',
fields=['close'] )
X1 在 X0 基础上添加了时间维度 (红色箭头),从标量扩展成向量 (vector),又称为 1 维张量 (1D tensor)。
阶段三
单个股票太少,分散原则告诉我们需要投资相关性系数为负的两支股票。
斯蒂文增加了茅台股票 (600519.XSHG),下载了从 2019年 1 月 3 日起过去一年的平安银行和茅台历史收盘价,存到 X2 里。
X2 = get_price( ['000001.XSHE','600519.XSHG'],
start_date='2018-01-03',
end_date='2019-01-03',
frequency='daily',
fields=['close'] )
X2 在 X1 基础上添加了横截维度 (蓝色箭头),从向量扩展成矩阵 (matrix),又称为 2 维张量 (2D tensor)。
阶段四
收盘价一个信息不够,在趋势追踪模型中,价格和交易量是在股票走势中相当重要的因素。
斯蒂文增加了交易量,下载了从 2019 年 1 月 3 日起过去一年的平安银行和茅台历史收盘价和交易量,存到 X3 里。
X3 = get_price( ['000001.XSHE','600519.XSHG'],
start_date='2018-01-03',
end_date='2019-01-03',
frequency='daily',
fields=['close','volume'] )
X3 在 X2 基础上添加了信息维度 (绿色箭头),从矩阵扩展成 3 维张量 (3D tensor)。
阶段五
收盘信息太过于少,如果要日内交易怎么办?
斯蒂文又增加了 tick 数据 (聚宽对股票的 tick 数据切片时间为 3 秒),下载了从 2019 年 1 月 3 日起过去一年的平安银行和茅台历史 tick 价格和交易量,存到 X4 里。
import pandas as pd
tick_data1 = []
tick_data2 = []
for date in pd.date_range('2018-01-04', '2019-01-04').tolist():
d = get_ticks('000001.XSHE',
start_dt=None,
end_dt=date,
count=5,
fields=['time','current','volume'])
tick_data1.append(d)
d = get_ticks('600519.XSHG',
start_dt=None,
end_dt=date,
count=5,
fields=['time','current','volume'])
tick_data2.append(d)
X4 在 X3 基础上添加了频率维度(灰色箭头),从 3 维张量扩展成 4 维张量 (4D tensor)。
纵横时间之长,驰骋股票之宽,领略信息之深,体会频率之快,如果能够获取下图这四维数据,再做不好量化策略就。。。等等,这帖不是打深度学习的基础吗,怎么扯到量化投资了?其实张量无处不在,因为数据无处不在,维度无处不在。
本来一开始是想讲张量求导 (tensor derivative) 和计算图 (computational graph) 的,但讲这个必须把张量要讲清楚吧。后来解释张量一发不可收拾写成了完整一贴。这贴把张量基础打牢,下贴继续张量求导和计算图。
本帖目录如下:
目录
第一章 - 线性代数的张量
第二章 - 编程语言的张量
2.1 Python
2.2 TensorFlow
2.3 MXNet
2.4 PyTorch
2.5 Matlab
第三章 - 机器学习的张量
3.1 简介
3.2 2D 数据表
3.3 3D 序列数据
3.4 4D 图像数据
3.5 5D 视屏数据
第四章 - 量化金融的张量
4.1 简介
4.2 JoinQuant 之 A 股
4.3 Quantopian 之美股
第五章 - 张量运算
5.1 化繁为简
5.2 由简推繁
总结
1
线性代数的张量
线性代数大家肯定学过标量、向量和矩阵,它们分别称为 0 维张量、1 维张量和 2 维张量,而高于 2 维的张量统称为 n 维张量 (n ≥ 3)。
2
编程语言的向量
很多编程语言把张量当成数据的容器 (container)。在计算机中最终处理的都是数值型数据,因此张量大多指一个装着数值类变量的容器。接下来我们看看 Python, TensorFlow, MXNet, PyTorch 和 Matlab 里面的张量长什么样把。
2.1
Python
深度学习框架 Keras 就直接用 Python 的 numpy 的模块来使用张量的。上面也讲过,张量就是多维数组,不像 Keras 直接用 Python 的 numpy,其他深度学习框架对张量或多维数组稍微做了些改变,比如:
Tensorflow 里用 tf.Tensor
MXNet 里用 ndarray
PyTorch 里用 torch.tensor
首先从 Python 里面导入 numpy 模块。这里的 np 是 numpy 的缩写形式。
import numpy as np
下面是用 Python 的 numpy 来定义 0 到 4 维的张量。
# 0维张量
X0 = np.array(42)
# 1维张量
X1 = np.array( [1 2] )
# 2维张量
X2 = np.array( [1 2], [3 4] )
# 3维张量
X3 = np.array([[[1, 4, 7], [2, 5, 8], [3, 6, 9]],
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[9, 8, 7], [6, 5, 4], [3, 2, 1]]])
# 4维张量
X4 = np.ones( (60000, 28, 28, 3) )
不难看出
X0, X1, X2, X3 都是用 np.array 直接设定张量里的元素来定义张量
X4 用 np.ones 和张量的形状 (60000,28, 28, 3) 来定义一个所有元素都是 1 的张量
2.2
TensorFlow
顾名思义,TensorFlow 建立了计算图,让张量 (tensor) 从中流动 (flow),因此取名 TensorFlow。首先从 tensorflow 里面导入 tf.Tensor 模块。这里的 tf 是 tensorflow 的缩写形式。
import tensorflow as tf
tf.Tensor 由以下两个特征定义:
数据类型 (data type),包括整数、浮点数和字符等
形状 (shape)
Tensor 中的每个元素都具有相同而其已知的数据类型,形状是张量的每个维度 (TensorFlow 称 rank) 上的元素个数,而且可能只是部分已知。比如一张彩色照片由宽 28,高 28,3 色道的元素组成,那么该三维照片数据的形状 (完全可知) 可写成
[28, 28, 3]
将照片当做神经网络的输入时,