注:
tushare接口已进行更新,之前的旧接口不可用,(新接口:https://tushare.pro/)。因此,课本中的部分操作已不可用。
股票基本面分析实际操作:
1、数据准备
利用tushare获取股票的相关数据,但因所需的数据不在同一个接口就能读取到,因此分两次获取。(ps:excel的合并没用Python)
import tushare as ts #引入tushare
ts.set_token('8fd9fa6fe51e5f0a0cbd5b18b6e8ffaea51002f32a1770acb69d9466') #执行一次在本机保存token,以后无需执行
pro= ts.pro_api() #初始化接口
data= pro.stock_basic() #读取相关股票数据
data.to_excel("上市公司基本面1.xlsx") #把数据读入到excel里
df = pro.daily_basic(ts_code='', trade_date='20201210', fields='ts_code,trade_date,total_mv,pe') 读取total_mv,pe数据
df.to_excel("上市公司基本面2.xlsx") #把数据读入到另一个excel里
2、数据类型转换
从excel中读取数据时,pandas会将数据自动转换为数值类型。因此,当股票代码前两位为00时,这两个数值就会丢失。故我们应将code字段设置为字符串。(此处提及的code是股票基本数据的一个字段,相关字段见补充)
df = pd.read_excel('上市公司基本面.xlsx',dtype={'code':'str'}) #读取excel表格,并把code设置字符串类型
print(df)
df.set_index('ts_code',inplace=True) #将code设为索引列
结果:
3、相关数据
查看股票的基本信息
print(df.shape) #4083只股票
print(df.columns) #显示数据的相关字段
a = len(df.industry.unique()) #显示行业数
b = len(df.area.unique()) #显示股票归属的省份
c = df.groupby('area').area.count().sort_values(ascending=False) #按地区统计上市公司数量,体现地区经济实力
print(a)
print(b)
print(c)
结果:
4、统计每年股票发行量并绘制折线图
year = df.list_date.astype('str').str[:4] #转换为字符串,提取年份
yearnum = df.groupby(year).name.count() #按年份统计,每年股票发行量
import matplotlib.pyplot as plt #引入绘图库
plt.rcParams['font.sans-serif']=['SimHei'] #设置中文
yearnum.plot(title='年IPO数量',marker='o',fontsize=16) #绘制图像
plt.show()
按年份统计股票的发行量,判断当年是牛市还是熊市
结果:
5、计算市场的平均市盈率
可以发现在这个excel表格中,有一些股票的pe(市盈率)是显示为0的,这是因为这些股票是亏损的,因此在计算市场平均市盈率时要剔除这一部分的数据。
pe_mean = df[df.pe > 0].pe.mean() #剔除亏损的股票后计算均值
print(pe_mean)
pe_mean2 = np.sum(df.pe * df.total_mv)/df.total_mv.sum() #以总市值为权重求加权的pe
print(pe_mean2)
6、对每个版块进行统计
df['board'] = df.index.str[:2]
d = df.groupby('board').pe.agg([('pe均值','mean'),('股票数','count')])
print(d)
结果:
附:
名称 类型 描述
ts_code str TS代码
symbol str 股票代码
name str 股票名称
area str 所在地域
industry str 所属行业
list_date str 上市日期
price float Y 发行价格
pe float 市盈率(总市值/净利润, 亏损的PE为空)
total_mv float 总市值 (万元)
更多的字段可前往Tushare官网查询:https://waditu.com/