Python股票量化盘后分析系统,也就七百行代码!

python 股票量化盘后分析系统(Beta v0.21) 前言: 最近感觉代码写的越来越乱了,各种变量名称跟函数让我头脑混乱,估计写完这个后,我要花一些时间来整理巩固下基础知识了,写完下面的这些臃肿代码,暂停段时间理下思路,既然发现了自己的不足就应该去弥补,而不是视若无睹。 以下代码比上一次添加了大盘指数指标的信息展示,添加了大盘K线样式属性,其他的好像也没什么改变了,代码效果图如下: import pandas as pd import tushare as ts import mplfinance as mpf import tkinter as tk imp 阅读详情

前言:
最近感觉代码写的越来越乱了,各种变量名称跟函数让我头脑混乱,估计写完这个后,我要花一些时间来整理巩固下基础知识了,写完下面的这些臃肿代码,暂停段时间理下思路,既然发现了自己的不足就应该去弥补,而不是视若无睹。
以下代码比上一次添加了大盘指数指标的信息展示,添加了大盘K线样式属性,其他的好像也没什么改变了,代码效果图如下:

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

import pandas as pd
import tushare as ts
import mplfinance as mpf
import tkinter as tk
import tkinter.tix as tix
from tkinter import ttk
import tkinter.font as tf
from tkinter.constants import *
import matplotlib.pyplot as plt
import matplotlib.dates as mdates  # 处理日期
import matplotlib as mpl  # 用于设置曲线参数
from cycler import cycler  # 用于定制线条颜色
import datetime
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)

pro = ts.pro_api('要到tushare官网注册个账户然后将token复制到这里,可以的话请帮个忙用文章末我分享的链接注册,谢谢')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 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')  # 显示居中

root = tk.Tk()  # 创建主窗口
screenWidth = root.winfo_screenwidth()  # 获取屏幕宽的分辨率
screenHeight = root.winfo_screenheight()
x, y = int(screenWidth / 4), int(screenHeight / 4)  # 初始运行窗口屏幕坐标(x, y),设置成在左上角显示
width = int(screenWidth / 2)  # 初始化窗口是显示器分辨率的二分之一
height = int(screenHeight / 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))  # 窗口的大小跟初始运行位置
root.title('Wilbur量化复盘分析软件')
# root.resizable(0, 0)  # 固定窗口宽跟高,不能调整大小,无法最大窗口化
root.iconbitmap('ZHY.ico')  # 窗口左上角图标设置,需要自己放张图标为icon格式的图片文件在项目文件目录下

main_window = tk.PanedWindow(root)  # 设置窗口管理,将主窗口分成左右两部分
main_window.pack(fill='both', expand=1)

main_frame = tk.Frame(main_window, width=screenWidth, height=screenHeight, relief=tk.SUNKEN, bg='#353535', bd=5,
                      borderwidth=4)
main_window.pack(fill=BOTH, expand=1)
main_window.add(main_frame)  # 将功能主框架添加到左边窗口


# 创建图形显示主框架
graphic_main_frame = tk.Frame(main_window, width=screenWidth, height=screenHeight, relief=tk.SUNKEN, bg='#353535',
                              bd=5, borderwidth=4)
main_window.pack(fill=BOTH, expand=0)
main_window.add(graphic_main_frame)  # 将查询主框架添加到右边窗口


