不知不觉狗哥进入股市已经3年多了,从开始接触到大A股,听得最多的就是韭菜二字,大家都在骂A股市场就是台收割机。狗哥觉得还好,因为入市3年没亏过,哈哈哈。也有可能狗哥没钱的原因,庄家都不忍心割我,为了方便分析股票,狗哥写了个简单的python程序计算某只股票指定时间内的分红回报率,股票数据来自baostock。
可能有些老韭菜就要说了,分红才多少,而且都是分自己的钱,分红高的股基本都是银行股,波动太小,没卵用。对此,狗哥只能表示,随便你你开心就好。
复制
import baostock as bs
import pandas as pd
from datetime import datetime
class Stock:
def __init__(self):
self.bs=bs
self.lg=bs.login()
#定义股票代码
self.stockcode='sh.601288'
#定义定投金额
self.by_amount=3000
#定义持仓股数
self.stocknum=0
#定义持仓金额
self.have_amount=0
#定义总投入金额
self.total_amount=0
#定义购买时间
self.by_date='07-01'
#定义开始时间
self.start_date='2010-01-01'
#定义截止时间
self.end_date='2021-12-31'
#定义余额
self.amount=0
#定义收益率
self.get_rate=0
#定义分红总金额
self.divid_amount=0
#定义是否红利再投
self.all_by=True
#定义投资表
self.result=[]
#获取指定日期区间的年份数据
def get_years(self,start_date_str, end_date_str):
start_date = datetime.strptime(start_date_str, "%Y-%m-%d")
end_date = datetime.strptime(end_date_str, "%Y-%m-%d")
start_year = start_date.year
end_year = end_date.year
years = list(range(start_year, end_year + 1))
return years
#获取指定股票的分红除权信息
def get_divid_info(self,stockcode,start_date,end_date):
years=self.get_years(start_date, end_date)
rs_list = []
for i in range(0,len(years)):
rs_dividend = bs.query_dividend_data(code=stockcode, year=years[i], yearType="operate")
while (rs_dividend.error_code == '0') & rs_dividend.next():
rs_list.append(rs_dividend.get_row_data())
return rs_list
#获取指定股票的历史日K数据
def get_stock_data(self,stockcode,start_date,end_date):
rs = bs.query_history_k_data_plus(stockcode,
"date,code,open,high,low,close",
start_date=start_date, end_date=end_date,
frequency="d", adjustflag="3")
data_list = []
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
return data_list
#计算定投购买数据
def by_stock(self,stock_data,divid_data):
needby=False
fh=0
spj=0
for item in stock_data:
if needby==True:
one_row=[]
#红利不投
if self.all_by==False:
self.divid_amount=self.divid_amount+fh*self.stocknum #分红总金额
gj=float(item[5])#当前股价
grnum=int((self.by_amount+self.amount)/gj) #购入股数
self.stocknum=self.stocknum+grnum#购入整数股票
self.total_amount=self.total_amount+self.by_amount #总投入
self.amount=self.amount+self.by_amount-(gj*grnum) #余额
needby=False
one_row.append(item[0])#加入日期
one_row.append(gj)#加入股价
one_row.append(self.total_amount)#加入投资总额
one_row.append(self.stocknum)#加入持有股票数量
one_row.append(round(self.stocknum*gj,2))#加入持仓总额
one_row.append(round(self.amount,2))#加入余额
one_row.append(fh)#加入分红股利
one_row.append(round(fh*self.stocknum,2))#加入分红
self.get_rate=(((self.divid_amount+(self.stocknum*gj)+self.amount)-self.total_amount)/self.total_amount)
one_row.append(round(self.get_rate*100,2))#加入收益率
self.result.append(one_row)
else:
#红利再投
self.divid_amount=self.divid_amount+fh*self.stocknum #分红总金额
divid_amount=fh*self.stocknum #分红金额
gj=float(item[5])#当前股价
grnum=int((self.by_amount+self.amount+divid_amount)/gj) #购入股数
self.stocknum=self.stocknum+grnum#购入整数股票
self.total_amount=self.total_amount+self.by_amount #总投入
self.amount=self.amount+divid_amount+self.by_amount-(gj*grnum) #余额
needby=False
one_row.append(item[0])#加入日期
one_row.append(gj)#加入股价
one_row.append(self.total_amount)#加入投资总额
one_row.append(self.stocknum)#加入持有股票数量
one_row.append(round(self.stocknum*gj,2))#加入持仓总额
one_row.append(round(self.amount,2))#加入余额
one_row.append(fh)#加入分红股利
one_row.append(round(fh*self.stocknum,2))#加入分红
self.get_rate=((((self.stocknum*gj)+self.amount)-self.total_amount)/self.total_amount)
one_row.append(round(self.get_rate*100,2))#加入收益率
self.result.append(one_row)
for oned in divid_data:
if oned[7]== item[0]:
fh=float(oned[9])#每股分红
spj=float(item[5])#收盘价
needby=True
return self.result
#测试
if __name__ == '__main__':
stk=Stock()
#stk.all_by=False
stk.by_amount=30000
stk.stockcode='sh.601939'
divid_data=stk.get_divid_info(stk.stockcode,"2011-01-01","2021-12-31")
stock_data=stk.get_stock_data(stk.stockcode,"2010-01-01","2021-12-31")
rs=stk.by_stock(stock_data,divid_data)
print(rs)
result = pd.DataFrame(rs, columns=['日期','股价','投入','股数','持仓','余额','股利','分红','收益率'])
result.to_csv("C:\\Users\daimadog\Desktop\建设银行.csv", index=False)
使用中国农业银行的股票数据测试,结果如下图所示
从上表数据可以看出,每次分红后,增加3W投入,一共投入11次,总计33W投入,分红方式为红利再投,以分红除权除息日的下一个交易日的开盘价买入,不满整数的取整。到2021年,总共11年,持仓达44.78W。收益率35.7%十一年平均每年仅3.3%,跟存银行差不多。
但是,这仅仅是计算出来的,人不是机器,如果能够在年平均收益率超过6%的时候就卖出,还是能跑过银行存款的。
温馨提示:此文仅展示python分析股票分红数据,不做任何投资建议。






评论 (0)