Freder的博客

从公司分红看股票价值

· Freder · Stock > Code ·

考研复习的日子总是平淡乏味的。在这样的日子里总想搞点事情,大新闻是搞不出来了,小新闻还是可以搞一搞~

从上学期以来对股票有些兴趣。看知乎大佬们都说股票应该长期持有,还有所谓的”国在钱在炒股法”。那么在假设永远不卖股票的情况下,股票分红是唯一的收益来源。所以这次从公司股票分红开始讨论股票价值。

数据获取

本来我以为调一调库就完事儿了,没想到tushare的分红接口居然需要300积分,让我不得不自己写了个爬虫。这里使用了同花顺的数据:

import urllib.error
import urllib.request
import pandas as pd
from bs4 import BeautifulSoup

hds=[
    {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'},
] # 这个自己添加

def get_dividend(code):
    '''
    code: 股票的6位数代码
    '''
    url = 'http://stockpage.10jqka.com.cn/{}/bonus/#bonuslist'.format(code)

    # 获取当前url资源
    try:
        request = urllib.request.Request(url, headers=np.random.choice(hds))
        source_code = urllib.request.urlopen(request).read()
        plain_text = str(source_code, 'utf-8')
    except (urllib.error.HTTPError, urllib.error.URLError) as e:
        print(e)
        return None

    # 提取bonus_table
    soup = BeautifulSoup(plain_text, "lxml")
    bonus_table = soup.find('table', {'id': 'bonus_table'})
    if bonus_table is None:
        return None

    table_header = bonus_table.find('thead')
    table_body = bonus_table.find('tbody')

    # 获取table的列名和数据内容
    columns = [cname.get_text().split()[0] for cname in table_header.findAll('th')]
    data = [
      [coldata.get_text().split()[0] for coldata in coldata.findAll('td')] \
      for coldata in table_body.findAll('tr')
    ]

    # 生成DataFrame
    try:
        df = pd.DataFrame(data, columns=columns)
    except AssertionError as e:
        print(code, e)
        print(len(columns), columns)
        for d in data:
            print(len(d), d)
        return None

    return df


dividend_frame = get_dividend('000001')
print(dividend_frame[['报告期', '实施日期', '分红方案说明', '股息率']].head())

运行结果大致如下:

      报告期        实施日期        分红方案说明    股息率
0  2018年报             --     10派1.45元(含税)     --
1  2018中报             --         不分配不转增      --
2  2017年报     2018-07-06     10派1.36元(含税)   1.57%
3  2017中报             --         不分配不转增      --
4  2016年报     2017-07-17     10派1.58元(含税)   1.46%

现在有了获取某一公司历史分红的方法,还差获取深沪两市的所有股票代码的接口,比较幸运的是可以调库:)

import tushare as ts
stock_code_list = ts.get_stock_basics().index.tolist()

由此,我们就比较容易获取到深沪所有公司分红情况数据了:

import os
import numpy as np
import tushare as ts

path = './data'
stock_code_list = ts.get_stock_basics().index.tolist()

# confirm the path exists
dividend_path = '{}/dividend_data'.format(path)
if not os.path.exists(dividend_path):
    os.makedirs(dividend_path)

# save the dividend data
for i in stock_code_list:
    time.sleep(np.random.rand() * 1) # 可根据情况调整时间间隔
    dividend_frame = get_dividend(i)
    if dividend_frame is not None:
        dividend_frame.to_csv('{}/{}.csv'.format(dividend_path, i), index=False)

至此,基本数据全部获取并保存完毕。

数据处理与分析

同花顺分红页面中有股息率指标,这帮我节省了很多工作。

股息率:是股息与股票价格之间的比率。

通过统计各公司17年年报股息率分布得到下图,不难看出很少有公司股息率超过3%。而从历年统计数据来看,我国平均通货膨胀率在8%左右,达到这个收益率的股票仅有四支——方大特钢(10.80%)、哈药股份(9.98%)、三钢闽光(9.15%)、华联控股(8.26%)。分析到这里已经可以下一个结论:股票的长期持有收益不在分红上。


17_股息率分布直方图