def stockindex_function():
    # 必须添加以下控件销毁代码,不然点击一次按钮框架长生一次,显示的画面会多一次,你可以将下面的代码删除测试看下
    for widget_graphic_main_frame in graphic_main_frame.winfo_children():
        widget_graphic_main_frame.destroy()
    # 在右边窗口的graphic_main_frame框架下再创建窗口
    # opaqueresize该选项的值为 False,窗格的尺寸在用户释放鼠标的时候才更新到新的位置
    stockindex_information_window = tk.PanedWindow(graphic_main_frame, opaqueresize=False)
    stockindex_information_window.pack(fill=BOTH, expand=1)

    # 在company_information_window窗口下设置指数信息显示功能
    stockindex_text = tk.Text(stockindex_information_window, bg='white', undo=True, wrap=tix.CHAR)
    stockindex_information_window.add(stockindex_text, width=200)

    # 首先获取今天时间,然后先尝试获取今天的数据,然后今天返回空值,则获取昨天的数据显示
    now_time = datetime.datetime.now()
    # 转化成tushare的时间格式
    strf_time = now_time.strftime('%Y%m%d')
    shsz_index_dailybasic = pro.index_dailybasic(trade_date=strf_time, fields='ts_code,trade_date,total_mv, '
                                                                              'float_mv,total_share,float_share,'
                                                                              'free_share,turnover_rate,'
                                                                              'turnover_rate_f,pe,pb')
    sh_index_daily = pro.index_daily(ts_code='000001.SH', trade_date=strf_time)
    sz_index_daily = pro.index_daily(ts_code='399001.SZ', trade_date=strf_time)
    cy_index_daily = pro.index_daily(ts_code='399006.SZ', trade_date=strf_time)
    zx_index_daily = pro.index_daily(ts_code='399005.SZ', trade_date=strf_time)
    print(sh_index_daily)
    if shsz_index_dailybasic.empty:
        now_time = datetime.datetime.now() - datetime.timedelta(days=1)
        strf_time = now_time.strftime('%Y%m%d')
        shsz_index_dailybasic = pro.index_dailybasic(trade_date=strf_time, fields='ts_code,trade_date,total_mv, '
                                                                                  'float_mv,total_share,float_share,'
                                                                                  'free_share,turnover_rate,'
                                                                                  'turnover_rate_f,pe,pb')
        sh_index_daily = pro.index_daily(ts_code='000001.SH', trade_date=strf_time)
        sz_index_daily = pro.index_daily(ts_code='399001.SZ', trade_date=strf_time)
        cy_index_daily = pro.index_daily(ts_code='399006.SZ', trade_date=strf_time)
        zx_index_daily = pro.index_daily(ts_code='399005.SZ', trade_date=strf_time)
        print(sh_index_daily)
    # 数据处理,将ts_code作为索引,方便准确调用数据,保留两位小数
    shsz_index_dailybasic.set_index('ts_code', inplace=True)
    # 数据获取
    sh_total_mv = round(shsz_index_dailybasic.at['000001.SH', 'total_mv']/100000000, 2)  # 元转换成亿单位
    sh_float_mv = round(shsz_index_dailybasic.at['000001.SH', 'float_mv']/100000000, 2)
    sh_total_share = round(shsz_index_dailybasic.at['000001.SH', 'total_share']/10000000000, 2)  # 股转化成亿手
    sh_float_share = round(shsz_index_dailybasic.at['000001.SH', 'float_share']/10000000000, 2)
    sh_free_share = round(shsz_index_dailybasic.at['000001.SH', 'free_share']//10000000000, 2)
    sh_turnover_rate = shsz_index_dailybasic.at['000001.SH', 'turnover_rate']
    sh_pe = shsz_index_dailybasic.at['000001.SH', 'pe']
    sh_pb = shsz_index_dailybasic.at['000001.SH', 'pb']
    sh_close = sh_index_daily.at[0, 'close']
    sh_pre_close = sh_index_daily.at[0, 'pre_close']
    sh_pct_chg = sh_index_daily.at[0, 'pct_chg']
    sh_vol = round(sh_index_daily.at[0, 'vol']/100000000, 2)  # 手转化成亿手
    sh_amount = round(sh_index_daily.at[0, 'amount']/100000, 2)  # 千元转换成亿元

    # 数据调用
    # 在文本框第一行添加股票代码,文字红色,居中显示
    stockindex_text.insert(tk.INSERT, '上证指数')
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总市值(亿):')
    stockindex_text.insert(tk.INSERT, sh_total_mv)
    stockindex_text.tag_add('tag1', '1.0', '1.9')  # 设置选定的内容
    stockindex_text.tag_config('tag1', foreground='red', justify=CENTER)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通市值(亿):')
    stockindex_text.insert(tk.INSERT, sh_float_mv)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总股本(亿手):')
    stockindex_text.insert(tk.INSERT, sh_total_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, sh_float_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '自由流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, sh_free_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '换手率:')
    stockindex_text.insert(tk.INSERT, sh_turnover_rate)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市盈率:')
    stockindex_text.insert(tk.INSERT, sh_pe)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市净率:')
    stockindex_text.insert(tk.INSERT, sh_pb)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '收盘点位:')
    stockindex_text.insert(tk.INSERT, sh_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '昨日收盘点:')
    stockindex_text.insert(tk.INSERT, sh_pre_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '涨跌幅(%):')
    stockindex_text.insert(tk.INSERT, sh_pct_chg)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交量(亿手):')
    stockindex_text.insert(tk.INSERT, sh_vol)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交额(亿):')
    stockindex_text.insert(tk.INSERT, sh_amount)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.tag_add('content1', '2.0', 'end')  # 设置选定的内容
    stockindex_text.tag_config('content1', foreground='blue')

    sz_total_mv = round(shsz_index_dailybasic.at['399001.SZ', 'total_mv'] / 100000000, 2)  # 转换成亿单位
    sz_float_mv = round(shsz_index_dailybasic.at['399001.SZ', 'float_mv'] / 100000000, 2)
    sz_total_share = round(shsz_index_dailybasic.at['399001.SZ', 'total_share'] / 10000000000, 2)  # 转化成亿手
    sz_float_share = round(shsz_index_dailybasic.at['399001.SZ', 'float_share'] / 10000000000, 2)
    sz_free_share = round(shsz_index_dailybasic.at['399001.SZ', 'free_share'] // 10000000000, 2)
    sz_turnover_rate = shsz_index_dailybasic.at['399001.SZ', 'turnover_rate']
    sz_pe = shsz_index_dailybasic.at['399001.SZ', 'pe']
    sz_pb = shsz_index_dailybasic.at['399001.SZ', 'pb']
    sz_close = sz_index_daily.at[0, 'close']
    sz_pre_close = sz_index_daily.at[0, 'pre_close']
    sz_pct_chg = sz_index_daily.at[0, 'pct_chg']
    sz_vol = round(sz_index_daily.at[0, 'vol']/100000000, 2)  # 手转化成亿手
    sz_amount = round(sz_index_daily.at[0, 'amount']/100000, 2)  # 千元转换成亿元

    stockindex_text.insert(tk.INSERT, '深证指数')
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总市值(亿):')
    stockindex_text.insert(tk.INSERT, sz_total_mv)
    stockindex_text.tag_add('tag2', '15.0', '15.9')  # 设置选定的内容,
    stockindex_text.tag_config('tag2', foreground='red', justify=CENTER)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通市值(亿):')
    stockindex_text.insert(tk.INSERT, sz_float_mv)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总股本(亿手):')
    stockindex_text.insert(tk.INSERT, sz_total_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, sz_float_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '自由流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, sz_free_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '换手率:')
    stockindex_text.insert(tk.INSERT, sz_turnover_rate)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市盈率:')
    stockindex_text.insert(tk.INSERT, sz_pe)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市净率:')
    stockindex_text.insert(tk.INSERT, sz_pb)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '收盘点位:')
    stockindex_text.insert(tk.INSERT, sz_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '昨日收盘点:')
    stockindex_text.insert(tk.INSERT, sz_pre_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '涨跌幅(%):')
    stockindex_text.insert(tk.INSERT, sz_pct_chg)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交量(亿手):')
    stockindex_text.insert(tk.INSERT, sz_vol)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交额(亿):')
    stockindex_text.insert(tk.INSERT, sz_amount)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.tag_add('content2', '16.0', 'end')  # 设置选定的内容
    stockindex_text.tag_config('content2', foreground='DarkViolet')

    cy_total_mv = round(shsz_index_dailybasic.at['399006.SZ', 'total_mv'] / 100000000, 2)  # 转换成亿单位
    cy_float_mv = round(shsz_index_dailybasic.at['399006.SZ', 'float_mv'] / 100000000, 2)
    cy_total_share = round(shsz_index_dailybasic.at['399006.SZ', 'total_share'] / 10000000000, 2)  # 转化成亿手
    cy_float_share = round(shsz_index_dailybasic.at['399006.SZ', 'float_share'] / 10000000000, 2)
    cy_free_share = round(shsz_index_dailybasic.at['399006.SZ', 'free_share'] // 10000000000, 2)
    cy_turnover_rate = shsz_index_dailybasic.at['399006.SZ', 'turnover_rate']
    cy_pe = shsz_index_dailybasic.at['399006.SZ', 'pe']
    cy_pb = shsz_index_dailybasic.at['399006.SZ', 'pb']
    cy_close = sh_index_daily.at[0, 'close']
    cy_pre_close = cy_index_daily.at[0, 'pre_close']
    cy_pct_chg = cy_index_daily.at[0, 'pct_chg']
    cy_vol = round(cy_index_daily.at[0, 'vol']/100000000, 2)  # 手转化成亿手
    cy_amount = round(cy_index_daily.at[0, 'amount']/100000, 2)  # 千元转换成亿元

    stockindex_text.insert(tk.INSERT, '创业板指数')
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总市值(亿):')
    stockindex_text.insert(tk.INSERT, cy_total_mv)
    stockindex_text.tag_add('tag3', '29.0', '29.9')  # 设置选定的内容,
    stockindex_text.tag_config('tag3', foreground='red', justify=CENTER)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通市值(亿):')
    stockindex_text.insert(tk.INSERT, cy_float_mv)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总股本(亿手):')
    stockindex_text.insert(tk.INSERT, cy_total_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, cy_float_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '自由流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, cy_free_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '换手率:')
    stockindex_text.insert(tk.INSERT, cy_turnover_rate)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市盈率:')
    stockindex_text.insert(tk.INSERT, cy_pe)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市净率:')
    stockindex_text.insert(tk.INSERT, cy_pb)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '收盘点位:')
    stockindex_text.insert(tk.INSERT, cy_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '昨日收盘点:')
    stockindex_text.insert(tk.INSERT, cy_pre_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '涨跌幅(%):')
    stockindex_text.insert(tk.INSERT, cy_pct_chg)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交量(亿手):')
    stockindex_text.insert(tk.INSERT, cy_vol)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交额(亿):')
    stockindex_text.insert(tk.INSERT, cy_amount)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.tag_add('content3', '30.0', 'end')  # 设置选定的内容
    stockindex_text.tag_config('content3', foreground='DarkCyan')

    zx_total_mv = round(shsz_index_dailybasic.at['399005.SZ', 'total_mv'] / 100000000, 2)  # 转换成亿单位
    zx_float_mv = round(shsz_index_dailybasic.at['399005.SZ', 'float_mv'] / 100000000, 2)
    zx_total_share = round(shsz_index_dailybasic.at['399005.SZ', 'total_share'] / 10000000000, 2)  # 转化成亿手
    zx_float_share = round(shsz_index_dailybasic.at['399005.SZ', 'float_share'] / 10000000000, 2)
    zx_free_share = round(shsz_index_dailybasic.at['399005.SZ', 'free_share'] // 10000000000, 2)
    zx_turnover_rate = shsz_index_dailybasic.at['399005.SZ', 'turnover_rate']
    zx_pe = shsz_index_dailybasic.at['399005.SZ', 'pe']
    zx_pb = shsz_index_dailybasic.at['399005.SZ', 'pb']
    zx_close = zx_index_daily.at[0, 'close']
    zx_pre_close = zx_index_daily.at[0, 'pre_close']
    zx_pct_chg = zx_index_daily.at[0, 'pct_chg']
    zx_vol = round(zx_index_daily.at[0, 'vol']/100000000, 2)  # 手转化成亿手
    zx_amount = round(zx_index_daily.at[0, 'amount']/100000, 2)  # 千元转换成亿元

    stockindex_text.insert(tk.INSERT, '中小板指数')
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总市值(亿):')
    stockindex_text.insert(tk.INSERT, zx_total_mv)
    stockindex_text.tag_add('tag4', '43.0', '43.9')  # 设置选定的内容,
    stockindex_text.tag_config('tag4', foreground='red', justify=CENTER)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通市值(亿):')
    stockindex_text.insert(tk.INSERT, zx_float_mv)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '总股本(亿手):')
    stockindex_text.insert(tk.INSERT, zx_total_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, zx_float_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '自由流通股本(亿手):')
    stockindex_text.insert(tk.INSERT, zx_free_share)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '换手率:')
    stockindex_text.insert(tk.INSERT, zx_turnover_rate)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市盈率:')
    stockindex_text.insert(tk.INSERT, zx_pe)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '市净率:')
    stockindex_text.insert(tk.INSERT, zx_pb)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '收盘点位:')
    stockindex_text.insert(tk.INSERT, zx_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '昨日收盘点:')
    stockindex_text.insert(tk.INSERT, zx_pre_close)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '涨跌幅(%):')
    stockindex_text.insert(tk.INSERT, zx_pct_chg)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交量(亿手):')
    stockindex_text.insert(tk.INSERT, zx_vol)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '成交额(亿):')
    stockindex_text.insert(tk.INSERT, zx_amount)
    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.tag_add('content4', '44.0', 'end')  # 设置选定的内容
    stockindex_text.tag_config('content4', foreground='Sienna')

    stockindex_text.insert(tk.INSERT, '\n')
    stockindex_text.insert(tk.INSERT, '数据交易日:')
    stockindex_text.insert(tk.INSERT, strf_time)
    stockindex_text.tag_add('content5', '58.0', 'end')  # 设置选定的内容
    stockindex_text.tag_config('content5', foreground='Crimson')

    stockindex_window = tk.PanedWindow(orient='vertical', opaqueresize=False)
    stockindex_information_window.add(stockindex_window)

    stockindex_sh_frame = tk.Frame(stockindex_window, width=screenWidth, height=screenHeight, relief=tk.SUNKEN,
                                   bg='#353535', bd=5, borderwidth=4)
    stockindex_sh_frame.pack(fill=BOTH)
    stockindex_window.add(stockindex_sh_frame, height=screenHeight/2)

    stockindex_sz_frame = tk.Frame(stockindex_window, width=screenWidth, height=screenHeight, relief=tk.SUNKEN,
                                   bg='#353535', bd=5, borderwidth=4)
    stockindex_sz_frame.pack(fill=BOTH)
    stockindex_window.add(stockindex_sz_frame)

    for widget_stockindex_sh_frame in stockindex_sh_frame.winfo_children():
        widget_stockindex_sh_frame.destroy()
    for widget_stockindex_sz_frame in stockindex_sz_frame.winfo_children():
        widget_stockindex_sz_frame.destroy()
    for widget_stockindex_text in stockindex_text.winfo_children():
        widget_stockindex_text.destroy()
    # 上证指数
    index_data_sh = pro.index_daily(ts_code='000001.SH', start_date=20100101)
    # 日数据处理
    # :取所有行数据,后面取date列,open列等数据
    index_data_sh = index_data_sh.loc[:, ['trade_date', 'open', 'close', 'high', 'low', 'vol']]
    index_data_sh = index_data_sh.rename(columns={'trade_date': 'Date', 'open': 'Open', 'close': 'Close',
                                                  'high': 'High', 'low': 'Low', 'vol': 'Volume'})  # 更换列名,为后面函数变量做准备
    index_data_sh.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
    # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
    index_data_sh.index = pd.DatetimeIndex(index_data_sh.index)
    index_data_sh = index_data_sh.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列
    # print(index_data_sh)

    # 设置marketcolors,up:设置K线线柱颜色,up意为收盘价大于等于开盘价,down:与up相反,这样设置与国内K线颜色标准相符
    # edge:K线线柱边缘颜色(i代表继承自up和down的颜色),wick:灯芯(上下影线)颜色,volume:成交量直方图的颜色,inherit:是否继承,选填
    sh_mc = mpf.make_marketcolors(up='red', down='green', edge='i', wick='i', volume='in', inherit=True)
    # 设置图形风格,gridaxis:设置网格线位置,gridstyle:设置网格线线型,y_on_right:设置y轴位置是否在右
    sh_s = mpf.make_mpf_style(gridaxis='both', gridstyle='-.', y_on_right=False, marketcolors=sh_mc)
    # 设置线宽
    mpl.rcParams['lines.linewidth'] = .5
    # 设置均线颜色,这里可以设置6条均线的颜色
    mpl.rcParams['axes.prop_cycle'] = cycler(color=['dodgerblue', 'deeppink', 'navy', 'teal', 'maroon', 'darkorange'])

    index_sh_fig, axlist = mpf.plot(index_data_sh, type='candle', mav=(5, 10, 20), volume=True,
                                    show_nontrading=False, returnfig=True, style=sh_s)

    canvas_index_sh = FigureCanvasTkAgg(index_sh_fig, master=stockindex_sh_frame)  # 设置tkinter绘制区
    canvas_index_sh.draw()
    toolbar_index_sh = NavigationToolbar2Tk(canvas_index_sh, stockindex_sh_frame)
    toolbar_index_sh.update()  # 显示图形导航工具条
    canvas_index_sh._tkcanvas.pack(fill=BOTH, expand=1)

    # 深圳指数
    index_data_sz = pro.index_daily(ts_code='399001.SZ', start_date=20100101)
    # 日数据处理
    # :取所有行数据,后面取date列,open列等数据
    index_data_sz = index_data_sz.loc[:, ['trade_date', 'open', 'close', 'high', 'low', 'vol']]
    index_data_sz = index_data_sz.rename(columns={'trade_date': 'Date', 'open': 'Open', 'close': 'Close',
                                                  'high': 'High', 'low': 'Low', 'vol': 'Volume'})  # 更换列名,为后面函数变量做准备
    index_data_sz.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
    # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
    index_data_sz.index = pd.DatetimeIndex(index_data_sh.index)
    index_data_sz = index_data_sz.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列
    # print(index_data_sz)

    index_sz_fig, axlist = mpf.plot(index_data_sz, type='candle', mav=(5, 10, 20), volume=True,
                                    show_nontrading=False, returnfig=True)
    canvas_index_sz = FigureCanvasTkAgg(index_sz_fig, master=stockindex_sz_frame)  # 设置tkinter绘制区
    canvas_index_sz.draw()
    toolbar_index_sz = NavigationToolbar2Tk(canvas_index_sz, stockindex_sz_frame)
    toolbar_index_sz.update()  # 显示图形导航工具条
    canvas_index_sz._tkcanvas.pack(fill=BOTH, expand=1)


