Python 金融交易实用指南(二)(2)

简介: Python 金融交易实用指南(二)

Python 金融交易实用指南(二)(1)https://developer.aliyun.com/article/1523755

对 DataFrame 进行排序值和排列值顺序

首先,让我们创建一个具有整数行索引、整数列名和随机值的 DataFrame:

import numpy as np
df = pd.DataFrame(np.random.randn(5,5),
                  index=np.random.randint(0, 100, size=5), 
                  columns=np.random.randint(0,100,size=5)); 
df

DataFrame 包含以下数据:

87        79        74        3        61
7     0.355482  -0.246812  -1.147618  -0.293973  -0.560168
52    1.748274   0.304760  -1.346894  -0.548461   0.457927
80   -0.043787  -0.680384   1.918261   1.080733   1.346146
29    0.237049   0.020492   1.212589  -0.462218   1.284134
0    -0.153209   0.995779   0.100585  -0.350576   0.776116

pandas.DataFrame.sort_index(...) 按索引值对 DataFrame 进行排序:

df.sort_index()

结果如下:

87        79        74        3        61
0    -0.153209   0.995779   0.100585  -0.350576   0.776116
7     0.355482  -0.246812  -1.147618  -0.293973  -0.560168
29    0.237049   0.020492   1.212589  -0.462218   1.284134
52    1.748274   0.304760  -1.346894  -0.548461   0.457927
80   -0.043787  -0.680384   1.918261   1.080733   1.346146

我们也可以通过指定 axis 参数按列名值进行排序:

df.sort_index(axis=1)

这产生了以下按顺序排列的 DataFrame:

3         61         74         79         87
7    -0.293973  -0.560168  -1.147618  -0.246812   0.355482
52   -0.548461   0.457927  -1.346894   0.304760   1.748274
80    1.080733   1.346146   1.918261  -0.680384  -0.043787
29   -0.462218   1.284134   1.212589   0.020492   0.237049
0    -0.350576   0.776116   0.100585   0.995779  -0.153209

要对 DataFrame 中的值进行排序,我们使用 pandas.DataFrame.sort_values(...) 方法,该方法采用 by= 参数指定要按其排序的列:

df.sort_values(by=df.columns[0])

这产生了以下按第一列值排序的 DataFrame:

87         79         74         3         61
0     -0.153209   0.995779   0.100585  -0.350576   0.776116
80    -0.043787  -0.680384   1.918261   1.080733   1.346146
29     0.237049   0.020492   1.212589  -0.462218   1.284134
7      0.355482  -0.246812  -1.147618  -0.293973  -0.560168
52     1.748274   0.304760  -1.346894  -0.548461   0.457927

pandas.DataFrame.rank(...) 方法产生一个包含每列值的排名/顺序的 DataFrame:

df.rank()

输出包含值的排名(按升序):

87     79     74     3      61
7    4.0    2.0    2.0    4.0    1.0
52   5.0    4.0    1.0    1.0    2.0
80   2.0    1.0    5.0    5.0    5.0
29   3.0    3.0    4.0    2.0    4.0
0    1.0    5.0    3.0    3.0    3.0

本课程完成后,在下一节中,我们将对 DataFrame 执行算术运算。

DataFrame 上的算术操作

首先,让我们为我们的示例创建两个 DataFrames:

df1 = pd.DataFrame(np.random.randn(3,2), 
                   index=['A', 'C', 'E'], 
                   columns=['colA', 'colB']); 
df1

df1 DataFrame 包含以下内容:

colA         colB
A     0.519105    -0.127284
C    -0.840984    -0.495306
E    -0.137020     0.987424

现在我们创建df2 DataFrame:

df2 = pd.DataFrame(np.random.randn(4,3), 
                   index=['A', 'B', 'C', 'D'], 
                   columns=['colA', 'colB', 'colC']); 
df2

这包含以下内容:

colA          colB         colC
A    -0.718550     1.938035     0.220391
B    -0.475095     0.238654     0.405642
C     0.299659     0.691165    -1.905837
D     0.282044    -2.287640    -0.551474

我们可以将两个 DataFrame 相加。请注意它们具有不同的索引值以及不同的列:

df1 + df2

输出是元素的总和,如果索引和列存在于两个 DataFrame 中,则为 NaN:

colA         colB        colC
A    -0.199445    1.810751    NaN
B     NaN         NaN         NaN
C    -0.541325    0.195859    NaN
D     NaN         NaN         NaN
E     NaN         NaN         NaN

我们可以使用pandas.DataFrame.add(...)方法并带有fill_value=参数指定一个值来替代NaN(在这种情况下是0):

df1.add(df2, fill_value=0)

输出如下所示:

colA         colB         colC
A    -0.199445    1.810751     0.220391
B    -0.475095    0.238654     0.405642
C    -0.541325    0.195859    -1.905837
D     0.282044   -2.287640    -0.551474
E    -0.137020    0.987424     NaN

我们还可以在 DataFrame 和 Series 之间执行算术操作:

df1 - df2[['colB']]

这个操作的输出如下(因为右侧只有colB):

