用苹果股价详解量化分析的4种基本操作

Python最近几年的热度越来越高,其在多个领域都得到了广泛的使用,尤其是在量化分析方面,最近几年可以说是得到了飞速发展,现在说它是量化分析第一语言也不为过,笔者今天就介绍一下Python在量化分析中的一些基本使用操作。

今天讲的操作共有4种,都是我们经常用到的,而这4种操作都要用到pandas库,因为是量化分析,所以也要用到一些股票数据,我们就用“宇宙第一大股”苹果公司的股票数据来作为演示。

首先还是导入各种库。

import pandas as pd
import numpy as np
import yfinance as yf

这里我们稍微介绍一下yfinanceyfinance是使用Yahoo! Finance数据源的一个库,这个库的优点是下载速度快(没有被墙)、免费,同时导出来的数据就是pandas.DataFrame格式,非常好用。然后就是下载我们所需的苹果公司的股票数据,这里我们下载过去5年的数据,即2015年1月1日到2019年12月31日的数据,代码如下。

df = yf.download('AAPL', start='2015-01-02', end='2020-01-01', progress=False) #progress是进度显示条,最好关闭

yfinance的时间参数有些不同,其是滞后一天的,所以我们要下载第一天2015年1月1日的数据,则要设置为'2015-01-02',截止时间也同样延后一天,同时设置progress=False,以关闭下载进度条。下载好的数据大致如图1所示。

图1. 苹果股价数据示例

有了数据,我们就开始介绍一下这4种基本操作。

一、rolling window

rolling window是对某个窗口期内的数据进行操作,其原理和我们常用的groupby有些类似,不过是在窗口期内进行操作,其使用方法如下。

df_rolling = df.rolling(window=3)
df_rolling.max()[:10]
df_rolling.sum()[:10]

这里df_rolling可以看作是一个中间变量,就和我们进行过groupby之后形成的变量一样,然后再在其基础上进行操作。比如我们进行max和sum操作,得到的结果就如图2所示。

图2. rolling的结果

rolling操作有几个参数,作用分别如下。

(1)window:表示窗口期的大小,类型为int,比如df.rolling(window=3).max()就表示以3天为窗口期,在连续的3天(也就是3行数据)内进行取最大值操作。因为第一天和第二天都不满3天,所以这两个值都空缺,df_rolling中前两行也因此都是NaN,然后依次向下滚动操作。

(2)min_periods:最小观测值,int类型,默认与window相等。其值一般小于等于window值,比如df.rolling(3,min_periods=2).max()[:10],就表示一个窗口期内至少有2个值存在,否则就不予计算,其结果如图3所示。假如有3个连续值都是NaN,则这个结果不参与计算。

图3. min_periods的结果

(3)center:是否使用窗口期的中间值作为label,默认为false。这个一般配合min_periods使用,比如df.rolling(window=3, min_periods=2, center=True).max()[:10]的结果如图4所示,其第一和第二行数据都存在,因为是以三行中间那行为label,向前向后各推一行,又因为min_periods=2,所以第一行也有数据,这和图3是有区别的。

图4. center的结果

(4)win_type:指定窗口类型,默认为None,不作指定则认为窗口期内各个数据的权重相等,这个比较复杂,一般用不到。比如设置为’hamming’,则返回一个Hamming窗口,其具体算法可以参考scipy.signal.windows的官方文档。

(5)on:对于多列数据,用on来指定在哪一列上进行操作,这个有点多余,我们可以直接在选取数据时就指定好数据了。

(6)axis:值为1或0,默认为0。1表示在横向上进行操作,0表示纵向上进行操作。

(7)closed:定义区间的开闭,默认为'right',即左开右闭。可以设置为'right''left''both'或者'neither'

而除了上面介绍的max和sum操作,其他操作如median、var、std、corr、aggregate等都能使用,这里笔者不再一一赘述。

二、expanding window

expanding window是以递增形式对整个数据进行操作。其一共有3个参数,分别是min_periods、center和axis,其作用和rolling中的一样,所以这里不再介绍。expanding window的使用方法如下。

df.expanding(3).sum()[:10]

图5. expanding的结果

其结果如图5所示。我们可以看到,每行结果都是对前面所有行结果的加和,整个数据就是在不断地expand,所以才叫expanding,其他操作如median、var、std、corr、aggregate等也都能使用。

三、exponentially weighted moving window

exponentially weighted moving window就是指数式加权递减的移动平均。各数值的加权而随时间而呈指数式递减,越近期的数据加权越重。

exponentially weighted moving window有如下参数可选,

(1)com:主要用于构成α,参考图6。

(2)span:根据范围指定衰减,α=2/(span+1),其中span≥1。

(3)halflife:根据半衰期指定衰减,α=1−exp(log(0.5)/halflife),其中halflife>0。

(4)alpha:直接指定平滑系数α,0<α≤1。

(5)min_periods:和前面例子中用法相同。

(6)adjust:是否除以开始阶段的衰减调整因子,默认为True,主要用于解释相对权重的不平衡性。

(7)ignore_na:是否忽略缺失值。

(8)axis:和前面例子中用法相同。

图6. ewm的递推公式

exponentially weighted moving window的递推公式如图6所示,其中com、span、halflife、alpha这4个值至少指定一个,alpha的公式如式(1)所示,当adjust为False时,递推公式用式(2);当adjust为True时,用式(3)。其代码如下所示,结果如图7所示。

df.ewm(alpha=0.2).mean()[:10]

图7. ewm的结果

这个ewm的计算稍微复杂点,其方法只有5种,分别是mean、std、var、corr和cov,大家最好自己也动手试一下。

四、shift

shift说白了就是平移,即index不变,数据左右或上下移动指定行数。用法如下,结果如图8所示。

df.shift(1)[:10]

图8. shift的结果

shift一共有4个参数,作用如下。

(1)period:表示移动的幅度,可以是正数,也可以是负数,默认为1。

(2)freq:格式为DateOffset、timedelta或string,可选参数,默认值为None,只适用于时间序列,如果这个参数存在,那么会按照参数值移动时间索引,而数据值没有发生变化。

(3)axis:用法和前面例子相同。

(4)fill_value:移动后缺失值的填充。

shift很常用,但理解起来也很简单,这里也不再赘述。

结语

本文主要从一些基本操作入手,来展示一下量化分析的部分应用,量化分析是一个很广泛的领域,大家如有兴趣也可以自行查找资料来学习,笔者以后也会再写一些这方面的文章分享给大家。

作者简介:Mort,数据分析爱好者,擅长数据可视化,比较关注机器学习领域,希望能和业内朋友多学习交流。

赞赏作者

Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。

长按扫码添加“Python小助手”

▼点击成为社区会员   喜欢就点个在看吧

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值