Python量化交易实战之使用Resample函数转换“日K”数据
作者:《虚幻私塾》 发布时间:2023-07-30 07:31:11
使用Resample函数转换时间序列
一、什么是resample函数?
它是Python数据分析库Pandas的方法函数。
它主要用于转换时间序列的频次。可以做一些统计汇总的工作。
什么叫转换时间序列的频次呢?
比如说股票的日k和周k,
假设我只能获取到股票日K的数据,比如说11月1号到11月5号,那怎么样将它转换为以周为单位的K线呢?
日期 | 周期 | 开盘价 | 收盘价 | 最高价 | 最低价 |
---|---|---|---|---|---|
11月1号 | 周一 | 1.11 | 1.11 | 1.11 | 1.12 |
11月2号 | 周二 | 1.12 | 1.12 | 1.11 | 1.12 |
11月3号 | 周三 | 1.13 | 1.13 | 1.11 | 1.12 |
11月4号 | 周四 | 1.15 | 1.14 | 1.11 | 1.12 |
11月5号 | 周五 | 1.14 | 1.15 | 1.11 | 1.12 |
首先我们要明确,周K的开盘、收盘、最高、最低是什么。每周的开盘价是当周第一天的开盘价,收盘价是当周最后一天的收盘价,它的最高价是这周最高的价格,最低价是本周所有最低价中最低的价格。所以你去看炒股平台,它的周k都是以周五的交易日为记录的时间点位置。开盘、收盘、最高、最低是按照我刚刚讲解的这个规则来计算的。至于月K、年K的选取规则也是一样的。月K的周期是一个月,年K的周期是一年。
这个计算准确性你也可以通过网上的数据进行验证。这个计算规则,包括开盘、收盘、最高、最低的计算,收拾resample函数可以做到的事情。此外Resample还有个功能,就是做统计汇总,比如说我想计算一支股票总的周成交量,就可以使用Resample.sum函数去把周一到周五的成交量加起来。
为了方便大家记忆 ,你也可以把resample理解为Excel表格中的透视表功能。你可以按照日期做各种筛选和汇总统计的。最重要的是他可以按照日期。
二、实战Resample函数
因为这2节课还是一些比较基础的部分,所以还没有做模块化的内容。
我们会在创建股票数据库的时候 来做真正的模块化的工作。到这里都是初级的脚本的形式。先提前说下。
1.日K 转换为 周K
1.1函数文档学习
谷歌搜索Pandas Resample
:第一个链接就是这个函数的官方文档
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html
这里有介绍:Resample是属于Pandas DataFrame下面的方法。这里有关于参数的解释。
这里我们只对2个常用参数讲解,一个是rule,另一个是closed。
rule表示的是你放一个什么样的周期性指标在里面,用m代表Month,Y代表Year,w代表Week,
closed代表你取哪一个分界线,举例来说,比如说我把日k转换为周k,到底我是取周一为分界线还是周五为分界线呢?这就是通过closed来确定的。
这里有它的例子:
>>>index = pd.date_range('1/1/2000', periods=9, freq='T')
>>>series = pd.Series(range(9), index=index)
>>>series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64
这里首先创建了一个时间序列的DataFrame
,就是这个series
变量。你可以理解为它是一个只有一个字段的表格样式。接着往下看:
>>>series.resample('3T').sum()
2000-01-01 00:00:00 3
2000-01-01 00:03:00 12
2000-01-01 00:06:00 21
Freq: 3T, dtype: int64
这里使用了Resample
方法,3T
就是3分钟,T
表示分钟。sum()
就是汇总,也就是针对这一列数据进行汇总。
也就是说,每3分钟统计依次。注意到,这个时间序列汇总的时间取的值是3分钟的第一分钟。如果我想取时间周期的最后一分钟,可以将label的值改为“right":
>>>series.resample('3T', label='right').sum()
2000-01-01 00:03:00 3
2000-01-01 00:06:00 12
2000-01-01 00:09:00 21
Freq: 3T, dtype: int64
1.2实战
获取日K真实的数据:
#获取日k
df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00',count=20, frequency='1d', fields=['open','close','high','low','volume','money'])
print(df)
可以看到获取到了4月28号
到5月28号
的所有数据。为了更方便理解 我们再添加一列数据,就是当前日期是星期几
的列。
#获取日k
df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00',count=20, frequency='1d', fields=['open','close','high','low','volume','money'])
df['weekday']=df.index.weekday
print(df)
这里0
代表周一,这里如何转换为按“周”统计呢
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week = df['open'].resample('W').first()
print(df_week)
可以看到这里的2021-05-30
是一个礼拜的最后一天。它对应的开盘价确实是这个数字。说明我们计算的周K数据是正确的。
收盘价就是每周收盘价
最后一天的数据。
最高价就是每周收盘价
的最大值。
最低价就是每周收盘价
的最小值。
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week['open'] = df['open'].resample('W').first()
df_week['close'] = df['close'].resample('W').last()
df_week['high'] = df['high'].resample('W').max()
df_week['low'] = df['low'].resample('W').min()
print(df_week)
对比数据,close是最后一天的收盘价的数据。high是当前周的每天的最高价的最高价。low是当前周的每天的最低价的最低价。
我们通过不到10行代码就能将日K
的数据转换为周K
的数据。
2.汇总统计功能(统计月成交量、成交额)
汇总成交量和成交额
我想要把volume
(成交量)和money
(成交额)转换为总成交量和总成交额
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week['open'] = df['open'].resample('W').first()
df_week['close'] = df['close'].resample('W').last()
df_week['high'] = df['high'].resample('W').max()
df_week['low'] = df['low'].resample('W').min()
df_week['volume(sum)'] = df['volume'].resample('W').sum()
df_week['money(sum)'] = df['money'].resample('W').sum()
print(df_week)
3.日K 转换为 月K
假设我有一年的数据,如果想转换为月K应该怎么转?
只需要改2个地方:
添加
start_date
获取到一整年的数据将
resample
的参数改为M即可,M代表Month
#获取日k
df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00', start_date='2020-05-30', frequency='1d', fields=['open','close','high','low','volume','money'])
df['weekday']=df.index.weekday
print(df)
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week['open'] = df['open'].resample('M').first()
df_week['close'] = df['close'].resample('M').last()
df_week['high'] = df['high'].resample('M').max()
df_week['low'] = df['low'].resample('M').min()
print(df_week)
来源:https://blog.csdn.net/biggbang/article/details/117433870
猜你喜欢
- CSRFCSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送
- 摘要Beautiful Soup 是一个可以从 HTML 或 XML 格式文件中提取数据的 Python 库,他可以将HTML 或 XML
- 注意,一般官方接口都带有可导功能,如果你实现的层不具有可导功能,就需要自己实现梯度的反向传递。官方Linear层:class Linear(
- 一、原型模式原型是相对于复制、克隆而言的,但是不同于模板,模板创造出的东西是一模一样,而原型创造出的东西是允许存在差异化和个性化的。原型模式
- 这是个人对selenium.webdriver写的一些常用操作的二次封装,也就相当于重写了,不再使用自带的框架,用自己写的框架完成。这样的话
- <?php function BigEndian2Int($byte_word, $signed = false) { $int_va
- 一个功能的实现,可以用多种语句来实现,比如说:while语句、for语句、生成器、列表推导、内置函数等实现,然而他们的效率并不一样。写了一个
- 前言本文提供获取视频时长的python代码,精确到毫秒,一如既往的实用主义。环境依赖 ffmpeg环境安装,可以参考:window
- 事情开始得很简单。MegaWare公司市场部门想要一个新的网站来发布文档,开发团队觉得使用SQL Server 2000数据库作为文档存储仓
- 经常看见有人问,MSSQL占用了太多的内存,而且还不断的增长;或者说已经设置了使用内存,可是它没有用到那么多,这是怎么一回事儿呢? 首先,我
- 如何生成斐波那契數列斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。用计
- 前言网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或
- 1、简要说明结巴分词支持三种分词模式,支持繁体字,支持自定义词典2、三种分词模式全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快
- 前言快过年了,又到了公司年底评级的时候了。今年的评级和往常一下,每个人都要填写公司的民主评议表,给各个同事进行评价打分,然后部门收集起来根据
- 调取摄像头的实现import numpy as npimport cv2cap = cv2.VideoCapture(0)#参数为0时调用本
- 最近看到大家都练习写树,偶也学习学习写了一个,大家多多批评,我好进步。不过我看了一些树的xml文档都是在xml中就已经有了树的结构,所以我写
- <?php /** * 单例模式 * * 保证一个类仅有一个实例,并提供一个访问它的全局访问点 * */ class Singleto
- 本文实例讲述了Python设置默认编码为utf8的方法。分享给大家供大家参考,具体如下:这是Python的编码问题,设置python的默认编
- 本文实例讲述了php实现通过cookie换肤的方法。分享给大家供大家参考。具体如下:saveStyleSheet.php页面如下:<?
- 一、背景我们在进行代码调试时,通常使用两种方式。print 输出调试的内容或者标识通过断点调试debug但是我想知道代码的中间的每一行程序运