股票学习网

每日牛股推荐,股票每日推荐,每日股票推荐,股票预测 - - 股票预测网!

股市分析(股票分析网站)

2023-06-16 16:14分类:BOLL 阅读:

【决策先锋—早盘前瞻】

 

一、消息面:

1、国务委员兼外长秦刚16日同乌克兰外长库列巴通电话。

2、浙江数字教育大会消息,人工智能将成为浙江中小学基础性课程和必修课程。

3、国资委:更大力度布局前瞻性战略性新兴产业,在集成电路、工业母机等领域加快补短板。

4、隔夜美股三大指数低开高走,道指涨1.17%,标普500指数涨1.76%,纳指大涨2.48%。半导体、软件应用涨幅居前,纳斯达克中国金龙指数涨2.53%。

二、策略建议:

周四市场低开低走,北上踟蹰不前,全天净买入7.87亿。大盘上方压力位3280点,强压力3350点,支撑位为3200点,强支撑3180点。

 

各大指数均处在GS策略的S区间,国际金融主体时好时坏,这A股观望情绪仍旧浓厚。操作上数字中国高位股反拉就是减仓的时候,轮动主看低位补涨;种植业冲高抛售,养殖业看高弹性;一带一路看长做短,大盘基建股长期会有趋势推力,小票以短线题材对待;医药医疗冲高则卖,回调则做低吸布局等发酵;硬科技做底部防御,轮动到冲高就卖,回落再低吸;军工以题材对待;大消费中线基本面优良的耐心持股;赛道股谨慎抄底。

--------------------

(投资建议仅供参考,据此操作风险自担)

 

Pyecharts简介

Echarts 是百度基于JavaScript 开源的可视化图表库,而 Pyecharts 相当于是 Python+echarts,即使用 Python 语言调用 echarts 的开源库,可以制作非常精美的图表。实际上 Python 可视化库有很多,包括 Matplotlib、Seaborn、Bokeh 、Pygal、 Plotly 和 Pyecharts等等。其中 Matplotlib 是大家入门数据分析的最基本可视化工具;Seaborn 实际上是 matplotlib 的一个封装,提供了很多统计分析的基本图表;Bokeh、Pygal、Plotly 和 Pyecharts 等功能相似,可以输出非常精美的可视化图表,尤其是 Plotly 和 Pyecharts ,均支持动态可交互效果,但代码相对复杂。这些可视化库基本上都支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab,可以轻松集成至 Flask,Django 等主流 Web 框架。关于高级可视化库之间的优劣对比在此不做深入探究,读者可根据个人需要和编程习惯选择相应的库进行学习,本文将重点介绍 Pyecharts 及其在金融量化上的应用,代码均在Jupyter notebook上运行。关于Pyechart更详细完整的介绍可以参见其官网:Pyecharts。

01 版本与安装

Pyecharts 分为 v0.5.X(旧版) 和 v1 (新版)两个版本,两个不兼容,v1 是一个全新的版本。直接使用pip安装可获取最新版本:pip install pyecharts,如需使用旧版本,需要指定安装版本号,如:pip install pyecharts=0.5.11。本文使用的是1.9.1版的pyecharts,v0.5版本编程代码可参考公众号历史文章。

#查看电脑系统和库版本 #watermark是第三方库需要先安装, #在cmd(如安装的是anaconda,直接打开anaconda prompt)上输入:pip install watermark %load_ext watermark #%watermark 查看电脑版本 %watermark -p pyecharts,pandas,numpy,matplotlib,talib,backtrader,jupyter

pyecharts : 1.9.1 pandas : 1.3.2 numpy : 1.20.3 matplotlib: 3.3.4 talib : 0.4.19 backtrader: 1.9.76.123 jupyter : 1.0.0

 

02 模块导入与调用

图表的类在charts,*表示导入全部,一般不建议这么写,可根据图表类型导入,如柱状图和折线图:from pyecharts.charts import Bar,Line。配置项通过options(缩写为opts),用于修饰图表,进阶还可调用Javascript 的代码,导入JsCode:from pyecharts.commons.utils import JsCode。theme可以定制主题,导入:from pyecharts.globals import ThemeType,一般使用默认的ThemeType.WHITE。导入Faker可以使用自带的数据画图。