def stock_query_function():
    # 必须添加以下控件销毁代码,不然点击一次按钮框架长生一次,显示的画面会多一次,你可以将下面的代码删除测试看下
    for widget_graphic_main_frame in graphic_main_frame.winfo_children():
        widget_graphic_main_frame.destroy()
    # 在主框架下创建股票代码输入子框架
    code_frame = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535')
    code_frame.pack()
    # 创建标签‘股票代码’
    stock_label = tk.Label(code_frame, text='股票代码', bd=1)
    stock_label.pack(side=LEFT)
    # 创建股票代码输入框
    input_code_var = tk.StringVar()
    code_widget = tk.Entry(code_frame, textvariable=input_code_var, borderwidth=1, justify=CENTER)
    # input_code_get = input_code_var.set(input_code_var.get())  # 获取输入的新值
    code_widget.pack(side=LEFT, padx=4)

    # 在主框架下创建股票日期输入框子框架
    input_date_frame = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535')
    input_date_frame.pack()
    # 创建标签‘开始日期’
    date_start_label = tk.Label(input_date_frame, text='开始日期', bd=1)
    date_start_label.pack(side=LEFT)
    # 创建开始日期代码输入框
    input_startdate_var = tk.StringVar()
    startdate_widget = tk.Entry(input_date_frame, textvariable=input_startdate_var, borderwidth=1, justify=CENTER)
    input_startdate_get = input_startdate_var.set(input_startdate_var.get())  # 获取输入的新值
    startdate_widget.pack(side=LEFT, padx=4)
    # 创建标签‘结束日期’
    date_end_label = tk.Label(input_date_frame, text='结束日期', bd=1)
    date_end_label.pack(side=LEFT)
    # 创建结束日期代码输入框
    input_enddate_var = tk.StringVar()
    enddate_widget = tk.Entry(input_date_frame, textvariable=input_enddate_var, borderwidth=1, justify=CENTER)
    input_enddate_get = input_enddate_var.set(input_enddate_var.get())  # 获取输入的新值
    enddate_widget.pack(side=LEFT, padx=4)

    # 创建Notebook标签选项卡
    tabControl = ttk.Notebook(graphic_main_frame)
    stock_graphics_daily = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535', relief=tk.RAISED)  # 增加新选项卡日K线图
    # stock_graphics_daily.pack(expand=1, fill=tk.BOTH, anchor=tk.CENTER)
    stock_graphics_daily_basic = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535', relief=tk.RAISED)  # 增加新选项卡基本面指标
    stock_graphics_week = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535', relief=tk.RAISED)
    stock_graphics_month = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535', relief=tk.RAISED)
    company_information = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535', relief=tk.RAISED)

    tabControl.add(stock_graphics_daily, text='日K线图')  # 把新选项卡日K线框架增加到Notebook
    tabControl.add(stock_graphics_daily_basic, text='基本面指标')
    tabControl.add(stock_graphics_week, text='周K线图')
    tabControl.add(stock_graphics_month, text='月K线图')
    tabControl.add(company_information, text='公司信息')
    tabControl.pack(expand=1, fill="both")  # 设置选项卡布局
    tabControl.select(stock_graphics_daily)  # 默认选定日K线图开始

    def go():   # 图形输出渲染
        # 以下函数作用是省略输入代码后缀.sz .sh
        def code_name_transform(get_stockcode):  # 输入的数字股票代码转换成字符串股票代码
            str_stockcode = str(get_stockcode)
            str_stockcode = str_stockcode.strip()  # 删除前后空格字符
            if 6 > len(str_stockcode) > 0:
                str_stockcode = str_stockcode.zfill(6) + '.SZ'  # zfill()函数返回指定长度的字符串,原字符串右对齐,前面填充0
            if len(str_stockcode) == 6:
                if str_stockcode[0:1] == '0':
                    str_stockcode = str_stockcode + '.SZ'
                if str_stockcode[0:1] == '3':
                    str_stockcode = str_stockcode + '.SZ'
                if str_stockcode[0:1] == '6':
                    str_stockcode = str_stockcode + '.SH'
            return str_stockcode

        # 清除stock_graphics_daily框架中的控件内容,winfo_children()返回的项是一个小部件列表,
        # 以下代码作用是为每次点击查询按钮时更新图表内容,如果没有以下代码句,则每次点击查询会再生成一个图表
        for widget_daily in stock_graphics_daily.winfo_children():
            widget_daily.destroy()
        for widget_daily_basic in stock_graphics_daily_basic.winfo_children():
            widget_daily_basic.destroy()
        for widget_week in stock_graphics_week.winfo_children():
            widget_week.destroy()
        for widget_month in stock_graphics_month.winfo_children():
            widget_month.destroy()
        for widget_company_information in company_information.winfo_children():
            widget_company_information.destroy()

        # 获取用户输入信息
        stock_name = input_code_var.get()
        code_name = code_name_transform(stock_name)
        start_date = input_startdate_var.get()
        end_date = input_enddate_var.get()

        # 获取股票数据
        stock_data = pro.daily(ts_code=code_name, start_date=start_date, end_date=end_date)
        stock_daily_basic = pro.daily_basic(ts_code=code_name, start_date=start_date, end_date=end_date,
                                            fields='close,trade_date,turnover_rate,volume_ratio,pe,pb')
        stock_week_data = pro.weekly(ts_code=code_name, start_date=start_date, end_date=end_date)
        stock_month_data = pro.monthly(ts_code=code_name, start_date=start_date, end_date=end_date)
        stock_name_change = pro.namechange(ts_code=code_name, fields='ts_code,name')
        stock_information = pro.stock_company(ts_code=code_name, fields='introduction,main_business,business_scope')

        # 日数据处理
        data = stock_data.loc[:, ['trade_date', 'open', 'close', 'high', 'low', 'vol']]  # :取所有行数据,后面取date列,open列等数据
        data = data.rename(columns={'trade_date': 'Date', 'open': 'Open', 'close': 'Close', 'high': 'High', 'low': 'Low',
                                    'vol': 'Volume'})  # 更换列名,为后面函数变量做准备
        data.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
        # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
        data.index = pd.DatetimeIndex(data.index)
        data = data.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列

        # 基本面指标数据处理
        stock_daily_basic.set_index('trade_date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
        # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
        stock_daily_basic.index = pd.DatetimeIndex(stock_daily_basic.index)
        stock_daily_basic = stock_daily_basic.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列
        print(stock_daily_basic)

        # 周数据处理
        week_data = stock_week_data.loc[:, ['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        week_data = week_data.rename(columns={'trade_date': 'Date', 'open': 'Open', 'close': 'Close', 'high': 'High',
                                              'low': 'Low', 'vol': 'Volume'})  # 更换列名,为后面函数变量做准备
        week_data.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
        # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
        week_data.index = pd.DatetimeIndex(week_data.index)
        week_data = week_data.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列

        # 月数据处理
        month_data = stock_month_data.loc[:, ['trade_date', 'open', 'close', 'high', 'low', 'vol']]
        month_data = month_data.rename(columns={'trade_date': 'Date', 'open': 'Open', 'close': 'Close', 'high': 'High',
                                                'low': 'Low', 'vol': 'Volume'})  # 更换列名,为后面函数变量做准备
        month_data.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
        # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
        month_data.index = pd.DatetimeIndex(month_data.index)
        month_data = month_data.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列

        # 公司信息处理
        stock_company_code = stock_name_change.at[0, 'ts_code']
        stock_company_name = stock_name_change.at[0, 'name']
        stock_introduction = stock_information.at[0, 'introduction']
        stock_main_business = stock_information.at[0, 'main_business']
        stock_business_scope = stock_information.at[0, 'business_scope']

        # K线图图形输出
        daily_fig, axlist = mpf.plot(data, type='candle', mav=(5, 10, 20), volume=True,
                                     show_nontrading=False, returnfig=True)
        # 基本面指标图形输出
        # 注意必须按照选项卡的排列顺序渲染图形输出,假如你把matplotlib的图形放到最后,则会出现图像错位现象,不信你可以把以下的代码放到month_fig后试下
        plt_stock_daily_basic = plt.figure(facecolor='white')
        plt.suptitle('Daily Basic Indicator', size=10)

        fig_close = plt.subplot2grid((3, 2), (0, 0), colspan=2)  # 创建网格子绘图,按行切分成3份,列切分成2分,位置(0,0),横向占用2列
        fig_close.set_title('Close Price')
        plt.xticks(stock_daily_basic.index, rotation=45)  # 设置x轴时间显示方向,放在这跟放在最后显示效果不一样
        fig_close.plot(stock_daily_basic.index, stock_daily_basic['close'])
        plt.xlabel('Trade Day')
        plt.ylabel('Close')
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))  # 设置X轴主刻度显示的格式
        plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=1))  # 设置X轴主刻度的间距

        fig_turnover_rate = plt.subplot2grid((3, 2), (1, 0))  # 创建网格子绘图,按行切分成3份,列切分成2分,位置(1,0)
        fig_turnover_rate.set_title('Turnover Rate')
        plt.xticks(stock_daily_basic.index, rotation=45)  # 设置x轴时间显示方向,放在这跟放在最后显示效果不一样
        fig_turnover_rate.bar(stock_daily_basic.index, stock_daily_basic['turnover_rate'], facecolor='red')
        plt.xlabel('Trade Day')
        plt.ylabel('Turnover Rate')
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))  # 设置X轴主刻度显示的格式
        plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=2))  # 设置X轴主刻度的间距

        fig_volume_ratio = plt.subplot2grid((3, 2), (2, 0))  # 创建网格子绘图,按行切分成3份,列切分成2分,位置(1,2)
        fig_volume_ratio.set_title('Volume Ratio')
        plt.xticks(stock_daily_basic.index, rotation=45)  # 设置x轴时间显示方向,放在这跟放在最后显示效果不一样
        fig_volume_ratio.bar(stock_daily_basic.index, stock_daily_basic['volume_ratio'])
        plt.xlabel('Trade Day')
        plt.ylabel('Volume Ratio')
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m'))  # 设置X轴主刻度显示的格式
        plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=2))  # 设置X轴主刻度的间距

        fig_pe = plt.subplot2grid((3, 2), (1, 1))  # 创建网格子绘图,按行切分成3份,列切分成2分,位置在第3行,第1列
        fig_pe.set_title('PE')
        plt.xticks(stock_daily_basic.index, rotation=45)  # 设置x轴时间显示方向,放在这跟放在最后显示效果不一样
        fig_pe.plot(stock_daily_basic.index, stock_daily_basic['pe'])
        plt.xlabel('Trade Day')
        plt.ylabel('PE')
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m'))  # 设置X轴主刻度显示的格式
        plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=2))  # 设置X轴主刻度的间距

        fig_pb = plt.subplot2grid((3, 2), (2, 1))  # 创建网格子绘图,按行切分成3份,列切分成2分,位置在第3行,第2列
        fig_pb.set_title('PB')
        plt.xticks(stock_daily_basic.index, rotation=45)  # 设置x轴时间显示方向,放在这跟放在最后显示效果不一样
        fig_pb.plot(stock_daily_basic.index, stock_daily_basic['pb'])
        plt.xlabel('Trade Day')
        plt.ylabel('PB')
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m'))  # 设置X轴主刻度显示的格式
        plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=2))  # 设置X轴主刻度的间距
        plt_stock_daily_basic.tight_layout(h_pad=-2, w_pad=0)  # 解决子图图形重叠问题

        # 周K线图形输出
        week_fig, axlist = mpf.plot(week_data, type='candle', mav=(5, 10, 20), volume=True,
                                    show_nontrading=False, returnfig=True)
        # 月k线图形输出
        month_fig, axlist = mpf.plot(month_data, type='candle', mav=(5, 10, 20), volume=True,
                                     show_nontrading=False, returnfig=True)

        # 将获得的图形渲染到画布上
        # 日K线图形渲染到tkinter画布上
        canvas_daily = FigureCanvasTkAgg(daily_fig, master=stock_graphics_daily)  # 设置tkinter绘制区
        canvas_daily.draw()
        toolbar_daily = NavigationToolbar2Tk(canvas_daily, stock_graphics_daily)
        toolbar_daily.update()  # 显示图形导航工具条
        canvas_daily._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)
        # 基本面指标图形渲染到tkinter画布上
        canvas_stock_daily_basic = FigureCanvasTkAgg(plt_stock_daily_basic, master=stock_graphics_daily_basic)
        canvas_stock_daily_basic.draw()
        toolbar_stock_daily_basic = NavigationToolbar2Tk(canvas_stock_daily_basic, stock_graphics_daily_basic)
        toolbar_stock_daily_basic.update()  # 显示图形导航工具条
        canvas_stock_daily_basic._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)
        plt.close()
        # 周K线图形渲染到tkinter画布上
        canvas_week = FigureCanvasTkAgg(week_fig, master=stock_graphics_week)  # 设置tkinter绘制区
        canvas_week.draw()
        toolbar_week = NavigationToolbar2Tk(canvas_week, stock_graphics_week)
        toolbar_week.update()  # 显示图形导航工具条
        canvas_week._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)
        # 月K线图形渲染到tkinter画布上
        canvas_month = FigureCanvasTkAgg(month_fig, master=stock_graphics_month)  # 设置tkinter绘制区
        canvas_month.draw()
        toolbar_month = NavigationToolbar2Tk(canvas_month, stock_graphics_month)
        toolbar_month.update()  # 显示图形导航工具条
        canvas_month._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)

        # 在company_information框架下设置文字选项卡功能内容
        company_text = tk.Text(company_information, bg='white', undo=True, wrap=tix.CHAR)
        # 在文本框第一行添加股票代码,文字红色,居中显示
        company_text.insert(tk.INSERT, stock_company_code)
        company_text.tag_add('tag1', '1.0', '1.9')  # 设置选定的内容,
        company_text.tag_config('tag1', foreground='red', justify=CENTER)
        company_text.insert(tk.INSERT, '\n')

        company_text.insert(tk.INSERT, stock_company_name)
        company_text.tag_add('tag2', '2.0', '2.9')
        company_text.tag_config('tag2', foreground='red', justify=CENTER)
        company_text.insert(tk.INSERT, '\n')

        company_text.insert(tk.INSERT, '    ')
        company_text.insert(tk.INSERT, '公司简介:')
        company_text.tag_add('tag3', '3.3', '3.9')
        company_text.tag_config('tag3', foreground='red', font=tf.Font(family='SimHei', size=12))
        company_text.insert(tk.INSERT, stock_introduction)
        company_text.tag_add('tag4', '3.9', 'end')
        company_text.tag_config('tag4', foreground='black', spacing1=20, spacing2=10,
                                font=tf.Font(family='SimHei', size=12))
        company_text.insert(tk.INSERT, '\n')

        company_text.insert(tk.INSERT, '    ')
        company_text.insert(tk.INSERT, '主要业务及产品:')
        company_text.tag_add('tag5', '4.4', '4.12')
        company_text.tag_config('tag5', foreground='blue')
        company_text.insert(tk.INSERT, stock_main_business)
        company_text.tag_add('tag6', '4.12', 'end')
        company_text.tag_config('tag6', spacing1=20, spacing2=10,
                                font=tf.Font(family='SimHei', size=12))
        company_text.insert(tk.INSERT, '\n')

        company_text.insert(tk.INSERT, '    ')
        company_text.insert(tk.INSERT, '经营范围:')
        company_text.tag_add('tag7', '5.4', '5.9')
        company_text.tag_config('tag7', foreground='#cc6600')
        company_text.insert(tk.INSERT, stock_business_scope)
        company_text.tag_add('tag8', '5.9', 'end')
        company_text.tag_config('tag8', spacing1=20, spacing2=10,
                                font=tf.Font(family='SimHei', size=12))
        company_text.insert(tk.INSERT, '\n')

        company_text.pack(fill=BOTH, expand=1)

    # 在主框架下创建查询按钮子框架
    search_frame = tk.Frame(graphic_main_frame, borderwidth=1, bg='#353535', relief=tix.SUNKEN)
    search_frame.pack(before=tabControl)  # 必须加上before,否则控件则会出现在底部,除非tabControl设置了bottom布局属性
    # 创建查询按钮并设置功能
    stock_find = tk.Button(search_frame, text='查询', width=5, height=1, command=go)
    stock_find.pack()