colA    colB
A    NaN     -2.065319
B    NaN     NaN
C    NaN     -1.186471
D    NaN     NaN
E    NaN     NaN

现在让我们学习如何将多个 DataFrame 合并和组合成一个单独的 DataFrame。

将多个 DataFrame 合并和组合成一个 DataFrame

让我们首先创建两个 DataFrame,df1df2

df1.index.name = 'Index'; df1.columns.name = 'Columns'; df1

df1 DataFrame 包含以下数据:

Columns    colA          colB
Index        
A           0.519105    -0.127284
C          -0.840984    -0.495306
E          -0.137020     0.987424

现在我们创建df2

df2.index.name = 'Index'; df2.columns.name = 'Columns'; df2

df2 DataFrame 包含以下数据:

Columns    colA         colB         colC
Index            
A          -0.718550     1.938035     0.220391
B          -0.475095     0.238654     0.405642
C           0.299659     0.691165    -1.905837
D           0.282044    -2.287640    -0.551474

pandas.merge(...)方法连接/合并两个 DataFrames。left_index=right_index=参数指示合并应该在两个 DataFrames 的索引值上执行:

pd.merge(df1, df2, left_index=True, right_index=True)

这产生了以下合并后的 DataFrame。_x_y 后缀用于区分左右两个 DataFrame 中具有相同名称的列:

Columns colA_x    colB_x     colA_y     colB_y     colC
Index                    
A       0.519105  -0.127284  -0.718550  1.938035   0.220391
C      -0.840984  -0.495306   0.299659  0.691165  -1.905837

我们可以使用suffixes=参数指定自定义后缀:

pd.merge(df1, df2, left_index=True, right_index=True, 
         suffixes=('_1', '_2'))

结果是带有我们提供的后缀的以下 DataFrame:

Columns  colA_1    colB_1     colA_2     colB_2    colC
Index                    
A        0.519105  -0.127284  -0.718550  1.938035  0.220391
C       -0.840984  -0.495306   0.299659  0.691165 -1.905837

我们可以使用how=参数指定连接的行为(外部、内部、左连接或右连接):

pd.merge(df1, df2, left_index=True, right_index=True, 
         suffixes=('_1', '_2'), how='outer')

这会产生以下带有NaNs的 DataFrame,用于缺失值:

Columns  colA_1    colB_1    colA_2    colB_2    colC
Index                    
A        0.519105  -0.127284  -0.718550  1.938035  0.220391
B        NaN        NaN       -0.475095  0.238654  0.405642
C       -0.840984  -0.495306   0.299659  0.691165 -1.905837
D        NaN        NaN        0.282044 -2.287640 -0.551474
E       -0.137020   0.987424   NaN       NaN       NaN

pandas DataFrame 本身具有pandas.DataFrame.merge(...)方法,其行为方式相同:

df1.merge(df2, left_index=True, right_index=True, 
          suffixes=('_1', '_2'), how='outer')

这会产生以下结果:

Columns  colA_1     colB_1     colA_2    colB_2    colC
Index                    
A        0.519105  -0.127284  -0.718550  1.938035  0.220391
B        NaN        NaN       -0.475095  0.238654  0.405642
C       -0.840984  -0.495306   0.299659  0.691165 -1.905837
D        NaN        NaN        0.282044 -2.287640 -0.551474
E       -0.137020   0.987424   NaN       NaN        NaN

另一种选择是pandas.DataFrame.join(...)方法:

df1.join(df2, lsuffix='_1', rsuffix='_2')

并且连接的输出(默认为左连接)如下所示:

Columns  colA_1    colB_1    colA_2    colB_2    colC
Index                    
A        0.519105  -0.127284  -0.718550  1.938035  0.220391
C       -0.840984  -0.495306   0.299659  0.691165 -1.905837
E       -0.137020  0.987424    NaN       NaN       NaN

pandas.concat(...)方法通过将行连接在一起来组合 DataFrame:

pd.concat([df1, df2])

这会产生以下带有NaNs的连接 DataFrame:

colA         colB        colC
Index            
A     0.519105    -0.127284    NaN
C    -0.840984    -0.495306    NaN
E    -0.137020     0.987424    NaN
A    -0.718550     1.938035     0.220391
B    -0.475095     0.238654     0.405642
C     0.299659     0.691165    -1.905837
D     0.282044    -2.287640    -0.551474

我们可以通过指定axis=参数在列之间进行连接:

pd.concat([df1, df2], axis=1)

这会产生以下带有来自df2的额外列的 DataFrame:

Columns  colA       colB       colA      colB      colC
A        0.519105  -0.127284  -0.718550  1.938035  0.220391
B        NaN        NaN       -0.475095  0.238654  0.405642
C       -0.840984  -0.495306   0.299659  0.691165 -1.905837
D        NaN        NaN        0.282044 -2.287640 -0.551474
E       -0.137020  0.987424    NaN       NaN       NaN

现在我们将学习分层索引。

分层索引

到目前为止,我们一直在处理的索引对象都是一个简单的单个值。分层索引使用MultiIndex对象,它是每个索引的多个值的元组。这使我们能够在单个 DataFrame 内创建子 DataFrame。