from pyecharts.charts import * from pyecharts import options as opts from pyecharts.faker import Faker

 

03 图表配置项

Pyecharts使用 options对图表的配置项进行设置,根据个人需要,为图表添加(减少)元素,美化和修饰图表。配置项非常多,包括全局配置项(set_global_opts)22个大类和系列配置项(结合数据系列进行配置)17个大类,每一个配置类下又有众多的参数设置。配置项为制作精美的图表提供了相当完善的功能选择,但是对新手来说相当不友好,各种类和参数选择让人眼花缭乱和望而生畏(老版本0.5.11在这方面简洁很多)。这里建议大家结合常用的图表类型模板学习几个常用的配置项,其他配置项基本上使用默认参数即可。

图片来源:https://pyecharts.org/#/zh-cn/global_options

pyecharts 对配置项基本上都采用 XXXOpts/XXXItems 以及 dict 两种数据形式进行调用,下面介绍几个常用的配置项。
(1)全局配置项,通过set_global_opts 方法设置

  • InitOpts:初始化配置项,一般在图表函数内加载,如Bar(init_opts=opts.InitOpts(width='900px',height='600px',设置图表画布宽width高height('数字+px'),theme: str = "white"图表主题));
  • TitleOpts:标题配置项title_opts=opts.TitleOpts(title=,subtitle=,pos_left=),其中主标题title,副标题subtitle, # title 组件离容器左侧的距离,pos_left = 可选'left', 'center', 'right'或如20、20%。离右侧距离,pos_right= None,顶部距离pos_top = None,可选'top', 'middle', 'bottom'或数字或百分比。底部距离,pos_bottom: = None,);
  • DataZoomOpts:区域缩放配置项,默认不显示, datazoom_opts=opts.DataZoomOpts(is_show=True或False,type_: str = "slider"或"inside" ,range_start=:数据窗口范围的起始百分比:0 ~ 100表示 0% ~ 100%,range_end=:数据窗口范围结束百分比,xaxis_index= number表示控制一个轴,Array表示控制多个轴,yaxis_index=同xaxis_index的设置,位置pos_left同title);
  • LegendOpts:图例配置项,默认不显示,legend_opts=opts.LegendOpts(is_show: bool = True是否显示,位置pos_left同title,orient= 布局朝向,可选:'horizontal', 'vertical',);
  • VisualMapOpts:视觉映射配置项,默认不显示,visualmap_opts=opts.VisualMapOpts(is_show: bool = True,type_: str = "color",映射过渡类型可选"color", "size",min_ = 0,max_ = 100,分别指定 visualMapPiecewise 组件的最小值和最大值,orient = "vertical"或"horizontal",split_number: int = 5,对于连续型数据,自动平均切分成几段,is_piecewise: bool = False,是否分段,pieces=[]指定每一段范围,如[{"min": 1500},{"min": 900, "max": 1500},{"max": 1500} ]);

(2)系列配置项

  • ItemStyleOpts:图元样式配置项,itemstyle_opts=opts.ItemStyleOpts(color=图形颜色,颜色可以使用 RGB 表示,比如 'rgb(128, 128, 128)',如果想要加上 alpha 通道表示不透明度,可以使用 RGBA,比如 'rgba(128, 128, 128, 0.5)',也可以使用十六进制格式,比如 '#ccc',color0:阴线图形的颜色,border_color=图形的描边颜色,border_color0=阴线图形的描边颜色,opacity=图形透明度,支持从 0 到 1 的数字为 0 时不绘制该图形,area_color=区域的颜色), 参考十六进制颜色转换;
  • LabelOpts:标签配置项, label_opts=opts.LabelOpts(is_show: bool = True是否显示标签,position=标签的位置,可选 ['top','left','right','bottom','inside','insideLeft','insideRight''insideTop','insideBottom', 'insideTopLeft','insideBottomLeft' 'insideTopRight','insideBottomRight'], formatter=模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等,折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无)散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)示例:formatter: '{b}: {@score}');
  • LineStyleOpts:线样式配置项,linestyle_opts=opts.ItemStyleOpts(is_show= True是否显示,color=线条颜色, width= 1,线宽,curve = 线的弯曲度,0 表示完全不弯曲,type_: str = "solid", 线的类型可选:'solid', 'dashed', 'dotted',);
  • SplitLineOpts:分割线配置项, 在全局配置项中使用.set_global_opts(yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show = True显示分割线)))。