stockIndex_label_button = tk.Button(main_frame, text='全景指数', command=stockindex_function)
stockIndex_label_button.pack(fill=X)
query_label_button = tk.Button(main_frame, text='查询', command=stock_query_function)
query_label_button.pack(fill=X)

root.mainloop()

 

tushare注册链接:LINK

 

Python量化交易入门 Python量化交易知识归纳 阅读详情

相关推荐

文心一言深度实测:中文语境理解与本地化AI工作流实战指南

大语言模型(LLM)作为当前人工智能落地的核心载体,其能力边界不仅取决于参数规模,更关键在于对特定语言、文化与业务场景的深度适配。中文大模型需突破语义歧义、地域表达、政策时效与价值观对齐等独特挑战,其技术价值体现在‘本地真相’而非‘通用真理’的交付能力上。文心一言依托百度十年中文语义基础设施,在地域化服务查询、政策解读、文化符号关联等长尾任务中展现出显著优势;同时通过Prompt语义压缩、向量上下文重建、多模态轻量协同等工程设计,支撑教育、政务、中小企等高合规、强落地需求场景。本文基于36小时真实内测数据,

chuanao8829的博客 437

Python实战量化交易理财系统

## 讲师介绍: 近 5 年个人投资理财年化收益平均超 25%。如果你也想提升自己的睡后收入,轻松赚钱,那么这门课就是为你量身打造。课程基于一个完整真实的量化交易业务来讲授,并融入老师的理财经验以及使用编程技术辅助投资的技巧,让你面对各种复杂投资情况也能做到游刃有余。 ## 学习目标: 从不懂“理财”开始到实现自动交易,成为一个“技术流”理财高手 编程技术 + 核心量化策略 + 交易系统开发 + 讲师经验分享,学会用技术辅助理财 本课程从最基础的什么是量化开始讲起,即使对投资理财不了解同样可以学习,轻松入门无压力。 从如何获取数据开始,到实现实盘交易,课程对量化交易的每一步都进行细致讲解,为你铺开量化交易的每一个细节。 不仅仅只是教你学会使用某种工具,更会教给你量化交易的投资思想,让你面对各种情况都游刃有余。 ## 课程亮点: 设计适合自己并能适应市场的交易策略,才是量化交易的灵魂 课程亲手带你设计并实现两种交易策略,快速培养你的策略思维能力 1. 择时策略:通过这个策略学会如何利用均线,创建择时策略,优化股票买入卖出的时间点。2. 选股策略:掌握选股策略的核心逻辑,并基于收益率创建动量选股策略,并验证其有效性。 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 第三方平台大而全,不易扩展,效率还差,信息安全也是大问题,打造自己的交易平台才是更优解

