目录

已知条件:

概念描述:

开始计算:

读入数据

计算复权因子

计算前复权因子

计算后复权因子

计算前复权收盘价

计算后复权收盘价

数据:


本文以恒瑞医药上市以来至2022-07-06的数据作为讲解素材,数据在本文最后会提供下载。

注:本文计算不考虑扣税

已知条件:

1. 恒瑞医药上市以来无复权收盘价数据

文件名:pre_600276_data.csv

字段说明:secID:股票编码,tradeDate:交易日期,closePrice:收盘价

2. 恒瑞医药上市以来分红数据

文件名:pre_600276_bonus.csv

字段说明:registerDate:股权登记日,exDivDate:除权除息日,perCashDiv:每股派息(现金分红),perShareDivRatio:每股送股,perShareTransRatio:每股转增,programmeTxt:分红的文字描述

概念描述:

1. 上市公司在送股后,股票的数量变多,但公司价值不变,股价变低,在K线图上就会出现一个缺口,涨跌幅变得不合理,很多指标通过这样的数据计算出来基本不可用,所以就需要修补这个缺口,这个过程就叫复权。


2. 复权有分前复权和后复权,比较通用的是前复权,一般指标的计算都是使用前复权数据
3. 前复权是以最近一次的除权日为起点,往前回溯对数据进行调整,可以粗糙地理解是把以前的数据往下平移,去除缺口
前复权后价格=(复权前价格-现金红利)/(1+流通股份变动比例)
这里的“复权前价格”是股权登记日的收盘价


4. 后复权要看我们使用的数据以什么时候为起点,可以是上市当日,也可以自己任意取一个开始日期,可以粗糙地理解是从开始日期把往后的数据向上平移,去除缺口
后复权后价格=复权前价格×(1+流通股份变动比例)+现金红利
这里的“复权前价格”是除权除息日的收盘价

开始计算:

import pandas as pd
pd.set_option('display.max_columns',None)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(20,10))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

读入数据

df_noright_data = pd.read_csv('pre_600276_data.csv',encoding='utf-8')
df_noright_data.head()

df_bouns = pd.read_csv('pre_600276_bonus.csv',encoding='utf-8')
df_bouns.head()

计算复权因子

# 计算复权因子,所有计算都不考虑税费
df_adjust_factor = df_bouns.loc[:,['registerDate','exDivDate','perCashDiv','perShareDivRatio','perShareTransRatio']].copy()
df_adjust_factor['registerDate'] = pd.to_datetime(df_adjust_factor['registerDate'])
df_adjust_factor['exDivDate'] = pd.to_datetime(df_adjust_factor['exDivDate'])
# 将“股权登记日registerDate”对应的未复权收盘价加入 df_adjust_factor 表,字段名为 register_close_price
df_noright_data['tradeDate'] = pd.to_datetime(df_noright_data['tradeDate'])
def input_register_close_price(x):target_date = x['registerDate']target_close = df_noright_data[df_noright_data['tradeDate']==target_date].iloc[0]['closePrice']return target_close
df_adjust_factor['register_close_price'] = df_adjust_factor.apply(input_register_close_price,axis=1)
df_adjust_factor.head()

# 将“除权除息日exDivDate”对应的未复权收盘价加入 df_adjust_factor 表,字段名为 except_close_price
def input_except_close_price(x):target_date = x['exDivDate']target_close = df_noright_data[df_noright_data['tradeDate']==target_date].iloc[0]['closePrice']return target_close
df_adjust_factor['except_close_price'] = df_adjust_factor.apply(input_except_close_price,axis=1)
df_adjust_factor.head()

计算前复权因子

1. 前复权后价格=(复权前价格-现金红利)/(1+流通股份变动比例)
2. 计算的是“股权登记日”的收盘价
3. 前复权因子 = 前复权后价格/复权前价格
4. 前复权除权因子,为本次股权登记日为起点,往前开始累乘,所得到的数值为“前复权除权因子”,这样历史未复权收盘价乘以前复权除权因子后就是前复权收盘价

# 计算前复权因子
'''
前复权后价格=(复权前价格-现金红利)/(1+流通股份变动比例)
计算的是“股权登记日”的收盘价
前复权因子 = 前复权后价格/复权前价格
前复权除权因子,为本次股权登记日为起点,往前开始累乘,所得到的数值为“前复权除权因子”,这样历史未复权收盘价乘以前复权除权因子后就是前复权收盘价
'''
# 定义前复权因子字段名 pre_single_factor
def caculate_preSingleFactor(x):perCashDiv = x['perCashDiv'] if not np.isnan(x['perCashDiv']) else 0   # 每股派息perShareDivRatio = x['perShareDivRatio'] if not np.isnan(x['perShareDivRatio']) else 0  # 每股送股perShareTransRatio = x['perShareTransRatio'] if not np.isnan(x['perShareTransRatio']) else 0 # 每股转增ori_price = x['register_close_price']target_price = (ori_price-perCashDiv)/(1+perShareDivRatio+perShareTransRatio)target_radio = target_price/ori_pricereturn target_radio
df_adjust_factor['pre_single_factor'] = df_adjust_factor.apply(caculate_preSingleFactor,axis=1)
df_adjust_factor.head()