可视化实战案例

本文主要介绍直角坐标系图表及其应用案例,其余图表将在下一次推文中介绍。直角坐标系图表继承自 RectChart 拥有一些相同或相似的方法。

  • 新增 X 轴数据.add_xaxis(xaxis_data=list数据)
  • 翻转 XY 轴数据,.reversal_axis()
  • 扩展 X/Y 轴,.extend_axis(xaxis_data=扩展X坐标数据项,xaxis=扩展 X 坐标轴配置项,yaxis=新增 Y 坐标轴配置项)
  • 新增 Y 轴数据.add_yaxis(series_name='',y_axis=序列数据,xaxis_index= 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用
    yaxis_index = 使用的 y 轴的 index,label_opts=标签配置项,markpoint_opts=标记点配置项,markline_opts=标记线配置项,tooltip_opts=提示框组件配置项)

 

#导入数据分析和量化常用库 import pandas as pd import numpy as np import talib as ta import tushare as ts #导入pyecharts from pyecharts.charts import * from pyecharts import options as opts from pyecharts.commons.utils import JsCode

 

01 折线图Line

折线图是考察金融时间序列数据趋势最常用的图表之一。下面使用tushare旧接口在线获取股票交易数据进行可视化分析。

#股票数据可视化分析实例 #获取A股交易数据 def get_price(code='sh',start='2000-01-01',end='2022-03-07'): df=ts.get_k_data(code,start,end) df.index=pd.to_datetime(df.date) #将成交量单位改为10000手并取整数 df['volume']=(df['volume']/10000).apply(int) return df[['open','close','high','low','volume']] sh=get_price() #sh.head()

最基本折线图,全使用默认参数。

g=(Line() .add_xaxis(sh.index.strftime('%Y%m%d').tolist()) .add_yaxis('',sh.close)) g.render_notebook()

添加全局和系列配置项。

#不同点位设置不同颜色 des=sh.close.describe() v1,v2,v3=np.ceil(des['25%']),np.ceil(des['50%']),np.ceil(des['75%']) pieces=[{"min": v3, "color": "red"}, {"min": v2, "max": v3, "color": "blue"}, {"min": v1, "max": v2, "color": "black"}, {"max": v1, "color": "green"},] #链式调用作用域() g = ( Line({'width':'100%','height':'480px'})#设置画布大小,px像素 .add_xaxis(xaxis_data=sh.index.strftime('%Y%m%d').tolist())#x数据 .add_yaxis( series_name="",#序列名称 y_axis=sh.close.values.tolist(),#添加y数据 is_smooth=True, #平滑曲线 is_symbol_show=False,#不显示折线的小圆圈 label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2),#线宽 markpoint_opts=opts.MarkPointOpts(data=[#添加标记符 opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值'),],symbol_size=[100,30]), markline_opts=opts.MarkLineOpts(#添加均值辅助性 data=[opts.MarkLineItem(type_="average")], )) .set_global_opts(#全局参数设置 title_opts=opts.TitleOpts(title='上证指数走势', subtitle='2000年-2022年',pos_left='center'), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), visualmap_opts=opts.VisualMapOpts(#视觉映射配置 orient = "horizontal",split_number = 4, pos_left='center',is_piecewise=True, pieces=pieces,),) .set_series_opts( markarea_opts=opts.MarkAreaOpts(#标记区域配置项 data=[ opts.MarkAreaItem(name="牛市", x=("20050606", "20071016")), opts.MarkAreaItem(name="牛市", x=("20140312", "20150612")),],))) #使用jupyter notebook显示图形 g.render_notebook()