分享如何完整搭建一个股票量化系统?

if self.algo(context) is True: #如果algo返回True,直接不运行,本次不调仓。本文从零开始,手动搭建一个基于规则的简单量化交易系统,旨在提高对整个过程的理解能力。分析该策略的表现,并与沪深300指数进行对比。账户初始值100000,每只股票占相同比重。根据数据的买入信号买入,卖出信号卖出。根据上述数据和策略进行回测。

1841085904的博客 2004

从零编写60%+胜率的短线择时信号!零基础python量化投资代码详解【邢不行】

​ ​ 如果有人说你是百年难得一见的量化投资天才,要送你一本秘籍,你信还是不信? ​ 你是否有量化投资天赋我不知道,也没有秘籍。但本文可以测试你是否有量化编程的天赋。 我会用一个实际案例逐行讲解量化代码,编程零基础也能完全理解。 如果你看完后觉得很容易,甚至有一点热血沸腾想学编程,至少说明你对这方面是感兴趣的,并且可能还有一些天赋。 01 编程问题描述 1、某神秘事件 很多人会费心寻找股市上涨的征兆,并以此作为自己的买入依据。 这里就有一个神秘征兆,只要这些征兆发生,大盘未...

xingbuxing_py的博客 1万+

python量化交易策略实例_实践《Python与量化投资从基础到实战》PDF代码+《量化交易之路用Python做股票量化分析》PDF代码解释...