让我们创建一个MultiIndex DataFrame:

df = pd.DataFrame(np.random.randn(10, 2),
                  index=[list('aaabbbccdd'), 
                  [1, 2, 3, 1, 2, 3, 1, 2, 1, 2]], 
                  columns=['A', 'B']); 
df

这是使用分层索引的MultiIndex DataFrame 的布局:

A             B
a    1     0.289379    -0.157919
     2    -0.409463    -1.103412
     3     0.812444    -1.950786
b    1    -1.549981     0.947575
     2     0.344725    -0.709320
     3     1.384979    -0.716733
c    1    -0.319983     0.887631
     2    -1.763973     1.601361
d    1     0.171177    -1.285323
     2    -0.143279     0.020981

我们可以使用pandas.MultiIndex.names属性为MultiIndex对象分配名称 - 它需要一个名称列表,其维度与MultiIndex DataFrame 的维度相同(在本例中为两个元素):

df.index.names = ['alpha', 'numeric']; df

这会得到以下结果:

A            B
alpha    numeric        
a       1           0.289379    -0.157919
        2          -0.409463    -1.103412
        3           0.812444    -1.950786
...

pandas.DataFrame.reset_index(...)方法默认情况下从MultiIndexDataFrame 中移除所有索引级别,但可以用于移除一个或多个级别:

df.reset_index()

这导致以下整数索引 DataFrame 以及MultiIndex值被添加为此 DataFrame 的列:

alpha    numeric      A            B
0    a        1              0.289379    -0.157919
1    a        2             -0.409463    -1.103412
2    a        3              0.812444    -1.950786
...

pandas.DataFrame.unstack(...)方法的行为类似,并将内部索引的级别旋转并将其转换为列:

df.unstack()

让我们检查新的 DataFrame,其中最内层的索引级别[1, 2, 3]变为列:

A                                      B
numeric        1             2             3              1             2             3
alpha                        
a            0.289379    -0.409463    0.812444     -0.157919    -1.103412    -1.950786
b            -1.549981    0.344725    1.384979     0.947575    -0.709320    -0.716733
c            -0.319983    -1.763973    NaN             0.887631    1.601361        NaN
d            0.171177    -0.143279    NaN             -1.285323    0.020981        NaN

pandas.DataFrame.stack(...)方法的作用与unstack(...)相反:

df.stack()

输出 DataFrame 是具有分层索引的原始 DataFrame:

alpha  numeric   
a      1        A    0.289379
                B   -0.157919
       2        A   -0.409463
                B   -1.103412
       3        A    0.812444
                B   -1.950786
...
dtype: float64

让我们检查MultiIndexDataFrame 的结构。请注意,我们首先调用pandas.DataFrame.stack(...)将列[A, B]转换为MultiIndexDataFrame 中的第三个索引级别:

df.stack().index

这给我们一个具有三个索引级别的MultiIndex对象:

MultiIndex(levels=[['a', 'b', 'c', 'd'], 
                   [1, 2, 3], ['A', 'B']],
           labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
           names=['alpha', 'numeric', None])

现在我们将学习如何在 DataFrames 中进行分组操作。

Python 金融交易实用指南(二)(3)https://developer.aliyun.com/article/1523758

相关文章
|
2月前
|
数据可视化 数据处理 Python
如何使用Python实现一个基于均线的交易策略
【10月更文挑战第9天】本文介绍了如何使用Python实现一个基于均线的交易策略。主要步骤包括导入所需库(如`pandas`、`numpy`和`matplotlib`),加载股票或期货的历史数据,计算均线和其他指标,实现交易策略逻辑,以及可视化交易结果。示例代码展示了如何根据均线交叉点进行开仓、止损和止盈操作,并提供了注意事项,如数据来源、交易成本和风险管理。
82 7
|
1月前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
65 5
|
5月前
|
存储 分布式计算 数据可视化
Python 金融编程第二版(四)(2)
Python 金融编程第二版(四)
51 0
|
5月前
|
存储 SQL 数据可视化
Python 金融编程第二版(四)(1)
Python 金融编程第二版(四)
39 0
|
2月前
|
数据采集 人工智能 自然语言处理
AI Agent 金融助理0-1 Tutorial 利用Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股) AI Finance Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
5月前
|
机器学习/深度学习 存储 TensorFlow
使用Python实现深度学习模型:智能金融风控与信用评估
【7月更文挑战第25天】 使用Python实现深度学习模型:智能金融风控与信用评估
11257 7
|
4月前
|
数据可视化 数据挖掘 索引
【python】Python马铃薯批发市场交易价格数据分析可视化(源码+数据集)【独一无二】
【python】Python马铃薯批发市场交易价格数据分析可视化(源码+数据集)【独一无二】
122 0
|
3月前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能股票交易策略
使用Python实现智能股票交易策略
75 0
|
3月前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能金融市场预测
使用Python实现智能金融市场预测
44 0
|
4月前
|
数据可视化 数据挖掘 数据处理
【python】python淘宝交易数据分析可视化(源码+数据集)【独一无二】
【python】python淘宝交易数据分析可视化(源码+数据集)【独一无二】
144 1