29期第十三周笔记

Week 13

本周学习主要内容包括Python爬虫、文本相关操作、金融量化交易、Pandas时间序列(基础)

量化交易

流程

量化交易的步骤和数据分析联系:

  1. 目标(确定目标):要交易的金融产品
  • 股票:A股、港股、美股(交易商:IB盈透,老虎证券)
  • 期货:国内商品期货、外盘期货、贵金属
  • 外汇
  • 期权:股票期权、商品期权、外汇期权
  • 其他:债券、CFD(差价合约)
  1. 数据(数据搜集和规整):搜集和规整金融产品相关数据
  • 实时行情:新浪、百度等各大门户都有股票期货数据接口可直接抓取
  • 历史数据:tushare
  • 在线量化平台:优矿、聚宽、掘金、米筐、Bigquant,真格、万矿、镭矿、量化云、点宽 等等
  1. 分析(策略研发):最重要
  • 通过各种途径方式获得灵感思路,想出交易策略
  • 编程复现策略,回测验证
  • 反复迭代,直到策略达到标准
  1. 应用(实盘交易)
  • 半自动量化:编程自动化分析,手动下单。可以降低难度和交易风险。中低频策略可用
  • 全自动量化:量化交易所有步骤都编程全自动执行
    • API接口调用:需交易商提供接口,这是开户机构允许的正规自动化交易方法
      • 一般都是Web API接口,通过JSON交互数据
      • 技术方案:Python:requests
      • 国内股票不开放接口,期货有CTP
    • 其他方式:下面的方法都是没API情况下的取巧方法,官方并不支持所以有风险。使用技术基本为Python爬虫和自动化测试技术
      • 桌面客户端模拟:要求有桌面客户端
        • 技术方案1(常用):软件:autoit,按键精灵
        • 技术方案2:Python:pyautogui。操纵鼠标、键盘、截图等,类似外挂
      • Web界面模拟:要求有Web交易页面,编程操纵交易商的Web交易页面完成自动交易
        • 技术方案:Python:selenium
      • 移动端模拟:要求有移动端APP
        • 技术方案:Python:Appium(移动端UI自动化测试)

策略性能

验证:

衡量交易策略的性能好坏有很多指标,最重要的是最大回撤和夏普比率,二者主要关注的都是风险,而不是收益

  • 年化收益率
  • 最大回撤
  • 夏普比率

普遍指标

一般业内规矩,一个交易账户如果:

本金最低5万美元(或50万人民币),
实盘交易3年(最低1年),
5%最大回撤,20%以上年化收益率(最少15%)

无论去什么地方,找什么机构(个人)要资金、合作、代客理财,都没有任何问题了。

实际指标达不到上述指标,也不意味着不能找钱,就是说服力差些
例如:本金只有三五万人民币,实盘只有几个月甚至只有回测记录,回撤大但收益大等等情况,具体情况具体看待

注意:国际上特别注重最大回撤,别的还可以商量,如果最大回撤太大了,基本账户就废了只能重写开始再来一个

年化收益率

年化收益:(平均收益率,累计收益图,时间段一般都是年)

  • 平均一年盈利百分之多少
  • 年化收益率看起来重要,但只是相对外行而言,因为它没有考虑策略的波动性风险(不看你挣多少,看你赔多少)
  • 大部分银行卖的基金3.x%年利率,大额存单4%年利率(百万级),大的信托8%年利率(千万级),这些投资标的风险都非常小,所以你的策略起码得超过他们,而且风险不能太大

年化收益率公式:

年化收益率 = ((策略最终价值 - 本金) / 本金) / 你交易的天数 * 正规交易天数 × 100%
或:
年化收益率 = (策略最终价值 / 本金 - 1) / 你交易的天数 * 正规交易天数 × 100%
注:正规交易天数一般为250天,365天除去周末和节假日等的大概天数,具体根据自己情况而定

最大回撤

最大回撤:(单位时间最大亏损)在特定时间段(通常是每年)内帐户净值曲线中最大的峰谷下降特征,通常以百分比形式引用