利用python分析量化投资问题是现在研究的热点,学习python基础,数学工具,策略开发。学习实例,多为实际需求。利用故事、数学模型和代码,学习量化与编程的关系,描绘量化的人生哲学,学习作者在量化方面的经验,体会作者对交易、人生的理解。Python凭借其简单、易读、可扩展性以及拥有巨大而活跃的科学计算社区,在需要分析、处理大量数据的金融行业得到了广泛而迅速的应用,并且成为该行业开发核心应用的首选...

weixin_40008969的博客 3632

股票量化API接口的实例代码分享

因为现在可以提供交易实时的接口比较少了,可以自己建立的量化api接口,那我们的思想是通过驱动电脑完成我们的交易了,虽然这样有点慢,但是速度也很快了,我们程序在后台实时进行数据的处理分析,传递给交易策略,符合交易策略的就马上进行交易。首先,量化api接口并不是任何人都可以写出来的,它需要编程人有一定的金融分析能力,数据分析能力等,当然啦,会编程这个就肯定的了,所以,如果你毫无经验,想直接套用代码也是有难度的。pyttsx3.speak('验证码结果{}'.format(result))#输入验证码,先定位。

Q_2037696191的博客 1466

量化投资01----股票_贵州茅台600519_双均线策略回测

量化投资,股票,贵州茅台,600519,双均线策略回测,十年,10万初始本金,是否盈利呢?