股票的价格是未来现金流的折现,未来现金流包括分红和将股票卖出的收入,但未来将股票卖出的价格又是来自于未来的未来的分红和未来的未来将股票卖出的收入,如此循环下去直到公司停业清算。

上面引用可以用一句话总结:股票收入仅来自分红和股票卖出。又因股票长期持有收益不在分红上,那么可以得出结论:股票长期持有收益在股票卖出收入(也就是股票价格)上。

换一句话说,在一段时间内股票价格的年化增长率代表了股票的大部分价值。考虑到股票价格波动较大问题我们需要取一个相对平缓的时间段来测试。由下图对比选择了2016-11-14到2018-01-12这个时间段来计算股票价格的年化增长率。


上证指数分布

现在我们并没有股票的历史数据,经过一番挣扎选择了之前使用过的tushare。调用很简单:

history_frame = ts.get_hist_data(stock_code)

在剔除2016-11-14前未上市的公司以后,最后统计出的结果让人难过。沪市平均年化增长率为-19.3%,但的确存在股价翻倍的故事。统计得出你大概有3.3%的几率获得50%以上的收益,有12.2%的几率获得10%以上的收益,有17.4%的几率获得正收益。


growth_rate分布直方图

个人暂且认为是A股劣质股票过多的缘故,故对股息率做排序后的如下结果:

 17_股息率  stock_number  growth_0  growth_0.1  growth_0.5  growth_mean
0   0.000          2012  0.198807    0.140656    0.038767    -0.170762
1   0.005          1406  0.231152    0.165718    0.044097    -0.139585
2   0.010           938  0.253731    0.178038    0.046908    -0.111310
3   0.015           621  0.286634    0.191626    0.045089    -0.101229
4   0.020           431  0.306265    0.204176    0.041763    -0.090063
5   0.025           288  0.368056    0.239583    0.045139    -0.059257
6   0.030           200  0.420000    0.270000    0.050000    -0.027597
7   0.035           136  0.404412    0.250000    0.044118    -0.017446
8   0.040           105  0.457143    0.295238    0.057143     0.018128
9   0.045            76  0.447368    0.302632    0.078947     0.034019
10  0.050            48  0.500000    0.312500    0.104167     0.078474
11  0.055            29  0.551724    0.413793    0.172414     0.151843
12  0.060            14  0.571429    0.428571    0.285714     0.305022
13  0.065            11  0.545455    0.363636    0.363636     0.357999
14  0.070             9  0.555556    0.333333    0.333333     0.297605
15  0.075             7  0.571429    0.428571    0.428571     0.397292

股息率大于4%的股票平均年化增长率变为正。正收益可能性在45%左右,获得50%以上收益的可能性也从3.8%增加到了5.7%。这个结果很有意思,银行定期利率都在4%左右。有办法通过风险搏取更高的收益,股市才是合理的存在。

股息率大于0的股票年化增长率前6名:

        code     name      pe  growth_rate  now_price  17_股息率
0     300176   派生科技   21.26    2.877243      20.09   0.0149
1     601882   海天精工   43.15    2.079357       7.64   0.0052
2     002819   东方中科  132.19    1.976115      21.82   0.0014
3     000830   鲁西化工   15.22    1.901486      12.92   0.0154
4     600516   方大炭素    7.76    1.892578      19.10   0.0666
5     601155   新城控股    8.60    1.753220      38.26   0.0244

股息率大于4%的股票年化增长率前6名:

       code    name     pe  growth_rate  now_price 17_股息率
0    600516  方大炭素   7.76    1.892578      19.10   0.0666
1    002110  三钢闽光   4.49    1.316097      17.07   0.0915
2    600507  方大特钢  10.94    1.055905      13.89   0.1080
3    000488  晨鸣纸业   6.99    0.730064       5.56   0.0762
4    601636  旗滨集团   9.59    0.694374       3.90   0.0556
5    600741  华域汽车   8.88    0.612395      22.09   0.0452
6    600019  宝钢股份  14.69    0.427593       6.87   0.0515

相关链接

本文遵循 CC BY-ND-ND 3.0 协议,转载请注明原作者,禁止商用,禁止演绎。


© 2017 - 2019 Freder
Hexo 强力驱动 · 主题 Milk