拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Python量化交易开发04pandas核心用法,量化数据处理效率提升10倍

大家好, 我是量化老王。上一篇中, 我们掌握了基础语法, 这就宛如学会了“手工处理量化数据的基本功夫”。然而, 要是面对一只股票一年里250个交易日的行情数据, 又或者全市场几千只股票的基本面数据, 采用列表、字典进行手工处理, 将会无比繁琐。在这一篇里, 就带领大家掌握量化数据处理的“瑞士军刀”, 也就是库, 学会它能够让你的数据处理效率提升10倍以上。首先要明确其核心定位, 它是专门被用于数据处理以及分析的库, 其最为核心的两个数据结构为, 一种是一维数据, 类似于带有标签的列表, 另一种是二维数据, 类似于 Excel 表格, 在量化里 90%的场景都在使用它, 像存储行情数据、基本面数据、策略回测结果等情形, 本文将会围绕“量化实操”来展开, 不会讲述冗余的理论内容, 重点是要掌握“读取数据→数据清洗→数据计算→数据筛选”这四大核心流程。贴心提个醒: 要保证上一回安装的库是能够使用的状态版本为1.5.3, 把新建的项目打开项目命名是“”, 按照案例一行一行地去敲代码, 着重留意每一步所产生的输出结果去, 剖析“表格化数据处理”的内在逻辑。第一部分基础准备2行代码搞定环境使用之前, 得先进行“导入库”这个操作, 这可是使用第三方库时固定不变的流程, 就如同在使用工具之前要先从工具箱当中取出来一样。在量化过程里, 通常会把numpy搭配着一起导入, 原因是底层依赖numpy, 并且还会给库取简称, 像是pd、np, 以此来简化后续的代码书写。# 导入pandas和numpy库起简称pd和np量化行业通用约定 import pandas as pd import numpy as np # 验证库是否导入成功打印版本号 print(pandas版本, pd.__version__) print(numpy版本, np.__version__)运行代码之后, 要是输出版本处于1.5.3大概的范围、numpy版本处于1.24.3大概的范围, 那就表明导入成功了。要是提示“: No named ”, 那就参照上一篇的“坑3”, 要在其中手动安装对应版本的库。第二部分核心数据结构量化数据的“Excel表格”没错其核心, 实质是“带有标签的二维表格”, 存在行索引index以及列索引, 这分别对应Excel里的行号与列名。在量化范畴内, 我们常常运用它来存储行情数据日期、开盘价、收盘价、最高价、最低价、成交量, 其中列名和“日期、open、close、high、low、”相对应, 而行索引和具体日期相对应。1. 手动创建理解结构先通过手动创建简单的行情数据理解的结构# 1. 准备数据字典格式键是列名值是列表格式的列数据 stock_data { date: [2024-01-02, 2024-01-03, 2024-01-04, 2024-01-05, 2024-01-08], open: [8.12, 8.25, 8.31, 8.28, 8.35], close: [8.25, 8.31, 8.28, 8.35, 8.40], high: [8.30, 8.35, 8.33, 8.38, 8.42], low: [8.10, 8.22, 8.25, 8.26, 8.32], volume: [12000000, 15000000, 13000000, 14000000, 16000000] } # 2. 用pandas创建DataFrame df pd.DataFrame(stock_data) # 3. 设置“date”列为行索引量化中常用日期作为行索引方便按日期筛选数据 df df.set_index(date) # 4. 查看DataFrame打印前5行默认也是前5行适合快速预览数据 print(行情数据DataFrame) print(df.head()) # 5. 查看DataFrame基本信息了解数据类型、是否有缺失值 print(\n数据基本信息) print(df.info()) # 6. 查看数据统计摘要量化中常用快速了解价格、成交量的分布 print(\n数据统计摘要) print(df.describe())关键说明如下: 其一, df.head(), 其作用是查看前5行数据, 要是想查看后5行则需使用df.tail()其二, (), 通过它能够看到每列对应的数据类型, 像close属于符合股价的浮点数类型, 还能看到非空值数量, 要是存在缺失值便会显示出来, 在量化过程中这是需要重点予以关注的其三, df.(), 借助它能够看到每列数据的均值、标准差、最小值以及最大值等情况, 例如close的均值是8.318, 这表明这5天的平均收盘价为8.318元。2. 读取外部数据量化高频操作仅用于了解结构而手动进行创建的数据, 在那量化的过程当中, 我们更多的情形是去读取来自外部的诸如CSV文件、Excel文件、数据库数据这类的数据, 当中CSV这个文件, 乃是最为常用的格式, 其具有体积小、兼容性强的特点, 接下来是以读取名为“浦发银行行情数据.csv”这样的一个文件作为例子, 在文末的时候会告知大家要用怎样的方式去获取真实行情的CSV文件。# 读取CSV文件核心函数pd.read_csv() # 注意文件路径要正确若CSV文件和PyCharm项目在同一文件夹直接写文件名即可 df pd.read_csv(600000_SH.csv) # 设置“date”列为行索引并转换为日期类型关键确保日期是“日期格式”而非字符串 df df.set_index(date) df.index pd.to_datetime(df.index) # 转换为datetime类型方便后续按日期筛选 # 查看数据的前10行 print(读取的行情数据前10行) print(df.head(10)) # 查看数据的时间范围量化中常用确认数据覆盖的交易日 print(\n数据时间范围) print(起始日期, df.index.min()) print(结束日期, df.index.max()) print(总交易日数, len(df))首先要补充说明的是, 其一, 要是CSV文件并非处于项目文件夹范围内, 那就需要书写完整路径, 犹如“D:\\.csv”这般模样, 于此路径里的反斜杠可是能用“\”或者“/”来表示。其二, pd.()进行日期格式的转换是极为关键的要点所在, 随后按照日期进行筛选, 就像“筛选2024年1月的数据”这种情况, 必然是要依赖日期类型的索引的。第三部分核心操作量化数据处理高频技能这一部分算得上重点所在, 它涵盖了量化领域之中百分比达八十的操作情形, 具体有数据筛选, 有数据计算, 还有缺失值处理这些方面。而全部的操作都是依据上面所读取的名为“浦发银行行情数据.csv”的文件来予以开展的。1. 数据筛选按列、按行、按条件进行量化时, 常常会有这样的需求, 即要去挑选出特定的数据 , 举例来说 , 仅仅选取那包含收盘价的一列数据 , 再去挑选包含2024年1月的行情这段数据来 , 还要去筛选出收盘价高于8.5元对应的那些交易日数据 , 而运用某种方法能够迅速达成。# ① 按列筛选只保留需要的列比如只看日期、开盘价、收盘价 df_filtered df[[open, close, high, low]] # 列名用列表包裹顺序可自定义 print(筛选后的数据仅open、close、high、low列) print(df_filtered.head()) # ② 按行筛选按日期筛选比如筛选2024年1月1日-2024年1月31日的数据 df_jan df.loc[2024-01-01:2024-01-31] # loc[]按索引标签筛选 print(\n2024年1月行情数据) print(df_jan.head()) # ③ 按条件筛选量化核心比如筛选收盘价大于8.5元且成交量大于1.5亿的交易日 # 成交量单位假设CSV中volume是“股”1.5亿股150000000股 df_condition df[(df[close] 8.5) (df[volume] 150000000)] # 表示“且”条件用括号包裹 print(\n收盘价8.5元且成交量1.5亿的交易日) print(df_condition)主要要点: 其一, 在要依照列进行筛选时间, 对于单一列需运用df返回, 而针对多列则要用df返回其二, 于按照日期展开筛选以前, 一定要保证索引是相应类型也就是已经执行过pd.()其三, 在进行多个条件筛选之际选用表示且、|表示或, 千万不能使用and、or, 并且每一个条件都必然得加上括号。2. 数据计算量化指标计算核心量化分析, 是要去计算各种各样的指标的, 像那每日收益率, 像那5日均线, 像那10日均线, 像那最高价减去最低价所形成的振幅等等这些方面。计算的时候采用那“向量化计算”的特性, 可以不用借助循环就能实现批量计算, 其效率是极其高的。# ① 计算每日收益率核心指标公式(当日收盘价-前一日收盘价)/前一日收盘价 # shift(1)将列数据向下移动1行即获取前一日数据 df[daily_return] (df[close] - df[close].shift(1)) / df[close].shift(1) * 100 # 保留2位小数 df[daily_return] df[daily_return].round(2) # ② 计算5日均线和10日均线核心技术指标用rolling()实现滚动计算 # rolling(5).mean()滚动窗口为5计算窗口内的均值即5日均线 df[ma5] df[close].rolling(window5).mean() df[ma10] df[close].rolling(window10).mean() # ③ 计算每日振幅公式(最高价-最低价)/开盘价 ×100% df[amplitude] (df[high] - df[low]) / df[open] * 100 df[amplitude] df[amplitude].round(2) # 查看计算后的结果只看关键列前15行因为均线需要足够窗口数据前4行ma5为空 print(计算指标后的数据前15行) print(df[[close, daily_return, ma5, ma10, amplitude]].head(15))特此关键地予以说明: 其一, shift(1)乃是进行量化计算时发挥核心作用的技巧, 其作用于借助它去获取“前一期数据”的这种操作中, 举个例子来讲呀, 类似前一日的收盘价数值, 还有前一周的成交量数额其二, 形如(5)这般的形态表示“当滚动窗口大小设定为5的时候”, 其会与mean()这个代表均值的函数、max()这个代表最大值的函数、min()这个代表最小值的函数等这些函数联手、搭配起来, 进而能够去计算出各种不一样的滚动类指标, 类似均线指标、滚动最高以及最低价等相关指标其三, 经过上述计算之后所得到的数据会以新增成为列的这种方式得以呈现, 诸如、ma5等等这般情形, 如此一来便方便了后续展开的分析工作以及策略进行判断的相关事宜。3. 缺失值处理量化数据清洗必备在量化数据里头, 常常会存在着缺失值, 像是节假日的时候没有交易, 还有数据接口出现异常从而致使部分数据缺失, 而这种缺失值哟, 那可是会对指标计算造成影响的, 并且呢对策略回测也会有影响, 所以必须要去加以处理, 关于处理还提供了3种核心方式, 分别是删除填充, 插值。# 先查看数据中的缺失值数量每列有多少个缺失值 print(各列缺失值数量) print(df.isnull().sum()) # isnull()判断是否为缺失值sum()统计缺失值数量 # ① 删除缺失值适合缺失值较少的情况axis0表示按行删除 df_dropna df.dropna(axis0) print(\n删除缺失值后的行数, len(df_dropna)) # 对比原行数看删除了多少行 # ② 填充缺失值量化中最常用用前一个非缺失值填充即“前向填充” # 适合行情数据节假日后的第一个交易日用节前最后一个交易日的数据填充 df_fillna df.fillna(methodffill) # ffillforward fill前向填充 # ③ 用均值填充适合基本面数据比如市盈率缺失用行业均值填充 # 这里以填充成交量缺失值为例假设存在缺失 df[volume] df[volume].fillna(df[volume].mean()) # 查看填充后的缺失值情况 print(\n前向填充后的缺失值数量) print(df_fillna.isnull().sum())对于量化场景有着这样的建议: 一是行情数据, 亦即价格、成交量, 其中的缺失值, 优先采用“前向填充”, 也就是ffill, 这是符合实际交易逻辑的二是基本面数据, 像市盈率、市净率, 其缺失值, 优先借助“行业均值”或者“自身历史均值”进行填充三是若缺失值占比超过了10%, 那么不建议直接去删除或者填充, 而是需要先对数据来源是否可靠进行排查。第四部分实战案例用实现简单均线策略信号把前面的知识点进行结合, 我们去实现一个简单的关于“5日均线金叉10日均线”的策略信号, 这是量化策略的基础逻辑, 短期均线也就是5日的均线从下方朝着上方穿越长期均线也就是10日的均线的时候, 会产生买入信号, 当短期均线从上方朝着下方穿越长期均线时, 会产生卖出信号。# 基于前面计算好的ma55日均线和ma1010日均线数据 # 步骤1计算前一日的ma5和ma10用于判断“穿越” df[ma5_prev] df[ma5].shift(1) df[ma10_prev] df[ma10].shift(1) # 步骤2定义策略信号条件 # 买入信号前一日ma5 ma10当日ma5 ma10金叉 df[buy_signal] (df[ma5_prev] df[ma10_prev]) (df[ma5] df[ma10]) # 卖出信号前一日ma5 ma10当日ma5 ma10死叉 df[sell_signal] (df[ma5_prev] df[ma10_prev]) (df[ma5] df[ma10]) # 步骤3筛选出有信号的交易日 signal_df df[(df[buy_signal] True) | (df[sell_signal] True)] # 查看策略信号结果 print(均线策略信号买入True卖出True) print(signal_df[[close, ma5, ma10, buy_signal, sell_signal]])对此结果进行说明, 运行过后, 定会输出所有产生买入或者卖出信号的交易日。如果像某一行这样子表现作此为True, 那就表明当日出现金叉, 这种情况下可以直接执行买入的操作。倘若作此为True, 那就意味着出现死叉, 在这样的状况下能够执行卖出的操作。上述这些内容, 便是通过实现量化策略信号所体现的核心要义所在。往后, 我们将会基于这样的具体逻辑情形再行结合真实的行情数据, 去开展完整的策略回测。第五部分获取真实行情CSV数据新手必备资源许多刚入门的新手会询问, “从哪里能够找到反映真实情况的股票行情CSV数据呢”, 在此处为大家推送两个不但免费而且具备可靠性的渠道:1. 在理杏仁这个平台上, 一旦完成注册行为, 即可免费获取A股、港股以及美股的行情数据, 还有基本面数据, 它支持用户依据自身需求自定义时间范围, 以及数据字段, 像是开盘价、收盘价、成交量这些在内, 此平台上下载格式选择CSV便可。2. 库, 就是上一篇安装的那个库, 它能够通过代码直接获取数据, 而且会将其保存为CSV, 后续会专门来讲它的用法, 目前, 我们先进行手动下载CSV文件来练习就行。最后今日练习巩固核心用法1. 去下载一只你所熟知的股票, 像贵州茅台这样的, 其2024年全年行情的CSV数据。2. 用读取CSV数据设置日期为行索引转换为类型3. 计算三个指标, 一个称作每日收益率, 一个是20日均线, 就是ma20, 还有一个是成交量的5日滚动均值。4. 挑选出符合两个条件的数据: 其一, 收盘时的价格要大于按照规定计算得出的二十日均线其二, 每一天所获得的收益率要逾越百分之二。5. 处理数据中的缺失值用前向填充方式。讲到这儿了, 今天核心用法是量化分析的“基石”, 这篇内容涵盖80%量化数据处理场景, 要多多练习, 直至能熟练运用筛选、计算、缺失值处理这三大核心技能, 好多新手在量化入门的“数据处理”环节受阻, 只要练熟就能突破此瓶颈。接下去的一篇, 我们会联合库, 教导大家运用代码直接拿到实时行情数据, 不是通过手动去下载CSV这种方式, 并对今天的均线策略使之完备, 把仓位管理以及收益计算加上, 达成简易的策略回测。要是在练习之际碰到数据读取没成功、指标计算存在差错等状况下, 于评论区张贴出你的代码和报错信息, 我会一个一个地去解答。留意我, 跟着老王学量化, 由基础朝着实战一步一步地进行进阶温馨地提示: 本文的内容仅仅是用来当作学习参照的, 并不构成投资方面的建议。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门