涂睿的专栏 1382

Python股票量化投资课程——00股票量化配套课件.rar

Python股票量化投资课程——

经典的股票/期货量化交易策略,拿来即用的Python策略源码

声明:本文策略源码均来自掘金量化示例策略库,仅供参考! 一、股票策略 1.多因子选股 # coding=utf-8 from __future__ import print_function, absolute_import, unicode_literals import numpy as np from gm.api import * from pandas import ...

小壁虎的春天 9699

Python金融分析与量化交易实战视频教程.rar

Python金融分析与量化交易实战视频教程,完整版20章,172节,附源码+数据;Python金融分析与量化交易实战课程旨在帮助同学们快速掌握Python数据分心核心技能与交易交易系统策略部署与回测分析。 全部课程内容皆以实战为主,通俗讲解数据分析常用方法与经典解决方案。 主要包括三大核心模块:1.Python数据科学必备工具包实战;2.金融数据分析处理与分析实例;3.量化交易平台策略分析实战。整体风格通俗易懂,零基础即可入门,适合准备转行就业与进阶提升的同学们

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

whale-quant【01_投资与量化投资】(学习与笔记)

而是基于很多量化投资基金的策略很像,当许多基金都采用相似的策略,一旦出现比如大的对冲基金需要清仓,卖掉过去盈利的股票,那其他基金就可能输钱甚至被迫平仓,这就会导致有流通性风险的问题。实物投资和金融投资:根据投资的对象,投资可以分为实物投资和金融投资。在资本主义发展初期,资本所有者与资本运用者是结合在一起的,经济主体一般都直接拥有生产资料和资本,亲自从事生产消费,投资大多采取直接投资的方式,也就是直接投入资本,建造厂房,购置设备,购入原材料,从事生产、流通活动,因此,早期的投资概念主要是指实物投资。

QAQterrible的博客 1260

国民技术N32G45X SysTick定时器实战:从1us到100ms的精准延迟实现(附完整代码)

本文详细解析了国民技术N32G45X芯片中SysTick定时器的工作原理,并提供了从1微秒到100毫秒的高精度延迟实现方案。通过对比官方库函数的局限性,文章重点介绍了无中断查询模式、时钟源选择策略以及完整的代码实现,帮助嵌入式开发者精准控制时序,适用于LED控制、软件模拟通信协议等多种实战场景。

