当前位置: 首页 > news >正文

Python 金融量化分析

文章目录

    • 1. IPython:交互式的 Python 命令行
      • 安装
      • 常用操作
      • IPython Notebook
    • 2. NumPy:数据计算模块
      • 主要功能
      • 安装与导入
      • 创建 ndarray
      • ndarray 的常用属性
      • 示例代码
      • 常用创建函数
      • 示例代码
    • 3. NumPy 索引和切片
      • 数组运算
      • 数组索引和切片
      • 布尔型索引
      • 花式索引
      • 通用函数
      • 数学和统计方法
      • 随机数生成
      • 示例代码
    • 4. pandas: Series
      • 安装与导入
      • 创建方式
      • 获取值数组和索引数组
      • Series 特性
      • 整数索引的 pandas 对象
      • Series 数据对齐
      • 处理缺失数据
      • 示例代码
    • 5.Pandas:DataFrame
      • 5.1 DataFrame 概述
      • 5.2 创建方式
        • 方式一:使用字典创建,值为列表
        • 方式二:使用字典创建,值为 Series
      • 5.3 CSV 文件读取与写入
        • 读取 CSV 文件
        • 写入 CSV 文件
      • 5.4 查看数据
        • 常用属性及方法
        • 修改列名和索引字段名
      • 5.5 索引和切片
        • 通过标签获取
        • 通过位置获取
        • 通过布尔值过滤
      • 5.6 数据对齐与缺失数据
        • 数据对齐
        • 处理缺失数据的方法
      • 5.7 其他常用方法(适用于 Series 和 DataFrame)
      • 5.8 层次化索引
      • 5.9 从文件读取数据
        • 读取文件函数
        • 主要参数
        • 示例
      • 5.10 写入到文件
        • 写入文件函数
        • 主要参数
        • 其他文件类型
      • 5.11 时间对象处理
        • 时间序列类型
        • Python 标准库:`datetime`
        • 第三方包:`dateutil`
        • 成组处理日期:Pandas
        • 产生时间对象数组:`date_range`
        • 示例
        • 时间序列特殊功能

在这里插入图片描述

1. IPython:交互式的 Python 命令行

IPython 提供了一个强大的交互式环境,方便用户直接在命令行中粘贴和执行代码。

安装

使用以下命令进行安装:

pip install ipython

常用操作

  • TAB 键:用于自动补全代码,提高输入效率。
  • ?:实现内省和命名空间搜索功能。例如,a.a*? 可补全命令,a? 查看变量详情,func?? 查看函数详情。
  • !:用于执行 cmd 系统命令,如 !ipconfig
  • %run:执行文件代码,如 %run test.py
  • %paste%cpaste:执行剪贴板中的代码。
  • %timeit:计算函数运行的时间,如 %timeit func(a, b)
  • %pdb:进入调试模式,使用 %pdb on 开启,%pdb off 关闭。调试时会停在错误代码处,可使用 p a 打印变量 a 的值。
  • 历史命令_ 代表上一个命令的结果,__ 代表上上个命令的结果,_2 显示命令行上编号为 2 的结果,_i2 显示编号为 2 的代码。
  • %bookmark:目录标签系统,方便快速切换目录。

IPython Notebook

IPython Notebook 是一个代码编辑器,可通过以下命令安装和运行:

pip install jupyter
jupyter notebook

2. NumPy:数据计算模块

NumPy 是高性能科学计算和数据分析的基础包,是 pandas 等其他工具的基础。

主要功能

  • ndarray:一种多维数据结构,高效且节省时间。
  • 数学函数:无需循环即可对整组数据进行快速运算。
  • 数据读写:提供读写磁盘数据的工具以及操作内存映射文件的工具。
  • 其他功能:支持线性代数、随机数生成和傅里叶变换,还可集成 C、C++ 等代码。

安装与导入

pip install numpy
import numpy as np

创建 ndarray

使用 np.array() 函数创建 ndarray,示例如下:

import randomprize = [round(random.uniform(10.0, 20.0), 2) for i in range(20)]
prize_np = np.array(prize)num = [random.randint(1, 10) for i in range(20)]
num_np = np.array(num)

ndarray 的常用属性

  • T:数组的转置,适用于高级数组,可将其转换为二维数组等。
  • dtype:数组元素的数据类型,可使用 a.dtype = 'int64' 修改。
  • size:数组元素的个数。
  • ndim:数组的维数。
  • shape:数组的维度大小,以元组形式表示。

示例代码

