张量 101

本文详细介绍了张量的概念及其在不同领域的应用,从机器学习的基础到量化金融的数据处理,通过实例展示了张量从标量到多维张量的发展过程,并涉及Python、TensorFlow、MXNet、PyTorch和Matlab中的张量操作。通过对股票数据的处理,解释了张量在股票投资中的应用,最后讨论了张量运算,包括重塑、点乘、广播和元素层面运算。
摘要由CSDN通过智能技术生成


最近身体不适,写不动文章了,找出之前写过两篇经典的老文分享给大家。

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 由以下两个特征定义:

 

  1. 数据类型 (data type),包括整数、浮点数和字符等

  2. 形状 (shape)

Tensor 中的每个元素都具有相同而其已知的数据类型,形状是张量的每个维度 (TensorFlow 称 rank) 上的元素个数,而且可能只是部分已知。比如一张彩色照片由宽 28,高 28,3 色道的元素组成,那么该三维照片数据的形状 (完全可知) 可写成

    [28, 28, 3]

将照片当做神经网络的输入时,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值