这周接到的任务是创建并维护市盈率表,一开始这个表是不存在的,我的做法是先用navicat创建这张表,我把这张表起名为pe_ratio,这个是我在设计这张表的一些设置。
下一步就是用python调用tushare数据接口获取数据,代码如下:
# 导入tushare
import datetime
import tushare as ts
import numpy as np
from pymysql.converters import escape_string
from tradingSystem import constants
# 初始化pro接口
pro = ts.pro_api(constants.token)
# 获取股票历史市盈率数据
def getHistoryPERatio():
d1 = datetime.date(2023,2,15) # 起始日期
d2 = datetime.date(2023,5,12) # 终止日期
while d1 <= d2:
y, m, d = str(d1)[:10].split('-')
day = y + m + d
# 调用pro的API接口,取需要的数据
df = pro.daily_basic(**{"trade_date": day},
fields=[
"ts_code", # 股票代码
"trade_date", # 交易日期
"turnover_rate", # 换手率
"volume_ratio", # 量比
"pe", # 市盈率(总市值/净利润, 亏损的PE为空)
"pb" # 市净率(总市值/净资产)
])
print(df)
这一步获取的数据如下(这只是一小部分):
然后处理这些数据中的异常值的表示,因为会影响存储过程的正常进行。
# 将df中所有的inf和NaN数据都表示为0.00
df = df.replace([np.inf, -np.inf], np.nan)
df = df.fillna(0)
处理后的数据如下,可以看到所有的Nan和inf都表示成了零。
最后一步就是把这些数据存入数据库表中了,这一步我通过识别股票代码中的后缀是“SH”还是“SZ”得出对应的股票类型是上证还是深证,并存入数据表中对应的股票类型,其他的获取到的数据也依次存入对应的地方,代码如下:
res = np.array(df)
# print(res)
conn = constants.connection()
cursor = conn.cursor()
sql = "INSERT INTO pe_ratio(ts_code, stock_type,trade_date,turnover_rate,volume_ratio,pe,pb) VALUES(%s, %s, %s, %s, %s, %s, %s)"
# 通过股票代码的后缀识别股票类型,并把获取到的所有数据存入市盈率表中
for i in range(len(res)):
if res[i][0][7:] == 'SH':
cursor.execute(sql, [escape_string(res[i][0][:6]), escape_string('上证'), escape_string(res[i][1]), res[i][2], res[i][3], res[i][4], res[i][5]])
else:
cursor.execute(sql, [escape_string(res[i][0][:6]), escape_string('深证'), escape_string(res[i][1]), res[i][2], res[i][3], res[i][4], res[i][5]])
conn.commit() # 把所有的操作保存到数据库中
d1 += datetime.timedelta(days=1) # 日期变成当前日期的后一天
cursor.close()
conn.close()
运行成功后就可以在navicat中看到数据了。