最大回撤公式:

最大回撤率 = (策略单位时间历史最高价值 - 策略单位时间最低价值) / 策略单位时间历史最高价值 * 100%
或:
最大回撤率 = max(1 - 策略当日价值 / 策略单位时间历史最高价值),注:每天的结果取最大值

夏普比率

夏普比率(Sharpe Ratio):收益风险比,是超额收益的均值和超额收益标准差的比

夏普比率公式:

(策略年化收益率 - 回测起始交易日的无风险利率) / 策略收益波动率
注:

策略收益波动率:用来测量资产的风险性,计算方式为:策略每日收益的年化标准差

无风险利率(超额收益):指的是无风险投资的回报率(本金的成本,默认3%),具体指的是某国固定利率国债收益率曲线上 10年期国债的年化到期收益率(或其他锚定对比的指标如标准普尔指数)。

中国 2.783:https://cn.investing.com/rates-bonds/china-10-year-bond-yield
美国 0.707:https://cn.investing.com/rates-bonds/u.s.-10-year-bond-yield
世界:https://cn.investing.com/rates-bonds/government-bond-spreads

无风险利率(超额收益)表示的意思有:
* 你资金的成本,某些情况下如果你的钱是自己的(不是借的没有利息)也不在乎机会成本,可以不减
* 你的年化收益率减去基本投资回报,剩下的才是你策略的超额回报(就像你用资金赚的钱得减去银行存钱的利息剩下才是你真赚的),必须减

  • 夏普比率解释:

    许多统计量被用来度量 调整风险收益,通常都是设法度量获得收益的成本(风险角度)。最典型的是 夏普比率

      - 你的投资每承受1单位风险,会产生多少单位超额回报
      	- 例如夏普值为2的策略指每承担1个单位的风险,将会获得2个单位的高于无风险利率的收益率
    

让策略的夏普率增高的方法:收益要高,收益的波动要低

注意:
用调整交易时间频率的方法也可以算出高夏普率,但实际上是错误的,不要这么做
如计算 策略每日收益的年化标准差 时,作为时间频度的除数变大(如由250天/次变为高频的一百万次),夏普比率就会变大。所以高频策略的高夏普率是错算的。

不同时间频度的夏普比率不能直接比较,一般只看年化夏普率(以天为时间频度,一般250天),
如比较月收益和年收益的夏普比率,月度标准差需要乘以根号12(因为标准差随着时间的平方根等比例增长),而且这种算法只在特定情况下才有效,避免使用

  • 当年化夏普率为 3 时,净值曲线(在对数坐标下)基本上是一条直线了;
  • 当年化夏普率为 2 时,它的净值曲线也仅在局部有一些小的波动;
  • 当年化夏普率为 1 时,它的净值曲线在全局范围内呈现出更大的波动;
    • 即便如此它也是个靠谱的赚钱策略

私募基金市场上:如果夏普率小于1,这基金产品基本卖不出去

如果夏普率大于2,很多人会选择自己干
(很多对冲基金的要求,回测年化夏普率要高于2,甚至要求大于3(极少))
因此,绝大多数还行的发行产品夏普率都是1-2之间

文本挖掘

  • 文本挖掘(Text Mining),又名文本分析、非格式化数据分析、非结构化数据分析

