基于Python构建上市公司高送转预测模型

一、问题
对中国上市公司高送转行为及影响因素进行分析,构建上市公司高送转预测模型,并根据预测结果设计量化投资策略及进行分析。数据获取可通过tushare金融大数据社区API获得。
二、基本思路
1.高送转行为:
高送转一般被定义为股利高派现。上市公司进行高送转的目的多种多样,有的是为了进行股本扩张,保持公司良好的形象;另外有些没有基本稳固业绩支撑的上市公司利用高送转的热点新闻炒高股价,导致在高送转分红公告预案日后股价连续下跌,将众多中小投资者套牢。
送转股即送红股以及公积金转增股本的简称,这两种股利分配方式常常同时运 用,且两者之间存在着很大的相似性,因此人们往往将这两个做法合称为“送转”。送股是指上市公司根据本年度的利润情况,依据公司目前的股本情况按一定比例发放股票红利给股东的行为。
送股在会计科目上的处理即在借方科目上记为未分配利 润,而在贷方记为股本;由此可以看出公司的资产方、负债方以及所有者权益并未发 生变化,仅仅是在所有者权益的内部发生了两个科目间的调整,实现了会计上的利润 到股本的转化。
转股则是公积金转增股本的简称,其中公积金主要指资本公积。上市公司根据所发布公告的内容,将过去企业所形成的资本公积或盈余公积按照一定的比例无偿赠送 给股东,无形中给股东分发的股票股利,达到了增加股本的作用。不过从本质上来说,转股如同送股一样,并没有将实实在在的利润分配给股东,而是会计科目上的调整。
送股和转股的最终目的是扩大了公司的股本,不过两者之间还是有一点点区别。送股来源于公司未分配的利润,如果该年度亏损或者不存在未分配利润,则送股就不 可能实现;转股来源于公司的资本公积,不受到本年度利润的影响。在税收方面两者 也存在着区别,送股需要上市公司缴纳税,而转股则不需要缴税。
在我国,送股和转股具有高度相似的分配效应,所以习惯将二者视为同种股利分
配方式。本文按照约定俗成的习惯,加上我国资本市场上送红股比转股的比例要小一 些,从送股和转股的共同点及共性问题着手,合二为一得进行研究和探讨。 “高送转”顾名思义高比例送股或者转增股,比如每 10 股转股 7 股,每 10 股送 2 股加转增 8 股等等。目前专家学者对“高送转”具体比例还没有形成统一的意见, 但在过去年份的大多数文献中,都将每 10 股送转股 5 股及以上定义为股利“高送转” (田建中,2007)。鉴于创业板推出后, “高送转”的公司数量以及送转比例有了很大 程度的提高,本文为保持与市场情况的一致性,将 10 送(转增)10 股及以上的情况 定义为高送转。
2.影响因素:
基准因子: 每股资本公积(capital_rese_ps)和每股未分配利润(undist_profit_ps)。在预测“高送转”时,两者并没有实质 上的区别,本文将两个指标的值相加,得到一个新的指标方便描述——潜在送转能力 因子。利用该因子对所有股票降序排列,筛选出指标值最高的一部分股票。
成长性因子:净资产收益率(roe),流通股本(float_share),市值(total_mv)
3.总结:
在“高送转”的预测中,本文将公司是否高送转这个虚拟变量(有高送转设置成 1,没有高送转定义为 0)设置成被解释变量(y),因此采用 logit 模型能有效的拟合该虚拟变量与各个预测因子之间的关系。解释变量的构成包括每股资本公积(capital_rese_ps),每股未分配利润(undist_profit_ps),净资产收益率(roe),流通股本(float_share),市值(total_mv)。
4.注意:
被解释变量由以下公式计算可得:
每股公积金>2元
每股未分配利润>2元
净资产收益率在3%以上
流通股本<=3亿
市值<=100亿
三、程序(Python)
1.数据获取

#基本面数据
import tushare as ts
import pandas as pd
import time
#基本面数据
ts.set_token('929adb18d5044d93deaba1638f3f1cf8e88de52ae6983bf5076753a1')
pro = ts.pro_api()
#股票基本信息获取
stkcode = pro.stock_basic(exchange='',list_status='L',fields='ts_code,symbol,name,area,industry')
data=pd.DataFrame()
for ts_code in stkcode.iloc[:,0]:
    try:
        #每股公积金,每股未分配利润,净资产收益率
        a=pro.fina_indicator(ts_code=ts_code ,fields='ts_code,capital_rese_ps,undist_profit_ps,roe')
        a=a.drop_duplicates(subset=['ts_code'])
        #流通股本、总市值
        b=pro.daily_basic(ts_code=ts_code,fields='ts_code,float_share,total_mv')
        b=b.drop_duplicates(subset=['ts_code'])
        c=pd.merge(a,b,how='inner',on='ts_code')
        data=data.append(c,ignore_index=True)
    except:
        time.sleep(4)
data.to_excel('enddata.xlsx')

2.逻辑回归

import pandas as pd
data=pd.read_excel('enddata.xlsx')
#设置参数和过滤值
#每股公积金>2元
capital_rese_ps = data.capital_rese_ps >=2
#每股未分配利润>2元
undist_profit_ps=data.undist_profit_ps>2
#净资产收益率在3%以上
roe=data.roe>=3
#流通股本<=3亿
float_share = data.float_share <= 300000000
#市值<=100亿
total_mv = data.total_mv <= 100000000
#取并集结果
allcrit = capital_rese_ps & undist_profit_ps & roe & float_share & total_mv
#allcrit=list(allcrit)
#selected = data[allcrit]
import numpy as np
y=np.zeros(len(data))
for i in range(len(y)):
    if allcrit[i]==True:
        y[i]=1
    else:
        y[i]=0
y=pd.DataFrame(y)
data=pd.concat([data,y],axis=1)
data=data.dropna() 
#逻辑回归
x=data.iloc[:3600,1:-1]
y=data.iloc[:3600,-1]
x1=data.iloc[3600:,1:-1]
y1=data.iloc[3600:,-1]
from sklearn.linear_model import LogisticRegression as LR
lr=LR()#创建逻辑回归模型类
lr.fit(x,y)#训练数据
R=lr.score(x,y)#模型准确率(针对训练数据)
r=lr.predict(x1)#预测结果
Z=r-y1
Rs=len(Z[Z==0])/len(Z)
print('预测结果为:',r)
print('预测准确率为:',Rs)

四、结果(截图)
在这里插入图片描述
模型表现均优于基准沪深300指数,模型的准确率益较髙,可以接受的范围内,这表明借助集成学习构建的“高送转”交易模型具备投资价值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值