import sys# 查看占用内存的大小,array 明显比 list 小
print(sys.getsizeof(prize_np))  # 求出两个数组中每个数相乘之后的总和
print(np.dot(prize_np, num_np))  # 求出两个数组中每个数相乘
result = prize_np * num_np
print(result.sum())  # 数组中每个数乘以 2
print(prize_np * 2)  # 创建二维数组
z = np.array([[1, 2, 3], [4, 5, 6]])
print(z.size)  
print(z.shape)  
print(z.T)  # 修改数组元素的数据类型
z = z.astype('float32')
print(z)  

常用创建函数

  • array():将列表转换为数组,可选择指定 dtype
  • arange()range 的 NumPy 版,支持浮点数步长。
  • linspace():类似 arange(),第三个参数为数组长度。
  • zeros():根据指定形状和 dtype 创建全 0 数组。
  • ones():根据指定形状和 dtype 创建全 1 数组。
  • empty():根据指定形状和 dtype 创建空数组(随机值)。
  • eye():根据指定边长和 dtype 创建单位矩阵。

示例代码

# 步长可以设置为小数
print(np.arange(1, 10, 0.2))  # 生成 15 个线性代数
print(np.linspace(1, 10, 15))  # 生成全 0 数组
print(np.zeros(10))  
print(np.zeros(10, dtype='int'))  
print(np.zeros((3, 5)))  # 生成全 1 数组
print(np.ones(10))  # 生成空数组
print(np.empty(10))  # 生成单位矩阵
print(np.eye(5))  

3. NumPy 索引和切片