格式化数据:数据经过人为整理,提高了维度

  • 0维,标量:a = 123
  • 1维,向量:a = [1,2,3]
  • 2维, 矩阵:a = [[1,2,3], [4,5,6]]
  • 3维或以上,张量:a = [[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]

日常见到的格式化数据类型:

  • 0维:单值变量
  • 2维:Excel,CSV,MySQL数据表
  • 3维或以上:彩色图像,JSON,MongoDB,HTML

非格式化数据:未经过整理的低维(0维)原始数据

  • 除了少数格式化数据,绝大多数数据都是非格式化(一大坨文本数据)

从非结构化(非格式化)文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好地组织信息

- 现实世界中,可获取的信息绝大多数是以非结构化0维文本形式存储的,如新闻、论文、书籍、电子邮件和Web网页
- 这些数据都存在不同程度的非结构化问题,维度有低有高
- 结构化程度低的例如一篇纯文本文章,结构化程度高的例如一个精心设计的WEB网页,内含格式化的标题、标签、摘要、作者等等

中文文本挖掘信息的精确度、正确率是世界性难题,为保证信息最大限度的精确可用,实际工作中应以人工设置信息格式为主,文本挖掘技术手段为辅:

- 挖掘再牛,不如用户手动打标签
- 分析再牛,不如用户手动评分

文本分析常用库:

  • 爬虫-requests,lxml,JSON
  • 中文分词-Jieba
  • 词云-WordCloud
  • 中文情感分析-SnowNLP
  • 语义结构分析-Gensim

Python爬虫入门

  1. 抓取:爬虫抓取网页图片和文本(绕过反扒措施)
  2. 解析:解析抓取数据
  3. 保存:保存和载入抓取数据

使用Python完成:

  • 抓取:requests库,发送网络请求,返回响应数据
  • 解析:lxml库,解析HTML文档标签,返回指定内容
  • 保存:JSON库,(Python自带)转换Python列表或字典数据为字符串,保存至JSON文本,或读取JSON文本转为Python列表或字典数据

抓取:爬虫抓取网页图片和文本

  • 二进制文件
  • 文本文件

爬虫是实用程序自动化发送请求/获取响应的程序,主要用来抓取网页数据

抓取网页图片等二进制资源

img = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'

requests.get(img) #返回http状态码

r = requests.get(img).content #返回抓取数据 - 二进制
r #注释输出,自己解除注释

#二进制数据保存为图片(二进制)文件
with open('baidu/baidu.png','wb') as f:
    f.write(r)

抓取网页文本数据

抓取网页源代码

url = 'https://www.baidu.com/'

r = requests.get(url)
r.content #中文乱码

temp = r.content.decode('UTF-8',errors='ignore') #二进制解码,解决中文乱码;默认转UTF-8,忽略错误

#文本数据保存为网页(文本)文件,注意编码
with open('baidu/pachong/baidu.html','w',encoding='UTF-8') as f:
    f.write(temp)

绕过基本的反爬虫措施抓取网页

发送带header的请求

  • 爬虫伪装为浏览器访问:
    • User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
  • 爬虫以登陆用户身份访问:
    • Cookie(略)
#带header请求

headers = {
     
    #去浏览器检查窗口复制
    'User-Agen':'User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    'Cookie':''
}

url = 'https://www.baidu.com/'

#rh = requests.get(url).content.decode() #不带header
rh = requests.get(url,headers=headers).content.decode(errors='ignore') #带header,解除可能的反爬虫措施
rh

#保存新文件
with open('baidu/pachong/baidunews.html','w',encoding='UTF-8') as f:
    f.write(rh)

解析:用lxml解析网页结构

  • XPath语法:选取节点

    百度

  • HTML三种节点:

    • 元素节点
    • 属性节点
    • 文本节点

    nodename 选取此节点的所有子节点,如:div选取div元素对象,及子对象
    @ 选取属性值
    text() 选取元素内容,文本值

  • 选取方式:

    / 从根节点选取
    // 从匹配当前选择的结点选择文档中的节点,不考虑他们的位置
    . 选取当前节点
    … 选取当前节点的父节点

  • 解析网页内所有图片并抓取

  • 一般情况下,数据抓取并解析后,需要字符串清洗处理后才能转为干净的列表模式

    例如使用Python字符串和列表处理函数:

      - 字符串:替换replace(),分割split()(Pandas也有类似函数,向量化的)
      - 列表:合并join(),移除remove(),追加append()
    

    等等,清理数据

  • 列表页抓取所有内页url,再次遍历抓取的URL,抓取所有URL内页的内容

保存:JSON相关操作

  • JSON系列列操作函数

    • 字符串和字典互相转换
      • json.loads():str转成dict

      • json.dumps():dict转成str

      • json.load():从文本文件中断区str的JSON数据,常用!!

      • json.dump():Python数据类型直接保存为str的JSON文本文件,常用!!

    json.dumps()把列表或字典转成字符串

方法1:手动保存和读取JSON文档
# Python数据保存为JSON文档
with open("baidu/pachong/a.json", "w", encoding='utf-8') as f:
    f.write(json.dumps(c))  # 列表手动转字符串后保存文本
    
# JSON文档读取为Python数据
# 此方法不推荐(JSON文档有特殊字符可能会解析出错)
with open("baidu/pachong/a.json", "r", encoding='utf-8') as f:
#     j = f.readline()  # 字符串
    j = json.loads(f.readline())  # 读入字符串手动转为Python数据
方法2:自动保存和读取JSON文档,推荐
# Python数据保存为JSON文档
with open("baidu/pachong/a2.json", "w", encoding='utf-8') as f:
    json.dump(c, f)  # 直接将列表保存为文本(自动转化)

# JSON文档读取为Python数据
with open("baidu/pachong/a2.json", "r", encoding='utf-8') as f:
    j = json.load(f)  # 读入字符串自动转为Python数据
  • 小网站抓取,简单技术,加time.sleep()防止网站崩溃和被封
  • 大型数据抓取项目往往使用分布式服务器/多线程/多进程等技术加速抓取

抓取数据注意事项

  • 注意抓取的速度(防止影响服务器性能,或者被发现)
    • for循环内加time.sleep(1)降低循环速度
  • 注意合规问题(不要违法)
    • 隐私信息不要抓
    • 如果非要抓,不要被发现

中文分词

  • 分词,就是将0维的非格式化文本转为格式化、向量化的数据

  • 中文分词(Chinese Word Segmentation)是将一个汉字序列切分为一个一个单独的词

  • 英文文档中,单词之间是以空格作为自然分界符的,而中文词没有一个形式上的分界符,虽然英文也存在同样的短语划分问题,不过在词上,中文分词相比英文复杂困难得多

    ‘0维的非格式化文本转为格式化’

    分词:
    [‘0维’,‘的’,‘非格式化’,‘文本’,‘转为’,‘格式化’]

  • 中文分词库 - jieba

中文分词基础步骤

  1. 载入数据
  2. 分词
  3. 分词后的数据转回文本
  4. 保存为文本文件

为了增加分词的准确率:

  • 添加自定义词典
    • 一个词错误分为两个词,解决此问题
    • 只能添加不能删除
  • 动态增加或删除系统词典
    • 可以添加可以删除
    • 使用更灵活:一个词错误分为两个词/两个词错误分为一个词
  • 去停用词
    • 分词后,将不想出现在分词结果内的词删除

修改自定义词典或停用词文本文件时,不要使用记事本修改(保存时会村委UTF-8带BOM格式,导致程序载入出问题)

  • \r\n

添加自定义词典

  • 当句子中的某个词没有被识别分出时,可以指定自己自定义的词典,以便包含jieba词库子没有的词

  • 词典文件的内容可以根据项目不断增加,查看初步分词,将分词不正确的词加入自定义词典然后重新再分,直到正确率达标

  • 虽然jieba有新词识别能力,但自行添加新词可以保证更高的正确率

    jieba.load_userdict(file_name) #file_name 为文件类对象或自定义词典的路径

词典格式:

  • 词中间不能有标点符号
  • 一个词占一行
  • 每一行分为三部分:词语、词频(可省略)、词性(可省略)
  • file_name若为路径或二进制方式打开的文件,则文件必须为UTF-8 编码

次品省略时使用自动计算也能保证分出该词的词频

去停用词(stopword)

  • 与上面相反,当一个字符串不是词,jieba误将其分为词,或者我们不想将某些不重要的词分出来(想删掉某些分出的词)可以自定义停用词词典
  • 停用词就是要从分词结果删掉的垃圾无用词
  • 词典中的词不会出现在分词结果中
  • 停用词词典的内容可以根据项目不断增加

课程内附的通用停用词词典,涵盖大部分无用字词,可以根据项目需求不断添加累计补充


停用词jieba没有自带,需要手动实现

  1. 载入停用词
#方法1:手工构造停用词列表
#stopword =['哎','的','是','你','吗','!',',','?']

#方法2:载入停用词文件
#with open('data/stopword.txt','r',encoding='UTF-8') as f:
#    print(f.read())
#    s = f.read()
#stopword = s.split('\n')

#stopword

#方法3提升,若停用词表的特殊词载入时被自动转义,可以判断并恢复
stopword = []
with open('data/stopword.txt','r',encoding='UTF-8') as f:
    for line in f.readlines():
        l = line.strip()
        if l =='\\n':
            l == '\n'
        if l == '\\u3000':
            l == '\u3000'
            
        stopword.append(l)
  1. 去停用词
#去停用词,第一步,求差集

x = np.array(b)
y = np.array(stopword)
y

np.in1d(x,y)

z = x[~np.in1d(x,y)]
#非运算,在x内且不在y内的词

#第二步:去掉一个字以下的词
#k = []
#for i in z:
#    print(len(i))
#    if len(i) > 1:
#        k.append(i)
#k

k = [i for i in z if len(i)>1]

抽取文档关键词

抽取文档关键词用于在一篇文章中获取其核心内容(描述了什么?)又叫生成摘要、打标签、关键词提取等

1. 词频统计(词频分析)

  • 词在文本中出现的次数(频次),某种程度上能当作文本的标签,表示文本内容
  • 不是很精确
  • 统计前最好先去完成自定义词典和区停用词的前期操作

方式1:使用词频方式提取关键词

#1. 自定义词典
jieba.load_userdict('data/custom.txt') #应用自定义词典

#2. 分词
cut = jieba.lcut(txt)

#3. 去停用词
#载入停用词表
stopword = []
with open('data/stopword.txt','r',encoding='UTF-8') as f:
    for line in f.readlines():
        l = line.strip()
        if l =='\\n':
            l == '\n'
        if l == '\\u3000':
            l == '\u3000'
            
        stopword.append(l)
        
stopword

################

#去停用词,第一步,求差集
x = np.array(cut) #降分好的词列表转为数组
y = np.array(stopword) #将停用词转为数组
z = x[~np.in1d(x,y)] #x的元素是否包含与y

#第二步,去掉一个字的词
k = [i for i in z if len(i)>1]

#4. 计算词频并排序
result = pd.Series(k).value_counts()[:20]

#5. 保存结果
result.to_csv('data/keyword_fig.csv',header=0) #encoding='gbk'解决乱码

统计词频作为文档关键字的准确性不高

  • TF-IDF算法
  • Text-Rank算法

注:TF-IDF和Text-Rank算法运行都不需要手动去停用词,可以用内置函数自动去停用词


使用TF-IDF权重算法提取关键词

TF-IDF权重:

词频和重要词的综合分数(权重)

重要词:信息量大的词

一个词信息量大小的衡量

在本文章出现的次数多,在通用文档库出现的次数少,就是重要词

如:你我他,你好再见 这些词信息量很小
行业专有名词:如Python/MySQL,信息量很大
  • 首先,应用自定义词典
  • 然后,去掉停用词,系统自带,给抽取关键词用

词云 - WordCloud

  • 词云:对文本中出现的关键词按照出现频率通过改变字体字号颜色央视等方式集中显示
  • 频率较高的“关键词”予以视觉上的突出,从而给关键字设定直观的级别,过滤掉大量的低效文本信息,使浏览者只要一眼扫过词云就可以领略文本的主旨

安装WordCloud库

  • 如果系统未安装C++编译库,WordCloud库需要下载whl再使用pip安装

    http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
    pip install e:/wordcloud-1.5.0-cp36-cp36m-win_amd64.whl

数据载入

# 载入文本数据
with open('data/大话西游.txt', 'r', encoding='utf-8') as f:
#     print(f.read())
    txt = f.read()

分词

txt2 = ' '.join(jieba.cut(txt))
#print(txt2)

绘制词云

# 停用词

# 方式2:读入停用词文件为列表
with open('data/stopword.txt', 'r', encoding='utf-8') as f:
#     print(f.read())
    s = f.read()
stopword = s.split('\n')

# stopword
# 词云绘制时去停用词

基本版词云

wordcloud = WordCloud(font_path='data/font/arial unicode ms.ttf').generate(txt2)
wordcloud

plt.figure(figsize=(18, 10))
plt.imshow(wordcloud)
wordcloud = WordCloud(
    font_path="data/font/maozedong.ttf",  # 字体,不设置则汉字乱码
    background_color='white',# 设置背景颜色
    max_words=80, # 设置最大现显示词数
    max_font_size=80, # font_size可选
    stopwords=stopword,  # 去停用词
).generate(txt2)
wordcloud

plt.figure(figsize=(18, 10), dpi=72)
plt.imshow(wordcloud) # 绘制数据内的图片,双线性插值绘图 interpolation='bilinear'
plt.axis("off") # 去掉坐标轴

plt.savefig('images/test3.png', dpi=300, bbox_inches='tight')  # 保存为:带有最小白边且分辨率为300DPI的PNG图片

自定义背景的词云图

#读取背景图
alice_mask = np.array(Image.open("images/tgcf.jpg"))
# alice_mask

wordcloud = WordCloud(
    background_color='white',# 设置背景颜色
    max_words=100, # 设置最大现显示词数
    font_path="data/font/maozedong.ttf",  # 字体,不设置则汉字乱码
    stopwords = stopword,  # 去停用词
    mask=alice_mask,  # 设置背景图片
).generate(txt2)
wordcloud

plt.figure(figsize=(18, 10), dpi=300)
plt.imshow(wordcloud) # 绘制数据内的图片,双线性插值绘图 interpolation='bilinear'
plt.axis("off") # 去掉坐标轴

plt.savefig('images/test4.png', dpi=300, bbox_inches='tight') 

中文情感分析 - SnowNLP(了解)

  • 情感分析(Sentiment analysis,SA),又称倾向性分析、意见抽取(Opinion extraction)、意见挖掘(Opinion mining)、情感挖掘(Sentiment mining)、主观分析(Subjectivity analysis)
  • 情感分析是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程
  • 情感分析的目的是为了找出说话者/作者在某些话题上或者针对一个文本两极观点的态度。这个态度或许是他或她的个人判断或是评估,也许是他当时的情感状态(就是说,作者在做出这个言论时的情绪状态),或是作者有意向的情感交流(就是作者想要读者所体验的情绪)
  • 文本情感分析的应用非常广泛,如网络舆情风险分析,信息预测等。如通过Twitter用户情感预测股票走势,电影票房、选举结果等,均是将公众情绪与社会事件对比,发现一致性,并用于预测

SnowNLP(Simplified Chinese Text Processing),是一个python语言编写的类库,可以方便的处理中文文本内容,其开发受到了TextBlob的启发

结论:

  • 准确率比瞎猜高,但达不到人工打分准确率
  • SnowNLP库的训练基准数据是基于电商销售产品的,对饭店留言数据打分准确率一般
  • 做情感分析最好用户自行实现(网站增加打分功能,用户自行打分)

非格式化数据分析 - 语义结构分析 - Gensim(了解)

  • Gensim 是一个通过衡量词组(或更高级结构,如整句或文档)模式来挖掘文档语义结构的工具
  • 通过检查词出现的频率。gensim读取一段语料,输出一个向量,表示文档中的一个词。
  • 该向量表示可被用于训练一个“模型”。模型是从数据生成不同特征的算法集

下面主要使用词向量分析方法


词向量

  • word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。
  • 在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder
  • 词向量是将独热编码进一步处理(降维)的结果,如根据某段文本内的词频编码为向量

word2vec主要通过计算词向量之间的余弦相似度来分析词之间的距离关系远近(cosA=AC/AB)


Pandas时间序列

  • 时间序列(time series)是一种重要的结构化数据形式,应用于多个领域,包括金融学、经济学、生态学、神经科学、物理学等……

    时间序列:在多个时间点观察或测量到的任何数据都可以形成一段时间序列

    对Pandas来说,时间序列数据就是以时间类型作为索引的Series或DataFrame数据结构

  • 很多时间序列都是固定频率的,即数据点是根据某种规律定期出现的(比如每x秒、每x分钟、每周、每月、每年出现一次)

    时间序列也可以不定期,没有固定的时间单位或单位之间的偏移量

  • 时间序列数据的意义取决于具体的应用场景,主要有:

    • 时间戳(time stamp),特定的时刻(不能细分的时间点)
    • 时间间隔(interval),尤其是和结束时间决定
      • 固定时期(period),指一段时间,如2007年(指不是一个时间点,而是2007年1月1日-2007年12月31日这365天
  • Pandas提供了许多内置的时间序列处理工具和数据算法。因此可以高效处理非常大的时间序列,轻松地进行切片/切块、聚合、对定期/不定期的时间序列进行重采样等

    有些工具特别适合金融和经济应用

Python自带的时间和日期标准库

Python标准库包括日期(date)和时间(time)数据的数据类型

datetime.datetime(也可以简写为datetime)是用得最多的数据类型:

datetime模块是date和time模块的合集

datetime模块有五个类:

  • datetime.date:表示日期的类
  • datetime.time:表示时间的类
  • datetime.tzinfo:时区相关信息
  • datetime.datetime:表示日期时间的类(时间点)
  • datetime.timedelta:表示时间间隔

时间点

  • 某一具体时间点
  • 当前时间点
  • 返回当前系统时间点

时间间隔(时间差)

  • datetime.timedelta对象代表两个时间之间的时间差,两个datetime对象相减就可以返回一个timedelta对象

  • 针对时间存储,timedelta内部只能存储days,seconds,microseconds(天,秒,微秒),其他参数的值会自动按如下规则进行转换:

    • millisecond(毫秒)转换成 1000 microseconds(微秒)
    • minute 转换成 60 seconds
    • hour 转换成 3600 seconds
    • week 转换成 7 days

字符串和时间转换

  • 日期转字符串: .strftime()
  • 字符串转日期: .strptime()

Python中时间日期格式化符号:

年:
    %y 两位数的年份表示(00-99)
    %Y 四位数的年份表示(000-9999)
月:%m 月份(01-12)
日:%d 月内中的一天(0-31)
小时:
    %H 24小时制小时数(0-23)
    %I 12小时制小时数(01-12)
分钟:%M 分钟数(00=59)
秒:%S 秒(00-59)

%c 本地相应的日期表示和时间表示,如:Sat Feb 11 11:32:59 2017
%x 本地相应的日期表示,如:02/11/17
%X 本地相应的时间表示,如:11:32:59

%j 一年内的第x天(001-366)
%p 本地A.M.或P.M.的等价符。AM:(0:00-12:00);PM:(12:00-24:00)
%Z 当前时区的名称,默认为空
%% %号本身

星期:
        %a 本地简化星期名称
        %A 本地完整星期名称
        %w 星期(0-6),星期天为星期的开始
        %W 一年中的星期数(00-53)星期一为星期的开始
        %U 一年中的星期数(00-53)星期天为星期的开始
月:
        %b 本地简化的月份名称
        %B 本地完整的月份名称

Pandas时间序列 - 基础

  • Pandas外的时间序列一般以时间字符串或datetime对象表示(如列表形式)
  • Pandas中的一个基本时间序列对象,指的是以时间戳做索引的Series或Dataframe

你可能感兴趣的:(python)