当前位置:网站首页>谈谈那些基础但不简单的股票数据
谈谈那些基础但不简单的股票数据
2022-04-23 06:58:00 【量化密码库】
今天的内容相对基础,适合对股票数据含义不甚了解的人群。
通过它,可以了解股票数据的不同方面,包括开盘价、最高价、最低价、收盘价、成交额和成交量的概念与意义。同时,我们也将介绍如何计算前复权价格,股票除权除息(送股、分红和配股等情况)对数据的影响,以及它们为何重要。
本文使用的编程环境是Python 3.8、Jupyter Notebook以及掘金量化终端。样本时间为 2015年01月01日至2021年12月31日(含)期间的数据。
在掘金量化终端,你将免费获得这些数据!
官网:https://www.myquant.cn/
接下来,我们进入正题。这里我们先取一只股票的行情数据作为分析依据。
在打开掘金终端的前提下,打开Jupyter Notebook,输入掘金终端token及相关模块包,然后使用掘金数据接口中的history()函数获取行情数据,函数中df参数可以控制返回值的格式,默认为False,则返回list[dict]格式;df=True时,则返回 dataframe格式。
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import pandas as pd
import numpy as np
# 请替换您的掘金终端token
set_token('*********************************')
此处以易事特(300376)为例:
history_data = history(symbol='SZSE.300376', frequency='1d', start_time='2015-01-01',fields='eob, open, high, low, close, amount, volume', end_time='2021-12-31', df= True)
获取股票数据的 DataFrame 后,可以使用命令显示前几行。这时,能看到以下输出。
In [1]: history_data.head()
Out[1]:
eob open high low close amount volume
0 2015-01-05 00:00:00+08:00 34.01 34.49 31.61 33.21 6.3825e+07 1938255
1 2015-01-06 00:00:00+08:00 33.15 35.33 32.42 35.03 9.4566e+07 2748951
2 2015-01-07 00:00:00+08:00 35.05 35.76 34.46 34.82 6.7052e+07 1919987
3 2015-01-08 00:00:00+08:00 34.61 35.57 34.50 34.52 6.3526e+07 1813418
4 2015-01-09 00:00:00+08:00 34.52 34.84 33.60 33.60 7.3624e+07 2151710
通过上方获取的数据可以看到,有一个日期列和6个数值列,其中eob为bar结束时间,这里即当天日期。open为开盘价,high为最高价,low为最低价,close为收盘价,amount为成交额,volume为成交量。
开盘价是指股票每天开始交易的价格,是9:15-9:25的开盘集合竞价的最终价格。
收盘价是股票执行的最后一笔买卖订单的价格,该价格是14:57-15:00的尾盘集合竞价的最终价格。股票的收盘价被认为是特定日期价值的标准衡量标准。
如数据所示,开盘价不一定与前一天的收盘价相同。开盘价偏差会受收市后发生的宏观事件、公司盈利事件等事件的影响,造成开盘价的波动。
创业板和科创板股票具有盘后固定价格交易,可以在每个交易日的15:00-15:30以当日收盘价作为基准价格进行交易,其成交量通常低于正常交易时间。
最高价是指股票在指定时间段内交易的最高价格。同理,最低价是指在特定时间段内交易的的最低价格。
成交量和成交额是衡量特定时间段内交易的股票数量及金额。每一次交易股票时,都会记录成交量和成交额。它们并不反映可用股票的数量和价值,而是衡量股票周转率的指标,是对每一股发生的所有交易的记录。
它们也是量价指标中重要的基础数据,是衡量市场活跃程度的重要指标。
两市(沪市和深市)成交额可以衡量当前市场交易的活跃程度,是短线交易的重要参考指标。股票量价齐升,表明该股状态健康;缩量上涨,则往往预示着趋势行情的鱼尾行情。成交量越高,股票的流动性就越大,价格变化期间的成交量越高,成交额变化就越显着。
明白上述股票数据的含义之后,我们进一步了解下不同复权方式的收盘价。
上面每日数据的收盘价都是不复权数据,然而,当我们需要分析历史价格变化的时候,不能直接使用不复权数据,而需要使用前复权数据或者后复权数据,进而包含因分红、送转、发行新股等权益分派行为而导致的股权价格变化,这些行为产生的股票价格调整被称为除权除息。
为了提供连贯的股票回报,必须针对股票调整历史收盘价。在实践中,你可以在调用掘金数据时指定复权方式。前复权是以现在的价格为基础,倒推历史数据;后复权是以初始的价格为基础,正推历史数据。
下面,让我们了解下权益分派行为如何影响收盘价以及如何调整。
股票高送转的影响
“高送转”概念是A股炒作的经典概念,指送红股或者转增股票的比例很大的分红方案。股票高送转是公司股票内容的乘法或除法,其市值没有变化。如果股票分红方案为10转10,那么公司通过将每股价值减半而使股票数量翻了一番。假设投资者在高送转前拥有 20 股价格为10的股票,那么上述高送转后将拥有 40 股价格为5的股票,高送转前后持有的股票价值是一样的。公司可能会考虑将高送转作为降低股价的一种方式,从而使较小的投资者更容易交易其股票。
送红股与资本公积金转增股本方式对公司的股东权益和盈利能力并没有实质性影响,也不能直接给投资者带来现金回报,但为什么“高送转”总能吸引众多投资者的目光?
由于投资者通常认为“高送转”向市场传递了公司未来业绩将保持高增长的积极信号,同时市场对“高送转”题材的追捧,也能对股价起到推波助澜的作用,投资者有望通过填权行情,从二级市场的股票增值中获利。因此,大多数投资者都将“高送转”看作重大利好消息。
另一方面高送转的公告引起了媒体对公司的关注,因此高送转方案通常伴随着价格上涨。
高送转后,成交额通常会增加,因为许多新的小型投资者借此机会购买股票。现有投资者可能会寻求重新平衡他们的头寸,允许以前被捆绑在少量高价值股票中的资本重新分配给不同的投资。他们也可能借此机会以新的更低价格购买更多股票,从而将现有头寸加倍。所有这些因素都增加了流动性,使股票交易更容易、更快捷。
回到例子中。自 2015年以来,易事特(300376)经历了六次股票分红,其中有两次高送转。我们通过不复权收盘价和前复权收盘价对比下股价的不同变化。为了创建这个图形,我们将使用到 Matplotlib 函数库。
import matplotlib.pyplot as plt
# 用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#用来正常显示负号
plt.rcParams['axes.unicode_minus']=False
close_price_PREV = history(symbol='SZSE.300376', frequency='1d', start_time='2015-01-01', end_time='2021-12-31', fields='eob, close', adjust=ADJUST_PREV, df= True).set_index('eob')
close_price_NONE = history(symbol='SZSE.300376', frequency='1d', start_time='2015-01-01', end_time='2021-12-31', fields='eob, close', adjust=ADJUST_NONE, df= True).set_index('eob')
x = close_price_PREV.index
plt.plot(x, close_price_PREV,x, close_price_NONE)
plt.legend(['前复权价格','未复权价格'])
从图中可以看出,收盘价与前复权收盘价之间存在很大差异,直到2017年4月7日价格大幅下跌。
如前所述,收盘价的这种异常代表了股票数量的增加,而不是股票价值的崩溃。如果我们仔细观察2017年4月7日前的两个价格会发现,收盘价约为前复权收盘价的四倍,与送转比率一致。
为了更仔细地查看这些价格,我们首先将收盘价和前复权收盘价合并(基于pandas.concat()函数),然后通过日期过滤筛选目标时间段的数据。
close_price_NONE.rename(columns={'close':'收盘价'},inplace=True)
close_price_PREV.rename(columns={'close':'前复权收盘价'},inplace=True)
close_price = pd.concat([close_price_NONE,close_price_PREV],axis=1)
split_data = close_price[(close_price.index>='2017-04-06') & (close_price.index<='2017-04-07')]
In [2]: print(split_data)
Out[2]: 收盘价 前复权收盘价
eob
2017-04-06 00:00:00+08:00 59.84 14.6334
2017-04-07 00:00:00+08:00 13.96 13.6758
计算股票除权除息调整
除权除息生效日期之前的所有股票价格乘以根据送转比率计算的因子。在 N-转-M 分派中,该因子由下式计算N/(N+M). 例如,在 10转 30 分派中,该因子为10/(10+30)=0.25. 持仓量也以类似的方式调整,但计算是相反的。在上述分派中,持仓量调整因子为(10+30)/10=4. 持仓量将乘以 4。当然这个计算是不完整的,精确的计算还需要将股息纳入考虑之中。
股息的影响
股息是公司支付给股东的一部分利润。当一家公司持续产生的利润超过其通过再投资所能充分利用的利润时,它可能会选择通过支付股息来回报其股东。
股息分为三种主要类型:
-
正常股息:上市公司每年派发的股息,如2016年度中国神华每10股派4.6元。
-
中期股息:上市公司财务年度中期发放的股息,如中国石化每年9月份派发的股息。
-
特别股息:上市公司根据收支状况宣布的临时股息,以区别于正常股息。如2016年度中国神华每10股派25.1元特别股息。
股息率是每股年度股息除以股价。股价为 10元的股票支付每股 0.60 元的股息,其股息率为 6%。通过股息率可以快速估计投资该股票能获得多少收益。6% 的股息率将为每投资100元带来 6元的股息收入。
公司支付的股息金额由公司董事会投票批准。股息公告日是公司公开宣派股息的日期。本公告包括一个股权登记日,即投资者必须拥有股份才能获得股息的日期。除息日是新股东没有资格获得股息的日期。派息日是股东收到股息的日期,一般是除息日的同一天 。
在股息公告日,公司的股价通常会上涨大致相当于股息的金额。当公司支付股息时,公司可用的现金数量会减少,这表现为支付日开盘时股价下跌。对于派息比例较小,股息金额只是股价的一小部分时,这种波动完全在每日价格变动的标准偏差之内,因此它们对价格的影响往往被掩盖了。让我们仔细看看 2021 年 6 月 30 日宣布的 分红派息方案,登记日为 7 月 7 日,除息日为 7 月 8日, 每10股派0.3000元人民币现金。
div_data = history_data[(history_data['eob']>='2021-06-25')&(history_data['eob']<='2021-07-15')]
In [3]: print(div_data)
Out[3]: open high low close amount volume
eob
2021-06-25 00:00:00+08:00 8.50 8.50 7.95 8.11 7.2001e+08 88145921
2021-06-28 00:00:00+08:00 8.05 8.63 7.96 8.34 8.1042e+08 97518986
2021-06-29 00:00:00+08:00 8.23 8.24 7.92 7.97 5.3122e+08 65988832
2021-06-30 00:00:00+08:00 7.94 8.36 7.92 8.04 4.9367e+08 60602324
2021-07-01 00:00:00+08:00 8.04 8.07 7.60 7.60 4.8388e+08 61869499
2021-07-02 00:00:00+08:00 7.70 7.87 7.46 7.70 4.0552e+08 52710711
2021-07-05 00:00:00+08:00 7.93 8.30 7.93 8.27 7.0552e+08 86491232
2021-07-06 00:00:00+08:00 8.35 8.60 8.11 8.43 7.4434e+08 89189977
2021-07-07 00:00:00+08:00 8.23 8.35 8.05 8.26 5.0228e+08 61162590
2021-07-08 00:00:00+08:00 8.19 8.44 8.16 8.33 5.4185e+08 65311408
2021-07-09 00:00:00+08:00 8.25 8.29 8.00 8.10 4.3570e+08 53815710
2021-07-12 00:00:00+08:00 8.25 8.26 8.05 8.15 3.9515e+08 48466468
2021-07-13 00:00:00+08:00 8.22 8.22 7.76 7.83 5.3405e+08 67556703
2021-07-14 00:00:00+08:00 7.76 8.29 7.72 8.10 5.8126e+08 72380967
2021-07-15 00:00:00+08:00 8.00 8.05 7.72 7.87 3.6402e+08 46339326
如果我们查看股票在此期间的开盘价和收盘价的价格波动,我们可以看到 6月30日收盘价有所上涨,但这些价格走势与正常的每日波动相比有些相形见绌。为了可视化这一点,我们将创建一个图表,显示整个期间的滚动标准偏差。
price_close = pd.Series(div_data['close'].values, index=div_data['eob'])
close_ma = price_close.rolling(2).mean()
close_mstd = price_close.rolling(2).std()
price_open = pd.Series(div_data['open'].values, index=div_data['eob'])
open_ma = price_open.rolling(2).mean()
open_mstd = price_open.rolling(2).std()
prices = [price_close, price_open]
colors = ["cornflowerblue", "forestgreen"]
means = [close_ma, open_ma]
stds = [close_mstd, open_mstd]
fig, axs = plt.subplots(1, 2, figsize=(12, 4))
for nn, ax in enumerate(axs):
ax.set_xlabel("Date")
ax.plot(range(len(prices[nn])), prices[nn], color=colors[nn])
ax.fill_between(range(len(stds[nn])), means[nn] - 2 * stds[nn], means[nn] + 2 * stds[nn], color="lightgrey", alpha=0.2)
x_scale = [i.strftime('%m-%d') for i in prices[nn].index]
ln = int(np.floor(len(x_scale)/6))
ax.set_xticks(range(0,len(x_scale),ln)) # 设置刻度
ax.set_xticklabels(x_scale[0::ln], rotation=60)
axs[0].set_ylabel("Close Price")
axs[1].set_ylabel("Open Price")
fig.suptitle("2020年6月25至7月15日,易事特的开盘价和收盘价的标准差")
正如上图所示,6月30日的收盘价有所上涨,随后第二天下跌;在7月8日的除息日,开盘价也有所下降。然而,当考虑到整个月期间的价格变动时,可以看出这种价格变动并不显着。
计算股息调整
与股票送转类似,股息分红也需要进行股价调整。对于股息,调整因子的计算方法是从除息日前一天的收盘价中减去股息,然后除以该收盘价,得到百分比形式的调整因子。
以上述分红作为案例;股息每10股派0.3元,除息日是7月8日,前一天收盘价是 8.26元。如果没有任何调整,股票将以8.23元开盘,存在0.03元的价格缺口。为了计算调整因子,从收盘价中减去股息(8.26 元 - 0.03 元= 8.23元),再将该值除以收盘价(8.23/ 8.26 = 0.9964)。然后将除息日之前的历史收盘价乘以调整因子,所得即为前复权收盘价。
配股
配股是针对现有股东,并赋予他们以低于市价购买新股的一种融资行为。新股的出现降低了现有股票的价值,因为它增加了供应,现在每股只占净利润的一小部分。
向股东提供的一组权利被称为认购权证,实际上是一种期权。股东有权但没有义务在特定期限内购买股份。配股比率描述了股东可以购买的额外股份数量,并基于他们目前拥有的股份数量。因此,如果配股比例为 10配2,如果你手里有100股证券,那么这次配股你有20股的优先认购权,当然,你也可以放弃这20股的认购权,也就是弃配。配股的一大特点,就是新股的价格是按照发行公告发布时的股票市价作一定的折价处理来确定的。所折价格是为了鼓励股东出价认购。在正常情况下,新股发行的价格按发行配股公告时的市价折价10%到25%。理论上的除权价格是增股发行公告前股票与新股的加权平均价格,这是配股除权公式:
配股除权价=(除权登记日收盘价+配股价*每股配股比例)/(1+每股配股比例)
假设公司以10配2进行配股,原价10元,配股价为8元,则除权价为(10+8*0.2)/(1+0.2)=9.67。如果你持有10股,每股10元,成本为100元;如果你行使配股权益,则增加2股,每股8元,总成本为100+2*8=116元,按除权价计算则12*9.67=116,完美相等,不挣不亏,相当于加了个仓。如果不行使配股权益,那你的持仓以除权价计算直接亏损(9.67/10-1)*100%=3.3%。最好的办法是在配股前把股票出售,等配完股后再买回之前的股票。
如你所见,除权除息后的价格修复了分红等行为带来的价格调整,使股票的表现更容易评估,并允许投资者比较多种资产价格。由于它不会因价格调整而遭受价格下跌的影响,因此更适合对任何交易策略规则进行回测。
在了解了高送转对股票价格的影响和如何调整除权除息带来的价格断层之后,让我们进一步看看掘金终端是如何处理这个问题的。
首先在策略代码编写界面,策略最下边 if __name__ == '__main__'中可以调整策略参数,包括回测开始时间、结束时间和初始资金等,其中backtest_adjust参数可以控制策略订阅数据的复权方式,默认是ADJUST_PREV,即前复权。设定该参数后,通过subscribe()订阅的数据都是前复权的形式,省去了我们自己处理除权除息等数据处理操作。
但是要注意的是,如果你需要在订阅的数据中进一步跟history()等函数获取的数据作比较,特别需要保持history()中adjust_end_time参数与策略的回测结束时间( context.backtest_end_time )相一致,不然会导致二者的同一时间点数据出现差异,这是由于复权基点时间不一致导致的。
补充:股票代码
每家上市公司都是唯一的股票代码,以在交易所层面识别股票。在A股,股票代码用数字表示股票的不同含义,共6位数字。其中沪市主板以6开头,科创板以688开头,深市主板以0开头,创业板以300开头。
目前,掘金量化支持查询上交所、深交所、中金所、上期所、大商所、郑商所的交易标的,可以满足股票、期货、债券等交易需求,但对于证券代码有着系统的规范化要求。如下图所示,掘金的证券代码是需要加上交易所的,这样能够进一步区分相同的证券代码。
例如000001,上交所下的SHSE.000001代表上证指数,而深交所下的SZSE.000001代表平安银行。
以上就是关于股票数据的相关介绍,希望今天的内容对你有用。欢迎点击下方的「阅读原文」,注册成为掘金用户,免费使用掘金量化终端,体验回测、仿真等功能!
- End -
声明:本内容由掘金量化原创,仅供学习、交流、演示之用,不构成任何投资建议!如需转载请联系掘金小Q(VX:myquant2018)授权,否则作侵权处理!
版权声明
本文为[量化密码库]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_42219751/article/details/124341491
边栏推荐
- Codeforces Round #784 (Div. 4)
- C outputs a two-dimensional array with the following characteristics.
- [go]常见的并发模型[泛型版]
- 云计算技能大赛 -- openstack私有云环境 第一部分
- Mobile web (Font Icon, plane conversion, color gradient)
- Buuctf misc brush questions
- DataBinding的使用五
- NLLLoss+log_SoftMax=CE_Loss
- Find the largest of 3 strings (no more than 20 characters per string).
- Hierarchical output binary tree
猜你喜欢
BUUCTF [极客大挑战 2019]EasySQL1
Positioning of high precision welding manipulator
为什么会存在1px问题?怎么解决?
如何在SQL Server中导入excel数据,2019版
Feign source code analysis
Go语学习笔记 - Slice、Map | 从零开始Go语言
[programming practice / embedded competition] learning record of embedded competition (I): establishment of TCP server and web interface
vivo,硬件安全的爱与雷霆
使用 Ingress 实现金丝雀发布
Go语学习笔记 - 结构体 | 从零开始Go语言
随机推荐
Positioning of high precision welding manipulator
Research on system and software security (I)
在MATLAB中快速画圆(给出圆心坐标和半径就能直接画的那种)
云计算赛项--2020年赛题基础部分[任务3]
Move layout (Flex layout, viewport label)
3C装配中的机械臂运动规划
[programming practice / embedded competition] learning record of embedded competition (II): picture streaming based on TCP
Depth of binary tree
三星,再次“西征”
LeetCoed18. Sum of four numbers
Smart business card applet business card details page function implementation key code
Mobile web (Font Icon, plane conversion, color gradient)
多目视觉SLAM
Research on system and software security (4)
DataBinding的使用五
社区团购小程序源码+界面diy+附近团长+供应商+拼团+菜谱+秒杀+预售+配送+直播
thinkphp6+jwt 实现登录验证
干货!以点为形:可微分的泊松求解器
Discussion on ES6 tail tune optimization
Ignis公链的NFT生态发展:Unicorn.art的捐赠开发之路