高阶应用:股价收益率与波动率可视化

此处代码较长省略。完整代码见Python金融量化知识星球。

 

02 柱状图Bar

下面以上证指数和创业板指数2010-2022年的年收益率构建柱状图,比较考察不同指数在各年的收益率情况。

indexs={'上证综指':'sh','创业板':'cyb'} index_price=pd.DataFrame({index:get_price(code).close for index,code in indexs.items()}).dropna() #index_price.head()

#指数年度收益率柱状图 index_ret=index_price/index_price.shift(1)-1 ss=index_ret.to_period('Y') sss=(ss.groupby(ss.index).apply(lambda x: ((1+x).cumprod()-1).iloc[-1])*100).round(2)

使用全部默认参数下的年收益率柱状图。

g=(Bar() .add_xaxis(sss.index.strftime('%Y').tolist()) .add_yaxis("", sss['上证综指'].tolist())) g.render_notebook()

添加全局配置项和系列配置项,使图表反映更多细节,同时可以根据时间段进行区域缩放。

g = (Bar() .add_xaxis(sss.index.strftime('%Y').tolist()) .add_yaxis("上证综指", sss['上证综指'].tolist(),gap="0%") .add_yaxis("创业板", sss['创业板'].tolist(),gap="0%") #添加全局配置项 .set_global_opts(title_opts=opts.TitleOpts(title="指数月收益率"), datazoom_opts=opts.DataZoomOpts(),#区域缩放配置项 yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}%"))) .set_series_opts(#添加序列配置项 label_opts=opts.LabelOpts(is_show=True,formatter='{c}%'))) g.width = "100%" #设置画布比例 g.render_notebook()

高阶应用:2021年全球资产收益率对比分析。

此处代码较长省略。完整代码见Python金融量化知识星球。

 

03 K线图Kline

K线图是对证券交易行情可视化的最基本图表之一,也是我们股票量化分析的最基本工具。

#计算指标 def get_data(code,start='2021-01-01',end=''): df=get_price(code,start,end) df['ma5']=df.close.rolling(5).mean() df['ma20']=df.close.rolling(20).mean() df['macd'],df['macdsignal'],df['macdhist']=ta.MACD(df.close,fastperiod=12,slowperiod=26,signalperiod=9) return df.dropna().round(2)

df=get_data('sh') #df.head()

使用默认参数可以得到最基本的K线图。

g = (Kline() .add_xaxis(df['2022':].index.strftime('%Y%m%d').tolist()) #y轴数据,默认openclose、low、high,转为list格式 .add_yaxis("",y_axis=df[['open', 'close', 'low', 'high']]['2022':].values.tolist()) ) g.render_notebook()

添加全局和系列配置项,强化细节展示。

def draw_kline(data): g = (Kline() .add_xaxis(data.index.strftime('%Y%m%d').tolist()) #y轴数据,默认open、close、high、low,转为list格式 .add_yaxis(series_name="", y_axis=data[['open', 'close', 'low', 'high']].values.tolist(), itemstyle_opts=opts.ItemStyleOpts( color="red",#阳线红色 color0="green",#阴线绿色 border_color="red", border_color0="green",), markpoint_opts=opts.MarkPointOpts(data=[#添加标记符 opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值'),]), #添加辅助性,如某期间内最大max最小值min均值average markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average", value_dim="close")], ),) .set_global_opts( datazoom_opts=[opts.DataZoomOpts()],#滑动模块选择 title_opts=opts.TitleOpts(title="股票K线图",pos_left='center'),)) return g

draw_kline(df).render_notebook()

高阶应用:K线图叠加成交量和技术指标。

#完整代码见Python金融量化知识星球。 def kline_volume_ta(data): pass

kline_volume_ta(df).render_notebook()

 

04 散点图Scatter

散点图通常用来反映两个变量之间的统计关系。pyecharts还支持展示多变量随着时间的变动趋势。

#创业板和上证综指历年收益率数据 #sss.head()

g = ( Scatter() .add_xaxis([str(d) for d in sss.index.year]) .add_yaxis("上证综指(%)",sss['上证综指'].tolist()) .add_yaxis("创业板(%)", sss['创业板'].tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="指数历年收益率"), visualmap_opts=opts.VisualMapOpts(type_="size", is_show=False), xaxis_opts=opts.AxisOpts(type_="category", axisline_opts=opts.AxisLineOpts(is_on_zero=False), ), yaxis_opts=opts.AxisOpts(is_show=False,)) ) g.width = "100%" g.render_notebook()

g = (
Scatter()
.add_xaxis(sss[
'上证综指'].tolist())
.add_yaxis("", sss['创业板'].tolist(),
symbol_size=20,
label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts('上证综指 VS 创业板'),
tooltip_opts=opts.TooltipOpts(is_show=False),
xaxis_opts=opts.AxisOpts(name='上证综指',
type_="value",
splitline_opts=opts.SplitLineOpts(is_show=True),
axislabel_opts=opts.LabelOpts(formatter='{value}%')),
yaxis_opts=opts.AxisOpts(name='创业板',
type_="value",
splitline_opts=opts.SplitLineOpts(is_show=True),
axislabel_opts=opts.LabelOpts(formatter='{value}%'),)))
g.width = "100%"
g.render_notebook()

 

05 热力图HeatMap

热力图实际上是个三维结构,考察两个特征维度下值的变动趋势。热力图可以应用在指数周期变化和热点板块轮动分析等。下面以指数近10年来月收益率的涨跌幅为例构建热力图。

heat_data=(index_price/index_price.shift(1)-1).to_period('M') heat_data=heat_data.groupby(heat_data.index).apply(lambda x: ((((1+x).cumprod()-1).iloc[-1])*100).round(2)) heat_data=heat_data['2011':'2021'] #heat_data.tail()

构建热力图的难点在于数据项value的值。

value = [[i,j,heat_data['上证综指'][str(2011+i)+'-'+str(1+j)]] for i in range(11) for j in range(12)] year=[str(i) for i in range(2011,2022)] month=[str(i)+'月' for i in range(1,13)] g = (HeatMap() .add_xaxis(year) .add_yaxis("", month, value, label_opts=opts.LabelOpts(is_show=True, position="inside"),) .set_global_opts( title_opts=opts.TitleOpts(title="上证综指月收益率(%)"), visualmap_opts=opts.VisualMapOpts(is_show=False,min_=-30,max_=30,))) g.render_notebook()

高阶应用:根据涨跌幅范围设置不同显示颜色

#不同点位设置不同颜色 代码省略。完整代码见Python金融量化知识星球。

 

结语

本文简单介绍了 Pyecharts (V1)基本情况、安装、模块调用和参数设置,并以股票交易数据为例,为大家展示了使用 Pyehcarts 构建直角坐标系下常用的图表,包括折线图、柱状图、K线图和热力图等。下一篇推文将进一步介绍Pyecharts其他图表的构建方法,包括日历图、仪表盘、地图、关系图等等,同时分享这些常见的图表在金融量化上的应用实例。

前言:

本人也是股票投资爱好着,这段时间行情不是很好,就想着做些其他事情转移下注意力,突然想起之前写过的小项目代码,运行后会对你想要的时间日期进行数据的分析生成,然后保存到本地,数据库之前我用的是tushare的,不过太久没用现在不知道数据的接口有没有改变,要想运行成功还是得要去他们那里搞个账号,具体我就不细节展开了。下面我放出代码,供各位大佬们参考,有能力的应该可以改成精美的图形html展示形式。

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.00] #找出下跌的股票

# 找出涨停的股票

limit_up = df[df['change']/df['pre_close'] >= 0.097]

limit_down = df[df['change']/df['pre_close'] <= -0.0970]

# 涨停股数中的未封板股,上市日期小于15天

limit_up_new = limit_up[pd.to_datetime(date_now) - limit_up['list_date'] <= pd.Timedelta(days=15)]

# 涨停股数中次新股,上市日期小于1年

limit_up_fresh = limit_up[pd.to_datetime(date_now) - limit_up['list_date'] <= pd.Timedelta(days=365)]

# 涨停股数中的未封板股,上市日期小于15天

limit_down_new = limit_down[pd.to_datetime(date_now) - limit_down['list_date'] <= pd.Timedelta(days=15)]

# 涨停股数中次新股,上市日期小于1年

limit_down_fresh = limit_down[pd.to_datetime(date_now) - limit_down['list_date'] <= pd.Timedelta(days=365)]

#df_up.shape[0]获取上涨的行数

print('A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。' % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))