weixin_29190573的博客 374

python股票量化交易入门到实践_Python股票量化交易从入门到实践

第 1章 理解Python股票量化交易  11.1 多角度分析量化交易 11.1.1 量化交易的本质 21.1.2 量化交易的发展 41.1.3 量化交易的优势 71.1.4 量化交易的过程 81.2 多角度分析股票价格 91.2.1 从股票的起源看本质 91.2.2 如何衡量股票溢价 111.2.3 股票收益的组成 121.2.4 股价波动的原因 131.3 为什么选择Python语言 141....

weixin_33990147的博客 4463

UVM验证中,为什么我的pack_bytes()返回长度是0?手把手教你排查自定义do_pack函数

本文深入解析UVM验证中pack_bytes()返回长度为0的常见原因及系统排查方法。从UVM打包机制原理出发,详细列举了super.do_pack()缺失、field automation冲突等典型问题,并提供动态数组处理、位宽计算等进阶调试技巧,帮助开发者快速定位和解决自定义do_pack函数问题。

weixin_42523693的博客 127

用宝塔面板+CentOS 7.6,30分钟搞定DNF手游私服搭建(附全套资源下载)

本文详细介绍了如何使用宝塔面板和CentOS 7.6在30分钟内快速搭建DNF手游私服。通过图形化界面操作,无需复杂命令,即可完成服务端部署、MySQL数据库配置及客户端适配,适合Linux新手快速上手。

weixin_33737774的博客 601

《Python股票量化交易从入门到实践》随书赠送“回测框架”的使用帮助

赠送“回测框架”的目的 为了帮助读者再建立一座从书本知识到实战应用之间的“桥梁”,赠送一个回测小工具。 由书中知识点组合而成,实现了包括选股、行情、回测三个功能。额外使用wxPython封装一层GUI便于操作。 提供给大家一种“量化交易”为我所用的思路。大家可以以此为基础去搭建适合自己的系统! 回测框架效果展示 回测框架的功能,其实是我自己设定了一个炒股的场景。 我们根据上市公司的一些财务指标,去过滤出我们心仪的股票加入我们的股票池,然后查看股票的行情走势,选出走势较好的几只股,再制定一个择时策略,对这

hangzhouyx的博客 1万+

VMware虚拟机安装MS-DOS 7.10教程

dos安装教程dos版本7.10附下载链接。

Minecraft_xiaole的博客 1万+

python股票量化交易从入门到实践df_Python股票量化交易从入门到实践/金融科技系列...

目录第1章 理解Python股票量化交易1.1 多角度分析量化交易1.1.1 量化交易的本质1.1.2 量化交易的发展1.1.3 量化交易的优势1.1.4 量化交易的过程1.2 多角度分析股票价格1.2.1 从股票的起源看本质1.2.2 如何衡量股票溢价1.2.3 股票收益的组成1.2.4 股价波动的原因1.3 为什么选择Python语言1.3.1 概述编程语言的发展1....

weixin_39568653的博客 3489

主成分分析避坑指南:为什么你的PCA结果总是不理想?

本文深入剖析了主成分分析(PCA)在实际应用中效果不佳的常见原因与解决方案。针对数据标准化、协方差矩阵选择、主成分数量确定、载荷矩阵解读等关键环节,提供了详细的避坑指南和诊断方法,并探讨了PCA的局限性及非线性数据结构下的备选方案,帮助数据分析师获得更稳健、可解释的降维结果。

convnet3designer的博客 511

使用Termux在Android设备上编译运行SpecCPU2006

SPEC2006搭配Termux,竟然还能这么玩?!

菜菜的菜园子 2960

知识星球《玩转股票量化交易》之 爬虫爬取股票数据

量化交易是一个多技术综合的项目,学习完书籍《Python股票量化交易从入门到实践》我们再次升级学习的内容——知识星球《玩转股票量化交易》 在星球中我们会深入分享包括Python、爬虫、数据分析、可视化、人工智能、股票策略等各种与股票量化交易相关的内容! 目的只有一个:搭建属于自己量化交易系统! 本星球涵盖了爬虫方式爬取股票数据的实现 【1-12 爬虫取东方财富网上市公司公告数据的框架-附代码】 #爬虫 【1-13 爬虫取东方财富网股票每日实时行情数据的框架-附代码】#爬虫# 【1-14 爬虫取天天

hangzhouyx的博客 3255

Wi-Fi QoS中AIFSN/CWmin/CWmax/TxOP参数是怎样计算的?

802.11e/WMM的EDCA机制通过AIFS、CWmin/CWmax和TxOP三组参数实现业务优先级控制。AIFS决定最短等待时间(AIFS=SIFS+AIFSN×SlotTime),CWmin/CWmax定义退避范围(2^ECW-1),TxOP设置最大占用时长(32µs单位)。默认配置中,语音业务(VO)优先级最高,其AIFSN最小(2)、CW范围最小(3-7)、TxOP适中(1.504ms);视频(VI)次之;普通数据(BE)和后台(BK)优先级最低。调优需根据网络特性调整参数:VoIP可降低AIF

1042484520@qq.com(邮箱) 1746

Python实现股票量化交易学习进阶(一)之基础库(知识准备)搭建

股票量化交易学习第一篇之基础库搭建1、写在前面1.1、Numpy库的安装1.2、Pandas库的安装1.3、金融数据获取1.4、talib金融库的安装及文档链接1.5、Matplotlib 库安装及文档链接2、股票技术指标分析2.1、均线分析 1、写在前面 从本文开始准备写写关于股票量化交易的连载博客,重点记录自己对于量化交易平台实现的学习路径,针对一些重点第三方库以及重点知识做个备忘录。 我要实现的量化交易框架只是一个针对金融数据获取、清洗、整合及一些量化策略的实现、回测等功能,并不会实现股票真实的程序化

u011930054的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

我用wxPython搭建GUI量化系统之多只股票走势对比界面

股票分析过程中往往会查看一只股票的多个周期的走势,也会同时查看一个板块中多只股票的走势,量化分析的时候也会同时查看单只股票多个回测指标可视化结果…… 所以在我们搭建的量化交易系统中,除了实现多子图之间的嵌套之外,在界面中实现多个面板之间的嵌套也是非常有必要的。 本文我们通过wxPython布局管理实现多只股票走势对比界面。 原理上很简单,我用了wx.FlexGridSizer的网格布局功能,把不同的Panel嵌入其中,如下所示: # 创建FlexGridSizer布局网格 vgap定义垂直方向上行间距/hg

hangzhouyx的博客 1490

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 爬虫验证码的几种处理方式,已封装成类,文章末尾有源码!
下一篇: 如何用 Python 快速揭示数据之间的各种关系!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值