# 定义前复权除权因子字段名 pre_accum_factor
df_adjust_factor['pre_accum_factor'] = df_adjust_factor['pre_single_factor'].cumprod()
df_adjust_factor.head()

计算后复权因子

1. 后复权后价格=复权前价格×(1+流通股份变动比例)+现金红利
2. 计算的是“除权除息日”的收盘价
3. 后复权因子 = 后复权后价格/复权前价格
4. 后复权除权因子,要看你的收盘价数据是以什么时间为起点,你收盘价数据的起点就是后复权除权因子计算的起点,往后开始累乘后复权因子,所得到的数值为“后复权除权因子”,这样历史未复权收盘价乘以后复权除权因子后就是后复权收盘价

# 计算后复权因子
'''
后复权后价格=复权前价格×(1+流通股份变动比例)+现金红利
计算的是“除权除息日”的收盘价
后复权因子 = 后复权后价格/复权前价格
后复权除权因子,要看你的收盘价数据是以什么时间为起点,你收盘价数据的起点就是后复权除权因子计算的起点,往后开始累乘后复权因子,\
所得到的数值为“后复权除权因子”,这样历史未复权收盘价乘以后复权除权因子后就是后复权收盘价
'''
# 定义后复权因子字段名 after_single_factor
def caculate_afterSingleFactor(x):perCashDiv = x['perCashDiv'] if not np.isnan(x['perCashDiv']) else 0   # 每股派息perShareDivRatio = x['perShareDivRatio'] if not np.isnan(x['perShareDivRatio']) else 0  # 每股送股perShareTransRatio = x['perShareTransRatio'] if not np.isnan(x['perShareTransRatio']) else 0 # 每股转增ori_price = x['except_close_price']target_price = ori_price*(1+perShareDivRatio+perShareTransRatio)+perCashDivtarget_radio = target_price/ori_pricereturn target_radio
df_adjust_factor['after_single_factor'] = df_adjust_factor.apply(caculate_afterSingleFactor,axis=1)
df_adjust_factor.head()

# 定义后复权除权因子字段名 after_accum_factor
df_temp = df_adjust_factor.loc[:,['exDivDate','after_single_factor']].copy()
df_temp.sort_values(by='exDivDate',ascending=True,inplace=True)
df_temp.head()

df_temp['after_accum_factor'] = df_temp['after_single_factor'].cumprod()
df_temp.tail()

df_temp.sort_values(by='exDivDate',ascending=False,inplace=True)
df_adjust_factor['after_accum_factor'] = df_temp['after_accum_factor']
df_adjust_factor.head()

计算前复权收盘价

前复权收盘价 = 无复权收盘价*前复权除权因子

# 计算前复权收盘价
df_pre_data = df_noright_data.loc[:,['tradeDate','closePrice']].copy()
df_pre_factor = df_adjust_factor.loc[:,['registerDate','pre_accum_factor']].copy()
df_pre_factor.rename(columns={'registerDate':'tradeDate'},inplace=True)
df_pre_factor.head()

df_pre_data = pd.merge(df_pre_data,df_pre_factor,on='tradeDate',how='left')
df_pre_data.head()

df_pre_data.tail()

df_pre_data['pre_accum_factor'] = df_pre_data['pre_accum_factor'].fillna(method='bfill',axis=0)
df_pre_data.tail()

df_pre_data['pre_accum_factor'] = df_pre_data['pre_accum_factor'].fillna(1,axis=0)
df_pre_data.tail()

df_pre_data['adj_close'] = df_pre_data['closePrice']*df_pre_data['pre_accum_factor']
df_pre_data.plot(x='tradeDate',y=['closePrice','adj_close'])

计算后复权收盘价

后复权收盘价 = 无复权收盘价*后复权除权因子

# 计算后复权收盘价
df_after_data = df_noright_data.loc[:,['tradeDate','closePrice']].copy()
df_after_factor = df_adjust_factor.loc[:,['exDivDate','after_accum_factor']].copy()
df_after_factor.rename(columns={'exDivDate':'tradeDate'},inplace=True)
df_after_data = pd.merge(df_after_data,df_after_factor,on='tradeDate',how='left')
df_after_data.head()

df_after_data.tail()

df_after_data['after_accum_factor'] = df_after_data['after_accum_factor'].fillna(method='ffill',axis=0)
df_after_data.tail()

df_after_data.head()

df_after_data['after_accum_factor'] = df_after_data['after_accum_factor'].fillna(1,axis=0)
df_after_data['adj_close'] = df_after_data['closePrice']*df_after_data['after_accum_factor']
df_after_data.plot(x='tradeDate',y=['closePrice','adj_close'])

数据:

链接:https://pan.baidu.com/s/104dpG734M5kD4cjMsYkGgw 
提取码:souj