print('A股总成交额:%d, 总成交量:%d' % (df['amount'].sum(), df['vol'].sum()))

print('A股平均市盈率:%.2f, 平均流通市值 %.2f 亿, 平均总市值 %.2f 亿' % (df['pe'].mean(), df['circ_mv'].mean(), df['total_mv'].mean()))

print('涨停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_up.shape[0], limit_up_new.shape[0], limit_up_fresh.shape[0]))

print('跌停数量:%d 个, 跌停中上市日期小于15天的:%d, 跌停中上市日期小于1年的:%d' % (limit_down.shape[0], limit_down_new.shape[0], limit_down_fresh.shape[0]))

file = docx.Document()

#设置总标题,居中

headb = file.add_heading('%s中国股市今日收盘分析报告' % (date_now), level=0).alignment = WD_ALIGN_PARAGRAPH.CENTER

head1 = file.add_heading('股市基本概况:',level=1) #设置一级标题

#添加段落内容

text1 = file.add_paragraph() #首先创建一个空的段落,然后再往里面加文字,这样方便设置文字格式字体等设置,另外一种写法,缺点不能单独设置字体属性

# text1 = file.add_paragraph('A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。' % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))

text1.add_run('A股上涨个数:').bold = True #添加文字并设置粗体

text1.add_run('{} '.format(str(df_up.shape[0]))).font.color.rgb = RGBColor(255, 0, 0) #添加变量

text1.add_run('A股下跌个数:').bold = True

text1.add_run('{} '.format(str(df_down.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text1.add_run('A股走平个数:').bold = True

text1.add_run('{} '.format(str(df_even.shape[0]))).font.color.rgb = RGBColor(0, 0, 255)

text1.line_spacing = Pt(25) #设置段落行距

text1.style = 'List Bullet' # 设置项目符号列表

text2 = file.add_paragraph()

text2.add_run('A股总成交额:').bold = True

text2.add_run('{}'.format(str(round(df['amount'].sum(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text2.add_run('千元 ')

text2.add_run('总成交量:').bold = True

text2.add_run('{}'.format(str(round(df['vol'].sum(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text2.add_run('手 ')

text2.line_spacing = Pt(25)

text2.style = 'List Bullet'

text3 = file.add_paragraph()

text3.add_run('A股平均市盈率:').bold = True

text3.add_run('{} '.format(str(round(df['pe'].mean())))).font.color.rgb = RGBColor(128, 0, 128)

text3.add_run('平均流通市值:').bold = True

text3.add_run('{}'.format(str(round(df['circ_mv'].mean(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text3.add_run('万元')

text3.add_run('\n')

text3.add_run('平均总市值:').bold = True

text3.add_run('{}'.format(str(round(df['total_mv'].mean(),2)))).font.color.rgb = RGBColor(128, 0, 128)

text3.add_run('万元 ')

text3.line_spacing = Pt(25)

text3.style = 'List Bullet'

text3.add_run('\n')

text4 = file.add_paragraph()

text4.add_run('涨停数量:').bold = True

text4.add_run('{}'.format(str(limit_up.shape[0]))).font.color.rgb = RGBColor(255, 0, 0)

text4.add_run('个 ')

text4.add_run('涨停中上市日期小于15天的:').bold = True

text4.add_run('{}'.format(str(limit_up_new.shape[0]))).font.color.rgb = RGBColor(255, 0, 0)

text4.add_run('个 ')

text4.add_run('\n')

text4.add_run('涨停中上市日期小于1年的:').bold = True

text4.add_run('{}'.format(str(limit_up_fresh.shape[0]))).font.color.rgb = RGBColor(255, 0, 0)

text4.add_run('个 ')

text4.line_spacing = Pt(25)

text4.style = 'List Bullet'

text5 = file.add_paragraph()

text5.add_run('跌停数量:').bold = True

text5.add_run('{}'.format(str(limit_down.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text5.add_run('个 ')

text5.add_run('跌停中上市日期小于15天的:').bold = True

text5.add_run('{}'.format(str(limit_down_new.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text5.add_run('个 ')

text5.add_run('\n')

text5.add_run('跌停中上市日期小于1年的:').bold = True

text5.add_run('{}'.format(str(limit_down_fresh.shape[0]))).font.color.rgb = RGBColor(0, 255, 0)

text5.add_run('个 ')

text5.line_spacing = Pt(25)

text5.style = 'List Bullet'

file.add_page_break() #添加分页符

def get_output(df, columns='_industry', name='_limit_up'):

# df.copy(deep= False)和df.copy()都是浅拷贝,是复制了旧对象的内容,然后重新生成一个新对象,改变旧对象不会影响新对象。

df = df.copy()

output = pd.DataFrame()

#df.groupby(columns)根据列值分组数据,并根据股票代码统计数据

output = pd.DataFrame(df.groupby(columns)['ts_code'].count())

output['平均市盈率'] = round(df.groupby(columns)['pe'].mean(),2)

output['平均流通市值(万)'] = round(df.groupby(columns)['circ_mv'].mean(),2)

output['平均总市值(万)'] = round(df.groupby(columns)['total_mv'].mean(),2)

output['平均成交量(手)'] = round(df.groupby(columns)['vol'].mean(),2)

output['平均成交额(千)'] = round(df.groupby(columns)['amount'].mean(),2)

#依据ts_code进行降序,排序后的数据集替换原来的数据

output.sort_values('ts_code', ascending=False, inplace=True)

#改列值名字,将ts_code改成name+‘_count’的形式

output.rename(columns={'ts_code': name + '合计'}, inplace=True)

return output

for i in ['industry', 'exchange', 'area']:

# 对涨停的股票分析

output_limit_up = get_output(limit_up, columns=i, name='涨停').reset_index()

# 对跌停的股票分析

output_limit_down = get_output(limit_down, columns=i, name='跌停').reset_index()

# 对全量的股票分析

output_total = get_output(df, columns=i, name='全部').reset_index()

#添加表格开头类别说明

tabletext = file.add_paragraph()

tabletext.add_run('类别:').bold = True

tabletext.add_run('{} '.format(str(i))).font.color.rgb = RGBColor(222, 125, 44)

print(output_limit_up)

print(output_limit_down)

print(output_total)

for j in [output_limit_up, output_limit_down, output_total]: #, output_total

tb = file.add_table(rows=len(j.index)+1, cols=len(j.columns),style='Medium Grid 3 Accent 1')

tb.autofit = True #关闭表格行宽自适应

for x in range(len(j.columns)):

tb.cell(0, x).text = j.columns[x] #添加表列头

#tb.cell(0, x).width = Inches(1.2) #设置行宽

tb.cell(0, x).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #文字居中

for row in range(len(j.index)):

for col in range(len(j.columns)):

tb.cell(row+1, col).text = str(j.iloc[row, col]) #设置行宽

tb.cell(row+1, col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #文字居中

file.add_paragraph('\n') #表格换行

file.add_page_break() #每制成一个类别表格分一次页面

#之所以生成文件慢是因为output_total这个统计需要长时间计算,如果需要速度快你可以试着把output_total去掉

#生成一个docx文件我的电脑需要3到4分钟左右

file.save('D:\\stock_analysis\\{}_分析报告.docx'.format(str(date_now)))

print('{}_分析报告分析完成'.format(str(date_now)))

if __name__=="__main__":

get_all_stockdata('20200611', '20200611')

get_analysis_stockdata('20200611', '20200611')

https://www.shideke.com

上一篇:现货交易技巧百科(现货交易操作技巧)

下一篇:股市利好消息(股市消息最快的软件)

相关推荐

返回顶部