前言: 完成了前面同时下载跟生成分析报告后,决定对生成的报告进行下格式设置,让报告直观好看点,改动增加的代码有点多,不过都是复制粘贴的,后面我还会继续增加跟完善功能,希望感兴趣的朋友关注下或者点个赞,打字不容易呀,更何况是无偿分享知识跟交流,额,废话又有点多了,代码如下:
import os
import docx
import time
import warnings
import pandas as pd
import tushare as ts
from docx.shared import Cm, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import RGBColor,Pt
warnings.filterwarnings('ignore')
#pd.set_option()就是pycharm输出控制显示的设置
pd.set_option('expand_frame_repr', False)#True就是可以换行显示。设置成False的时候不允许换行
pd.set_option('display.max_columns', None)# 显示所有列
#pd.set_option('display.max_rows', None)# 显示所有行
pd.set_option('colheader_justify', 'centre')# 显示居中
#os.chdir()用于改变当前工作目录到指定的路径
#此路径必须改为放数据的路径且中间的不能缺失任何一天数据,例如get_analysis_stockdata('20200101', '20200106'),
#那么你放数据文件夹内不能缺少任何一个这段时期内的交易数据文件,否则报错
os.chdir('D:/stock_data/') #保存的绝对路径,需要自己修改跟创建,就是切换默认的工作目录到你设置的路径
pro = ts.pro_api('要到tushare官网注册个账户然后将token复制到这里,可以的话请帮个忙用文章末我分享的链接注册,谢谢')
#df_basic = pro.stock_basic() 获取基础信息数据,包括股票代码、名称、上市日期、退市日期等
#df_daily = pro.daily() 获取所有股票日行情信息,或通过通用行情接口获取数据,包含了前后复权数据,停牌期间不提供数据
#df_daily_basic = pro.daily_basic()获取全部股票每日重要的基本面指标,可用于选股分析、报表展示等。
def get_all_stockdata(st_date, ed_date):
trade_d = pro.trade_cal(exchange='SSE', is_open='1',start_date=st_date,end_date=ed_date,fields='cal_date')
for date in trade_d['cal_date'].values:
df_basic = pro.stock_basic(exchange='', list_status='L') #再获取所有股票的基本信息
df_daily = pro.daily(trade_date=date) # 先获得所有股票的行情数据,成交额单位是千元,成交量是手
df_daily_basic = pro.daily_basic(ts_code='', trade_date=date,fields='ts_code, turnover_rate, turnover_rate_f,'
' volume_ratio, pe, pe_ttm, pb, ps, ps_ttm,'
' dv_ratio, dv_ttm, total_share, float_share,'
' free_share, total_mv, circ_mv ') #获取每日指标,单位是万股,万元
#基本数据跟行情数据合并,再跟每日指标数据合并生成一个csv数据文件
df_first = pd.merge(left=df_basic, right=df_daily, on='ts_code', how='outer') #on='ts_code'以ts_code为索引,合并数据,how='outer',取并集
df_all = pd.merge(left=df_first, right=df_daily_basic, on='ts_code', how='outer')
#数据清洗,删除symbol列数据,跟ts_code数据重复
df_all = df_all.drop('symbol', axis=1)
for w in ['name', 'area', 'industry', 'market']: #在'name', 'area', 'industry', 'market'列内循环填充NaN值
df_all[w].fillna('问题股', inplace=True)
df_all['ts_code'] = df_all['ts_code'].astype(str) #强制转换成str字符串格式
df_all['list_date'] = pd.to_datetime(df_all['list_date'])
df_all['trade_date'] = pd.to_datetime(df_all['trade_date'])
df_all.to_csv(str(date) + '_ts.csv', index=False, encoding='gbk') #保存数据,不保存索引,如果index=True,则保存索引会多出一列
print(df_all)
print('%s is downloaded.' % (str(date)))
return df_all
#分析数据并生成docx文档,存储至本地D盘D:/stock_analysis/
def get_analysis_stockdata(st_date, ed_date):
trade_d = pro.trade_cal(exchange='SSE', is_open='1',start_date=st_date,end_date=ed_date,fields='cal_date') #获取st_date,ed_date时间段内的交易日期
for date_now in trade_d['cal_date'].values: #将以上获取时间段的交易日期赋值给date_now
df = pd.read_csv('{}_ts.csv'.format(str(date_now)), encoding='gbk') #读取时间段内每日的股票数据
df.fillna(0, inplace=True) #fillna填充缺失数据,传入inplace=True直接修改原对象
#astype强制将涨幅,PE,总市值,流通市值转换成float格式,ts_code转化成str后,NAN也变成nan str格式
df[['change', 'pe', 'total_mv', 'circ_mv']] = df[['change', 'pe', 'total_mv', 'circ_mv']].astype(float)
df['list_date'] = pd.to_datetime(df['list_date'])
df['ts_code'] = df['ts_code'].astype(str)
# 添加交易所列
df.loc[df['ts_code'].str.startswith('3'), 'exchange'] = 'CY'
df.loc[df['ts_code'].str.startswith('6'), 'exchange'] = 'SH'
df.loc[df['ts_code'].str.startswith('0'), 'exchange'] = 'SZ'
df_up = df[df['change'] > 0.00] #找出上涨的股票
df_even = df[df['change'] == 0.00] #找出走平的股票
df_down = df[df['change'] = 0.097]
limit_down = df[df['change']/df['pre_close'] |