from pyecharts import options as opts # 全局、系列配置 from pyecharts.charts import Bar, Grid, Line # 柱形图 from pyecharts.globals import ThemeType # 主题风格 from pyecharts.charts import Kline, Line, Bar, Gauge, Pie, Scatter, TreeMap # K线图、线形图、柱状图、仪表盘、饼图、散点图、矩形树图 from pyecharts.charts import Grid, Tab # 组合组件、分页组件 from pyecharts.components import Table # 表格组件 from pyecharts.options import ComponentTitleOpts from pyecharts.commons.utils import JsCode import time # 时间模块 # import pandas as pd # Pandas模块 ########################################################### Pandas数据读写操作 ########################################################### class Pands_Handler: # 初始化 def __init__(self): self.start = start self.end = end # pandas查询数据 def data_query(self, table): sql = '''select * from {table}'''.format(table=table) ########################################################### 宏观资金流动性 ########################################################### class Getdata: # 黄金、外汇储备 def get_data_01(self): return Pands_Handler.data_query('a_china_fx_gold') # 货币投放量 def get_data_02(self): return Pands_Handler.data_query('a_china_hb') # 货币供应量 def get_data_03(self): return Pands_Handler.data_query('a_china_money_supply') # 正回购、逆回购 def get_data_04(self): return Pands_Handler.data_query('a_china_money_supply') # 沪深股通资金总览 def get_data_05(self): return Pands_Handler.data_query('a_hsgt_moneyflow') # 指数行情 def get_data_06(self): return Pands_Handler.data_query('a_index_daily') # 涨停统计总览 def get_data_07(self): return Pands_Handler.data_query('a_market_limit_up_count') # shibor、利率 def get_data_08(self): return Pands_Handler.data_query('a_shibor') # 投资者账户总览 def get_data_09(self): return Pands_Handler.data_query('a_stock_account') # 大单资金流向 def get_data_10(self): return Pands_Handler.data_query('a_stock_big_money') # 集合竞价 def get_data_11(self): return Pands_Handler.data_query('a_stock_call_auction') # 盘口异动明细 def get_data_12(self): return Pands_Handler.data_query('a_stock_change') # 所属概念 def get_data_13(self): return Pands_Handler.data_query('a_stock_concept') # 个股行情 def get_data_14(self): return Pands_Handler.data_query('a_stock_daily') # 个股指标 def get_data_15(self): return Pands_Handler.data_query('a_stock_daily_basic') # 龙虎榜风口概念 def get_data_16(self): return Pands_Handler.data_query('a_stock_hot_concept') # 沪深股通明细 def get_data_17(self): return Pands_Handler.data_query('a_stock_hsgt_hold') # 所属行业 def get_data_18(self): return Pands_Handler.data_query('a_stock_industry') # 龙虎榜成交明细 def get_data_19(self): return Pands_Handler.data_query('a_stock_lhb_list') # 涨停、跌停板明细 def get_data_20(self): return Pands_Handler.data_query('a_stock_limit_list') # 涨跌停价格明细 def get_data_21(self): return Pands_Handler.data_query('a_stock_limit_price') # 涨停板统计分析 def get_data_22(self): return Pands_Handler.data_query('a_stock_limit_up_pool') # 股票列表 def get_data_23(self): return Pands_Handler.data_query('a_stock_list') # 破净股统计 def get_data_24(self): return Pands_Handler.data_query('a_stock_pjgnum') # 市场涨跌统计 def get_data_25(self): return Pands_Handler.data_query('a_stock_scqx_zdtjs') # 创新高、创新低 def get_data_26(self): return Pands_Handler.data_query('a_stock_xgdnum') # 交易日历 def get_data_27(self): return Pands_Handler.data_query('a_trade_cal_date') class Dealdata: # 黄金、外汇储备 def get_data_deal_01(self, data): # 外汇储备:亿美元 # 黄金储备、万盎司 data.columns = ['日期', '外汇储备', '黄金储备'] return data # 货币投放量 def get_data_deal_02(self, data): # 净投放量、亿 # 回笼量 、亿 # 投放量 、亿 data.columns = ['开始日期', '净投放量', '回笼量', '结束日期', '投放量', '周期'] return data # 货币供应量 def get_data_deal_03(self, data): # M2、亿 # M1、亿 # M0、亿 data.columns = ['日期', 'M2', 'M1', 'M0'] return data # 正回购、逆回购 def get_data_deal_04(self, data): # 操作日期、天 # 交易金额、亿 # 中标利率、% data.columns = ['日期', '操作期限', '交易金额', '中标类型', '中标利率'] return data # 沪深股通资金总览 def get_data_deal_05(self, data): # 沪股通 、百万 # 深股通 、百万 # 北向资金、百万 data.columns = ['日期', '沪股通', '深股通', '北向资金'] return data # 指数行情 def get_data_deal_06(self, data): # ***价、元 # 涨跌幅、% # 成交额、千元 data.columns = ['代码', '日期', '开盘价', '最高价', '最低价', '收盘价', '昨收价', '涨跌幅', '成交额'] return data # 涨停统计总览 def get_data_deal_07(self, data): data.columns = ['日期', '连板股', '二连板', '三连板', '高度板'] return data # shibor、利率 def get_data_deal_08(self, data): data.columns = ['日期', '隔夜', '一月'] return data # 投资者账户总览 def get_data_deal_09(self, data): # 新增投资者数量、万户 # 期末投资者数量、万户 # 沪深总市值 、万亿 # 沪深人均总市值、万元 data.columns = ['日期', '新增投资者数量', '期末投资者数量', '沪深总市值', '沪深人均市值'] return data # 大单资金流向 def get_data_deal_10(self, data): # 中单买入、万元 # 中单卖出、万元 # 大单买入、万元 # 大单卖出、万元 # 超大单买入、万元 # 超大单卖出、万元 # 净流入、万元 data.columns = ['代码', '日期', '中单买入', '中单卖出', '大单买入', '大单卖出', '超大单买入', '超大单卖出', '净流入'] return data # 集合竞价 def get_data_deal_11(self, data): # 成交价、元 # 成交额、元 data.columns = ['代码', '日期', '成交价', '成交额'] return data # 盘口异动明细 def get_data_deal_12(self, data): data.columns = ['时间', '代码', '名称', '异动类型', '异动值', '单位'] return data # 所属概念 def get_data_deal_13(self, data): data.columns = ['代码', '名称', '概念'] return data # 个股行情 def get_data_deal_14(self, data): # ***价、元 # 涨跌幅、% # 成交额、千元 data.columns = ['代码', '日期', '开盘价', '最高价', '最低价', '收盘价', '昨收价', '涨跌幅', '成交额'] return data # 个股指标 def get_data_deal_15(self, data): # 实际换手率、% # 总股本、万股 # 流通股本、万股 # 自由流通股本、万股 data.columns = ['代码', '日期', '实际换手率', '量比', '总股本', '流通股本', '自由流通股本'] return data # 龙虎榜风口概念 def get_data_deal_16(self, data): data.columns = ['日期', '代码', '名称', '风口概念'] return data # 沪深股通明细 def get_data_deal_17(self, data): # 收盘价、元 # 涨跌幅、% # 持股数量、股 # 持股市值、元 # 增持数量、股 # 增持市值、元 data.columns = ['日期', '代码', '名称', '行业', '收盘价', '涨跌幅', '持股数量', '持股市值', '增持数量', '增持市值'] return data # 所属行业 def get_data_deal_18(self, data): data.columns = ['代码', '名称', '行业'] return data # 龙虎榜成交明细 def get_data_deal_19(self, data): # 买入金额、元 # 卖出金额、元 data.columns = ['日期', '代码', '买卖方向', '营业部名称', '买入金额', '卖出金额', '营业部标签', '游资标签'] return data # 涨停、跌停板明细 def get_data_deal_20(self, data): # 收盘价、元 # 涨跌幅、% # 封单金额、元 # 开板次数、次 data.columns = ['日期', '代码', '收盘价', '涨跌幅', '封单比', '封单金额', '首次封板时间', '最后封板时间', '开板次数', '涨跌强度', '涨跌类型'] return data # 涨跌停价格明细 def get_data_deal_21(self, data): # 涨停价、元 # 跌停价、元 data.columns = ['日期', '代码', '涨停价', '跌停价'] return data # 涨停板统计分析 def get_data_deal_22(self, data): data.columns = ['日期', '代码', '连板数', '区间天数', '涨停数', '行业'] return data # 股票列表 def get_data_deal_23(self, data): data.columns = ['代码', '名称', '省份', '市场', '上市板块', '上市日期', '是否沪深股通'] return data # 破净股统计 def get_data_deal_24(self, data): data.columns = ['日期', '破净股数量', '公司总家数', '破净比率'] return data # 市场涨跌统计 def get_data_deal_25(self, data): data.columns = ['日期', '曾涨停', '曾跌停', '涨停', '跌停', '一字涨停', '一字跌停', '大幅上涨', '大幅下跌', '大碗面', '反包板', '公司家数'] return data # 创新高、创新低 def get_data_deal_26(self, data): data.columns = ['日期', '20日新高', '20日新低', '60日新高', '60日新低', '120日新高', '120日新低'] return data # 交易日历 def get_data_deal_27(self, data): data.columns = ['上市板块', '交易日期', '日期判断', '上一个交易日期'] return data class Calculate: # 均线计算 def calculate_ma(self, day_count, data): result = [] for i in range(len(data["values"])): if i < day_count: result.append("-") continue sum_total = 0.0 for j in range(day_count): sum_total += float(data["values"][i - j][1]) result.append(abs(float("%.3f" % (sum_total / day_count)))) return result # 多日主力资金流向 def calculate_stock_fund(self,day_count,data): result = [] for index, row in data.itterow: pass # 市场情绪 def calculate_market_emotion(self): pass data = data.replace({'正回购': -1, '逆回购': 1}) data['amount'] = data['deal_amount'] * data['trading_method'] data = data[['operation_from_date', 'amount']] data.columns = ['日期', '交易金额'] return data # 货币供应量 def get_data_hbgyl(self): data = Pands_Handler().data_query('a_china_money_supply') data.columns = ['日期', 'M2', 'M1', 'M0'] return data # 上证、深证、创业板指数 def get_data_index(self): data = Pands_Handler().data_query('a_index_daily') data1 = data[data['scode'] == '000001.SH'] # 上证指数 data2 = data[data['scode'] == '399001.SZ'] # 深证指数 data3 = data[data['scode'] == '399006.SZ'] # 创业板指数 data1 = data1[['date', 'oprice', 'hprice', 'lprice', 'cprice', 'pct_chg', 'amount']] data2 = data2[['date', 'oprice', 'hprice', 'lprice', 'cprice', 'pct_chg', 'amount']] data3 = data3[['date', 'oprice', 'hprice', 'lprice', 'cprice', 'pct_chg', 'amount']] data1.columns = ['日期', '开盘价', '最高价', '最低价', '收盘价', '涨跌幅', '成交额'] data2.columns = ['日期', '开盘价', '最高价', '最低价', '收盘价', '涨跌幅', '成交额'] data3.columns = ['日期', '开盘价', '最高价', '最低价', '收盘价', '涨跌幅', '成交额'] return data1, data2, data3 # 沪深股通资金 def get_data_hsgt(self): data = Pands_Handler().data_query('a_hsgt_moneyflow') data.columns = ['日期', '沪股通', '深股通', '北向资金'] return data # Shibor利率 def get_data_shibor(self): data = Pands_Handler().data_query('a_shibor') data = data[['date', 'pre_night_shibor']] data.columns = ['日期', '隔夜shibor'] return data # 沪深两市成交额 def get_data_hsls(self): data = Pands_Handler().data_query('a_stock_daily') data = data[['date', 'amount']] data = data.groupby('date').sum().reset_index() data.columns = ['日期', '成交额'] return data # 沪深竞价成交额 def get_data_call(self): data = Pands_Handler().data_query('a_stock_call_auction') data = data[['date', 'amount']] data = data.groupby('date').sum().reset_index() data.columns = ['日期', '成交额'] return data # 龙虎榜席位成交 def get_data_lhb_classify(self): data = Pands_Handler().data_query('a_stock_lhb_list') # youziicon:一线游资(1)、顶级游资(2)、知名游资(3)、机构(4)、沪股通(5)、深股通(6)、其他(0) data['amount'] = data['buy'] + data['sell'] data = data[['date', 'direction', 'amount', 'youziicon']] data = pd.pivot_table(data, values='amount', columns='direction', index=['date', 'youziicon'], aggfunc='sum', margins=True) data = data.reset_index() data = data[data['date'] != 'All'] data = data.replace({0: '其他', 1: '一线游资', 2: '顶级游资', 3: '知名游资', 4: '机构', 5: '沪股通', 6: '深股通'}) data.columns = ['日期', '资金类型', '买入额', '卖出额', '净买入额'] return data # 大资金流向 def get_data_dzjlx(self): data = Pands_Handler().data_query('a_stock_big_money') data['md_net_amount'] = data['bmd_amount'] - data['smd_amount'] data['lg_net_amount'] = data['blg_amount'] - data['slg_amount'] data['elg_net_amount'] = data['belg_amount'] - data['selg_amount'] data = data[['date', 'bmd_amount', 'smd_amount', 'md_net_amount', 'blg_amount', 'slg_amount', 'lg_net_amount', 'belg_amount', 'selg_amount', 'elg_net_amount', 'net_amount']] data = data.groupby('date').sum().reset_index() data.columns = ['日期', '中单买入', '中单卖出', '中单净流入', '大单买入', '大单卖出', '大单净流入', '超大单买入', '超大单卖出', '超大单净流入', '净流入'] print(data) # 市场情绪 def get_data_scqx(self): data1 = Pands_Handler().data_query('a_market_limit_up_count') data2 = Pands_Handler().data_query('a_stock_scqx_zdtjs') data3 = Pands_Handler().data_query('a_stock_pjgnum') data4 = Pands_Handler().data_query('a_stock_xgdnum') data5 = Pands_Handler().data_query('a_stock_limit_list') class Market: # 特殊柱状图 def sbar(self, x_data, y_data, series_names, title, subtitle): c = ( Bar() .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name=series_names, y_axis=y_data, is_large=True, large_threshold=400, label_opts=opts.LabelOpts( is_show=False, ), ) .set_global_opts( title_opts=opts.TitleOpts( title=title, subtitle=subtitle, item_gap=10, title_textstyle_opts=opts.TextStyleOpts( font_family='Microsoft YaHei', font_weight='bolder', font_size=14, color='', ), subtitle_textstyle_opts=opts.TextStyleOpts( font_family=None, font_size=10, color='', ), ), legend_opts=opts.LegendOpts( is_show=True, pos_right=5, orient='vertical', legend_icon='rect', ), tooltip_opts=opts.TooltipOpts( is_show=True, trigger='axis', trigger_on='click', formatter="{a}: {c}", textstyle_opts=opts.TextStyleOpts( font_family='Arial', font_size=14, ) ), visualmap_opts=opts.VisualMapOpts( is_piecewise=True, pieces=[ {"max": 0, "color": 'green'}, {"min": 0, "color": 'red'} ] ) ) .render('shangzheng.html') ) def cbar(self, x_data, series_names, y_data): bar_1 = ( Bar() .add_xaxis(xaxis_data=data["times"]) .add_yaxis( series_name="Volumn", yaxis_data=data["vols"], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), # 改进后在 grid 中 add_js_funcs 后变成如下 itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), ) ) # 常规折线图 def cline(self, x_data): c = ( Line() .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name=series_names, y_axis=y_data, is_smooth=True, linestyle_opts=opts.LineStyleOpts( width=3, opacity=0.5, curve=1, type_='solid', color='' ) ) .set_global_opts(title_opts=opts.TitleOpts(title="Line-smooth")) .render("line_smooth.html") ) def bar1(self): bar = ( Bar() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values(), label_opts=opts.LabelOpts(position="right")) .add_yaxis("商家B", Faker.values(), label_opts=opts.LabelOpts(position="right")) .reversal_axis() .set_global_opts( title_opts=opts.TitleOpts("Timeline-Bar-Reversal (时间: {} 年)".format(i)) ) ) # 特殊折线图 def kline(self): kline = ( Kline() .add_xaxis(xaxis_data=data["times"]) .add_yaxis( series_name="", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ] ), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts( position="middle", color="blue", font_size=15 ), data=split_data_part(), symbol=["circle", "none"], ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True, data=split_data_part()) ) .set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True) ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100 ), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 # axispointer_opts=opts.AxisPointerOpts( # is_show=True, # link=[{"xAxisIndex": "all"}], # label=opts.LabelOpts(background_color="#777"), # ), ) ) def timeline(self): attr = Faker.choose() tl = Timeline() for i in range(2015, 2020): pie = ( Pie() .add( "商家A", [list(z) for z in zip(attr, Faker.values())], rosetype="radius", radius=["30%", "55%"], ) .set_global_opts(title_opts=opts.TitleOpts("某商店{}年营业额".format(i))) ) tl.add(pie, "{}年".format(i)) tl.render("timeline_pie.html") def tab(self): tab = Tab() tab.add(bar_datazoom_slider(), "bar-example") tab.add(line_markpoint(), "line-example") tab.add(pie_rosetype(), "pie-example") tab.add(grid_mutil_yaxis(), "grid-example") tab.render("tab_base.html") def if __name__ == '__main__': start = '' end = '' # data = pd.DataFrame() x_data = [1, 2, 3, 4] y_data = [-100, 200, 30, -50] series_names = '' title = '涨跌幅' subtitle = '单位' Market().sbar(x_data, y_data, series_names, title, subtitle) Market().cbar(x_data, series_names, y_data)