数组运算

  • 数组和标量之间的运算:支持 *//+- 等运算。
  • 同样大小数组之间的运算:支持 +/** 等运算。

数组索引和切片

  • 索引:如 a[5]a2[2][3]a2[2, 3],逗号前表示行,逗号后表示列。
  • 切片:如 a[5:8]a[:3] = 1a2[1:2, :4]a2[:, :1]a2[:, 1]。与列表不同,数组切片时不会自动复制,在切片数组上的修改会影响原数组,可使用 copy() 方法解决。

布尔型索引

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 选出数组中所有大于 5 的数字
print(a[a > 5])  
# 选出数组中所有大于 5 的偶数
print(a[(a > 5) & (a % 2 == 0)])  
# 选出数组中所有大于 5 的数和偶数
print(a[(a > 5) | (a % 2 == 0)])  

花式索引

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 选出其第 1,3,4,6,7 个元素,组成新的二维数组
print(a[[1, 3, 4, 6, 7]])  a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
# 选出其第一列和第三列,组成新的二维数组
print(a[:, [1, 3]])  

通用函数

通用函数能同时对数组中所有元素进行运算,常见的一元函数有 abssqrtexplog 等,二元函数有 addsubtractmultiply 等。

数学和统计方法

常用函数有 sum(求和)、cumsum(累计求和)、mean(求平均数)、std(求标准差)、var(求方差)、min(最小值)、max(最大值)、argmin(求最小值索引)、argmax(求最大值索引)等。

随机数生成

  • rand:给定形状产生随机数组(0 到 1 之间的数)。
  • randint:给定形状产生随机整数。
  • choice:给定形状产生随机选择。
  • shuffle:与 random.shuffle 相同(洗牌)。
  • uniform:给定形状产生随机数组。

示例代码

# 1 到 10 的随机小数
print(np.random.rand() * 9 + 1)  # 生成一个二维的数组
print(np.random.randint(1, 15, (3, 5)))  # 洗牌
b = np.array([1, 2, 3, 4, 5])
np.random.shuffle(b)
print(b)  # 生成两个 1 到 10 的随机数字
print(np.random.uniform(1, 10, 2))  

4. pandas: Series

Series 是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。

安装与导入

pip install pandas
import pandas as pd

创建方式

# 方式一
s1 = pd.Series([1, 2, 4, 2])
# 方式二
s2 = pd.Series([1, 2, 4, 2], index=['a', 'b', 'c', 'd'])
# 方式三
s3 = pd.Series({'a': 1, 'b': 2})
# 方式四
s4 = pd.Series(0, index=['a', 'b', 'c', 'd'])

获取值数组和索引数组

使用 values 属性和 index 属性获取值数组和索引数组。

Series 特性

  • 支持 NumPy 模块的特性:支持下标操作、与标量运算、两个 Series 运算、索引、切片、通用函数和布尔值过滤。
  • 支持字典的特性:支持从字典创建 Series、in 运算、键索引和 get 方法。

整数索引的 pandas 对象

如果索引是整数类型,根据整数进行数据操作时总是面向标签的。可使用 loc 通过标签解释,iloc 通过下标解释。

Series 数据对齐

pandas 在运算时会按索引进行对齐然后计算,如果存在不同的索引,结果的索引是两个操作索引的并集。可使用 add 方法的 fill_value 参数将缺失值设为 0。

处理缺失数据

使用 NaN 表示缺失数据,内置的 None 值也会被当作 NaN 处理。相关方法有 dropna()(过滤掉值为 NaN 的行)、fillna()(填充缺失数据)、isnull()(返回布尔数组,缺失值对应为 True)、notnull()(返回布尔数组,缺失值对应为 False)。

示例代码

a = pd.Series(np.arange(5), index=list('abcde'))
b = pd.Series(np.arange(5), index=list('cebad'))# 两个 Series 相加
print(a + b)  # 将缺失值设为 0 后相加
print(a.add(b, fill_value=0))  # 过滤缺失数据
c = a + b
print(c.dropna())  # 填充缺失数据
print(c.fillna(0))  # 判断缺失数据
print(c.isnull())  

5.Pandas:DataFrame

5.1 DataFrame 概述

DataFrame 是 Pandas 中一种表格型的数据结构,拥有一组有序的列。可以将其看作是由多个 Series 组成的字典,并且这些 Series 共用一个索引。

5.2 创建方式

方式一:使用字典创建,值为列表
import pandas as pd
df1 = pd.DataFrame({'one': [1, 2, 3, 4], 'two': [4, 3, 2, 1]})
方式二:使用字典创建,值为 Series
df2 = pd.DataFrame({'one': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),'two': pd.Series([1, 2, 3, 4], index=['b', 'a', 'c', 'd'])})

5.3 CSV 文件读取与写入

读取 CSV 文件
df = pd.read_csv('test.csv')
写入 CSV 文件
df.to_csv('test2.csv')

5.4 查看数据

常用属性及方法
属性/方法描述
index获取行索引
T转置 DataFrame
columns获取列索引
values获取值数组
describe获取快速统计信息
修改列名和索引字段名
# 修改列名
df.rename(columns={'close': 'new_close', 'open': 'new_open'})
# 修改索引字段名
df.index.name = 'iid'

5.5 索引和切片

通过标签获取
# 取一列
df['close']
# 取一个数字
df['close'][0]
# 取两列,返回二维数组
df[['close', 'open']]
# 取前十行的两列数据
df[0:10][['close', 'open']]
通过位置获取
# 取第 3 行数据
df.iloc[3]
# 取第 3 行的第 3 个数据
df.iloc[3, 3]
# 取前 3 行的 4、5 列数据
df.iloc[0:3, 4:6]
# 取前 4 行的所有数据
df.iloc[1:5, :]
# 取第 1、2、4 行,第 0、3 列的数据
df.iloc[[1, 2, 4], [0, 3]]
通过布尔值过滤
# 取 close 列大于 20 的值的行
df[df['close'] > 20]
# 取 2007.3.1 到 2007.3.4 之间的行
df[df['date'].isin(['2007/3/1', '2007/3/4'])]
# 取 id 列值为 1、3、5、7 的行的数据
df[df['id'].isin([1, 3, 5, 7])]

5.6 数据对齐与缺失数据

数据对齐

DataFrame 对象在进行运算时,会自动进行数据对齐,结果的行索引与列索引分别为两个操作数的行索引与列索引的并集。

处理缺失数据的方法
方法描述
dropna(axis=0, how='any')axis 默认 0 表示按列处理,1 表示按行处理;how 默认 any 表示只要有一个缺失值就删除该行/列,all 表示全部为缺失值才删除该行/列
fillna()填充缺失数据
isnull()返回布尔数组,缺失值对应为 True
notnull()返回布尔数组,缺失值对应为 False

5.7 其他常用方法(适用于 Series 和 DataFrame)

方法描述
mean(axis=0, skipna=False)计算均值,axis 指定计算方向,skipna 表示是否跳过缺失值
sum(axis=1)计算总和,axis 指定计算方向
sort_index(axis, ascending)按行或列索引排序,如 df.sort_index(ascending=True, axis=1) 按列升序排序,df.sort_index(ascending=False, axis=0) 按行降序排序
sort_values(by, axis, ascending)按值排序,如 df.sort_values('close', ascending=True)close 列按升序排序
apply(func, axis=0)将自定义函数应用在各行或者各列上,func 可返回标量或者 Series,如 df2.apply(lambda x: x.sum()) 计算各列值之和,等同于 df2.sum()
applymap(func)将函数应用在 DataFrame 各个元素上,如 df2.applymap(lambda x: x + 1) 每个元素加 1
map(func)将函数应用在 Series 各个元素上

5.8 层次化索引

层次化索引是 Pandas 的一项重要功能,它允许在一个轴上拥有多个索引级别。

import numpy as np
data = pd.Series(np.random.rand(9), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], [1, 2, 3, 1, 2, 3, 1, 2, 3]])
# 两层索引取值
data['a'][1]

5.9 从文件读取数据

读取文件函数

Pandas 可以从文件名、URL、文件对象中加载数据,常用的读取文件函数有 read_csv(默认分隔符为逗号)和 read_table(默认分隔符为 \t)。

主要参数
参数描述
sep指定分隔符,可以使用正则表达式,如 "\S+"
header=None指定文件无列名
names指定列名
index_col指定某列作为索引
skiprows指定跳过某些行
na_values指定某些字符串表示缺失值,默认会将缺失值读取成 NaN,可省略该参数
parse_dates指定某些列是否解析为日期,可为布尔值或列表
nrows指定读取几行文件
chunksize分块读取文件,指定块大小
示例
df = pd.read_table('test.csv', sep=',', header=None, names=['id', 'date', 'open', 'close', 'high', 'low', 'volume', 'code'], skiprows=[1, 2, 3, 4], index_col='date', parse_dates=['date'])
# 查看索引类型
print(type(df.index[0]))

5.10 写入到文件

写入文件函数

使用 to_csv 方法将 DataFrame 写入文件。

主要参数
参数描述
sep指定分隔符
na_sep指定缺失值转换的字符串,默认为空字符串
header=False不输出列名一行
index=False不输出索引一行,可避免读取文件时多出一列
cols指定输出的列,传入列表
其他文件类型

Pandas 还支持将数据写入 JSON、XML、HTML、数据库等其他文件类型。

5.11 时间对象处理

时间序列类型
  • 时间戳:表示特定时刻。
  • 固定时期:例如 2017 年 7 月。
  • 时间间隔:从起始时间到结束时间。
Python 标准库:datetime

包含 datetimedatetimetimedelta 等类,还提供了 strftime()strptime() 方法用于时间格式的转换。

第三方包:dateutil

可以使用 dateutil.parser.parse("2017-01-01") 解析日期字符串,如果没有指定日,则以当前日期填充。

成组处理日期:Pandas
pd.to_datetime(['2017-01-01', '2017-01-02'])
产生时间对象数组:date_range
参数描述
start开始时间
end结束时间
periods时间长度
freq时间频率,默认为 D(天),可选值有 H(小时)、W(周)、B(工作日)、S(半月)、M(月)、T(分钟)、S(秒)、A(年)等
示例
# 生成 1 月 1 日到 2 月 1 日的工作日时间序列
pd.date_range("2017-01-01", "2017-02-01", freq='B')
# 生成 100 天的时间序列
pd.date_range("2017-01-01", periods=100)
# 获取有 2007 年的数据
df['2007']
# 获取一段时间的数据
df['2007-03-01':'2007-03-08']
时间序列特殊功能

时间序列是以时间对象为索引的 Series 或 DataFrame,当 datetime 对象作为索引时,会存储在 DatetimeIndex 对象中。时间序列支持传入年或年月作为切片方式,也支持传入日期范围作为切片方式。
在这里插入图片描述

相关文章:

  • pytest基础-new
  • 泰迪智能科技大模型应用平台功能特色优势
  • 代码随想录第21天: 回溯算法3
  • HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)
  • 策略模式:思考与解读
  • 版本控制利器——SVN简介
  • 浙江大学DeepSeek 公开课 第三季 第1期讲座 - 马东方教授 (附PPT下载) by突破信息差
  • 多线程出bug不知道如何调试?java线程几种常见状态
  • 《C/C++预定义宏深度剖析:编译上下文获取指南》
  • RSS 2025|苏黎世提出「LLM-MPC混合架构」增强自动驾驶,推理速度提升10.5倍!
  • unity打包安卓时的签名文件jks转换keystore
  • 欧拉-国产操作系统替代产品如何
  • 使用openssl为localhost创建自签名
  • 大模型AI的运行逻辑与准确性保障机制——以DeepSeek与豆包为例
  • K8s使用LIRA插件更新安全组交互流程
  • MMIO、IOMAP 和 IOMMU 总结
  • 一文了解相位阵列天线中的真时延
  • Vibracostic EDI 需求分析
  • 单例模式的使用场景 以及 饿汉式写法(智能指针)
  • LangChain、LlamaIndex 和 ChatGPT 的详细对比分析及总结表格
  • 88岁罗马教皇方济各突然去世,遗嘱内容对外公布
  • 工人日报评一些旅行社不收记者律师:“拒客黑名单”暴露心虚病
  • 国家税务总局镇江市税务局原纪检组组长朱永凯接受审查调查
  • 中国与柬埔寨签署产供链经济合作谅解备忘录
  • 文甦任四川乐山市委副书记,曾赴外交部挂职副司长
  • 韩国新一届总统选举将于6月3日举行,民调显示李在明继续领跑