pandas_计算前复权收盘价和后复权收盘价相关推荐

  1. 除权、除息、复权、填权、填息、贴权、贴息、含权、含息、前复权、后复权到底什么区别(MD终于明白了用图解释)

    除权.除息.复权.填权.填息.贴权.贴息.含权.含息.前复权.后复权到底谁是谁(MD终于明白了) 最常见常用的是复权,复权相关联的本质事件是为了拆股,原来一股10000块一股,很多人买不起啊,所以拆成 ...

  2. 前复权还是后复权,你真的用对了吗?

    提到复权,炒股的小伙伴一定很熟悉.由于股票经常发生派息.配股.分拆或合并等事件,使得股价出现缺口,复权就是用来填补缺口的,分为前复权和后复权两种方法. 前复权保持当前价格不变,对历史价格进行增减,使得 ...

  3. 【量化交易】股票价格前复权与后复权的区别以及注意事项

    时不时就会看到到底是用股票前复权还是后复权价格的讨论,比如下面就是一个很经典的问法: "我用前复权价格计算指标的时候,发现会出现负价格,就没法取log了,应该是分红太多导致的,请问这种怎么处 ...

  4. 前复权和后复权有什么区别

    前复权和后复权是指股票价格的复权方式. 前复权是指在计算股票的价格指数或者收益率时,将股票价格的历史数据进行复权,也就是将历史股票价格进行调整,把因为除权或增发股票而导致的股票价格变化纠正回来,使得不 ...

  5. 前复权后复权程序C# .net

    if (win32apitest.MDIMain.SFSDA.FuQuan == "前复权")                     {                      ...

  6. 前复权是从今天的价格倒推 后复权是从上市价格前推 不复权就是原始K线。...

    前复权是从今天的价格倒推 后复权是从上市价格前推 不复权就是原始K线.

  7. 【公告】变更!采用动态复权作为回测复权机制

    相信最近一些小伙伴可能发现一些问题 就是同一个策略回测的结果-- 好像跟之前不太一样了 回测效果貌似没有之前好了 是记错了吗?是代码被改了吗? 都不是! 是我们回测的复权机制改了! 什么是复权 复权就 ...

  8. ACM_求N^N的前5位数和后5位数(数论)

    NNNNN Time Limit: 2000/1000ms (Java/Others) Problem Description: 对于整数N,求N^N的前5位和后5位(1057题加强版) Input: ...

  9. python做马尔科夫模型预测法_隐马尔可夫模型的前向算法和后向算法理解与实现(Python)...

    前言 隐马尔可夫模型(HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型. 马尔可夫模型理论与分析 参考<统计学习方法>这本书,书上已经讲得 ...

  10. HMM——前向算法与后向算法

    1. 前言 前向算法和后向算法主要还是针对HMM三大问题之一的评估问题的计算,即给定模型参数,计算观察序列的概率.文章不介绍过多公式,主要看两个例子 复习一下HMM的三大要素(以海藻(可观测)和天气( ...

最新文章

  1. 深蓝学院的深度学习理论与实践课程:第三章
  2. 动态检测内存错误利器ASan
  3. Java 8 - 06 Lambda 和方法引用实战
  4. C++ 手动开O2优化
  5. mysql varchar最多可以存多少汉字_MySql的这几个坑你踩过没?真是防不胜防!
  6. Spring注解之@validated的使用
  7. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame Python3.8安装Pygame教程步骤详解...
  8. [C#] 简单的 Helper 封装 -- RegularExpressionHelper
  9. EBS 报表输出PDF时中文乱码
  10. [原创]C#应用WindowsApi实现查找(FindWindowEx)文本框(TextBox、TextEdit)。
  11. 【c++ templates读书笔记】【4】技巧性基础知识
  12. ionic2——环境配置篇
  13. java flash_存在漏洞的Java及Flash版本使用者众多
  14. WebApp的自动测试工具: Jenkins
  15. (IoT物联网)天线的设计步骤 - 完整收藏版
  16. 小程序开发(一)iconfont图标引入
  17. python pytorch库_一个简单而强大的深度学习库—PyTorch
  18. Rigify:关于Rigify生成最终绑定时失败的原因及解决办法
  19. 计算机nemurt.dll,DDD~领域事件中使用分布式事务
  20. dba+开源工具:轻量级数据库审计日志平台,违规操作无所遁形(附下载)

热门文章

  1. html5 blockquote,HTML blockquote 标签 | w3cschool菜鸟教程
  2. mysql 升序和降序
  3. 计算机信息安全 概述
  4. python实践_机器学习:Python实践 (魏贞原) 高清pdf完整版[124MB]
  5. 计算机不同用户共享文件,如何为不同账户设置共享文件的不同访问权限
  6. Struts2下载问题再探
  7. OpenGL学习002-配置GLAD
  8. 华三路由交换配置命令_华三华为交换机-路由器配置常用命令汇总
  9. 马云:我是信念坚定的人
  10. python的拼音_python 汉字按拼音排序