--以600464国电南瑞为例
1、获取数据源,写入mysql
1.1获取数据
通过Tushare的官网注册信息,获取积分,访问https://tushare.pro/document/1?doc_id=63

mysql数据库和表格创建脚本为:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -- 创建数据库(若已存在可跳过此步) CREATE DATABASE IF NOT EXISTS stock CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 使用该数据库 USE stock; -- 创建股票交易数据表 CREATE TABLE IF NOT EXISTS stock_all ( state_dt VARCHAR(45) NOT NULL COMMENT '交易日(格式:yyyy-mm-dd)', stock_code VARCHAR(45) NOT NULL COMMENT '股票代码', open_Price DECIMAL(20, 2) COMMENT '开盘价', close_Price DECIMAL(20, 2) COMMENT '收盘价', high DECIMAL(20, 2) COMMENT '最高价', low DECIMAL(20, 2) COMMENT '最低价', vol INT(20) COMMENT '成交量', amount DECIMAL(30, 2) COMMENT '成交额', pre_close_price DECIMAL(20, 2) COMMENT '前日收盘价', amt_change DECIMAL(20, 2) COMMENT '涨跌额', pct_change DECIMAL(20, 2) COMMENT '涨跌幅', -- 主键(state_dt + stock_code 组合) PRIMARY KEY (state_dt), -- 单独为stock_code创建索引(可选,根据查询需求) INDEX idx_stock_code (stock_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='股票交易数据记录表'; |
1.2写入MYSQL
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| import datetime import tushare as ts import pymysql if name == 'main': # 设置tushare pro的token并获取连接 ts.set_token('自己的token xxxxxxxxxxxxx') pro = ts.pro_api() # 设定获取日线行情的初始日期和终止日期,其中终止日期设定为昨天。 start_dt = '20160101' time_temp = datetime.datetime.now() - datetime.timedelta(days=1) end_dt = time_temp.strftime('%Y%m%d') # 建立数据库连接,剔除已入库的部分 db = pymysql.connect(host='127.0.0.1', user='root', passwd='xxxxxx', db='stock', charset='utf8') cursor = db.cursor() # 设定需要获取数据的股票池 # 同级别目录下存在 stock.txt文件,按行存放数据,如下: #600406.SH #300672.SZ try: with open('stock.txt', 'r', encoding='utf-8') as f: stock_pool = [line.strip() for line in f.readlines() if line.strip()] except FileNotFoundError: print("stock.txt文件未找到,使用默认股票池") except Exception as e: print(f"读取stock.txt文件时出错: {e}") total = len(stock_pool) #清空表中所有数据 sql_delete = "TRUNCATE TABLE stock_all" cursor.execute(sql_delete) db.commit() # 循环获取单个股票的日线行情 for i in range(len(stock_pool)): try: df = pro.daily(ts_code=stock_pool[i], start_date=start_dt, end_date=end_dt) # 打印进度 print('Seq: ' + str(i+1) + ' of ' + str(total) + ' Code: ' + str(stock_pool[i])) c_len = df.shape[0] except Exception as aa: print(aa) print('No DATA Code: ' + str(i)) continue for j in range(c_len): resu0 = list(df.iloc[c_len-1-j]) resu = [] for k in range(len(resu0)): if str(resu0[k]) == 'nan': resu.append(-1) else: resu.append(resu0[k]) state_dt = (datetime.datetime.strptime(resu[1], "%Y%m%d")).strftime('%Y-%m-%d') try: sql_insert = "INSERT INTO stock_all(state_dt,stock_code,open_price,close_price,high,low,vol,amount,pre_close_price,amt_change,pct_change) VALUES ('%s', '%s', '%.2f', '%.2f','%.2f','%.2f','%i','%.2f','%.2f','%.2f','%.2f')" % (state_dt,str(resu[0]),float(resu[2]),float(resu[5]),float(resu[3]),float(resu[4]),float(resu[9]),float(resu[10]),float(resu[6]),float(resu[7]),float(resu[8])) print(sql_insert) cursor.execute(sql_insert) db.commit() except Exception as err: continue cursor.close() db.close() print('All Finished!') |
1.3查看获取数据

2通过excel自带的分析工具来分析
2.1 分析开盘价格和收盘价格
excel 中的【数据】选项卡,【分析】组的【数据分析】按钮,弹出按钮选择数据描述,然后确定。这里分析自从2016年1月1日到2025年12月18的开盘价数据。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| |------------|-------------| | open_Price || | | | | 平均 | 22.67282262 | | 标准误差 | 0.125870273 | | 中位数 | 22.23 | | 众数 | 22.1 | | 标准差 | 6.058794046 | | 方差 | 36.70898529 | | 峰度 | 1.859659568 | | 偏度 | 1.046840203 | | 区域 | 42.62 | | 最小值 | 12.43 | | 最大值 | 55.05 | | 求和 | 52532.93 | | 观测数 | 2317 | | 最大(5) | 51.07 | | 最小(5) | 12.73 | | 置信度(95.0%) | 0.246830196 | | |------------|-------------| | close_Price || | | | | 平均 | 22.66776003 | | 标准误差 | 0.125644845 | | 中位数 | 22.24 | | 众数 | 16.85 | | 标准差 | 6.047943051 | | 方差 | 36.57761514 | | 峰度 | 1.806254545 | | 偏度 | 1.040110972 | | 区域 | 40.29 | | 最小值 | 12.42 | | 最大值 | 52.71 | | 求和 | 52521.2 | | 观测数 | 2317 | | 最大(5) | 51.15 | | 最小(5) | 12.73 | | 置信度(95.0%) | 0.246388136 | |
以下是对股票开盘价(open_Price)统计参数的逐行解析,包含核心含义+公式+业务解读(公式中统一用Xi代表单条开盘价数据,n=2317 为观测总数):
- 平均(均值):22.67282262
含义所有开盘价数据的算术平均值,反映开盘价的整体中枢水平。
公式

业务解读
这批股票的开盘价平均约22.67元,是判断价格"偏高/偏低"的基础基准。
- 标准误差(标准误):0.125870273
含义
样本均值的标准差,反映均值的抽样波动程度(即如果多次抽样,均值会在多大范围内波动),越小说明均值越可靠。
公式

(S 为样本标准差)
业务解读
本次计算的平均开盘价,抽样波动仅约0.13元,均值的代表性较强。
- 中位数:22.23
含义
将所有开盘价从小到大排序后,处于中间位置的数值(n为奇数时,是第(n+1)/2 位;n为偶数时,是中间两位的均值)。
公式
(2317为奇数,取第1159位数据)
业务解读
有50%的股票开盘价≤22.23元,50%≥22.23元;对比均值(22.67)略低,说明数据存在"右偏"(高价拉高均值)。
- 众数:22.1
含义
开盘价数据中出现次数最多的数值,反映最常见的开盘价水平。
公式
无固定公式,统计各数值出现频次,频次最高的即为众数。
业务解读
开盘价为22.1元的样本数量最多,是价格分布的"峰值点"。
- 标准差:6.058794046
含义
衡量开盘价数据相对于均值的离散程度(波动幅度),越大说明价格差异越大。
公式(样本标准差,除以n-1)

业务解读
开盘价围绕均值22.67元的平均波动幅度约6.06元,波动范围较宽。
- 方差:36.70898529
含义
标准差的平方,同样反映数据离散程度(但单位是"元²",不如标准差直观)。
公式

业务解读
仅用于统计计算(如方差分析),业务上优先看标准差。
- 峰度:1.859659568
含义
衡量数据分布的"陡峭程度",对比正态分布(峰度=0):
峰度>0:分布比正态分布更陡峭(尖峰),数据集中在均值附近;
峰度<0:分布更平缓(平峰),数据分散。
公式(样本峰度)

业务解读
开盘价分布为"尖峰"形态,多数数据集中在均值22.67元附近,少数极端值拉高/拉低价格。
- 偏度:1.046840203
含义
衡量数据分布的"不对称程度",对比正态分布(偏度=0):
偏度>0:右偏(正偏),均值右侧(高价端)有长尾,少数高价拉高均值;
偏度<0:左偏(负偏),均值左侧(低价端)有长尾。
公式(样本偏度)

业务解读
开盘价呈明显右偏,少数股票(如开盘价55.05元)的高价拉高了均值,中位数(22.23)更能反映多数股票的真实开盘水平。
- 区域(极差):42.62
含义
数据的最大值与最小值之差,反映价格的整体波动范围。
公式

业务解读
开盘价的波动区间达42.62元,价格跨度极大。
- 最小值:12.43
含义
所有开盘价中最低的数值,反映价格下限。
公式

- 最大值:55.05
含义
所有开盘价中最高的数值,反映价格上限。
公式

- 求和:52532.93
含义
所有开盘价数据的总和,是计算均值的基础。
公式

- 观测数:2317
含义
参与统计的开盘价样本数量,即数据总行数。
公式

- 最大(5):51.07
含义
将开盘价降序排列后,第5大的数值(即前5高价中最低的那个),反映高价区间的次高水平。
公式

业务解读
除了最高的55.05元,前5高价的门槛约为51.07元,高价股的开盘价集中在51-55元区间。
- 最小(5):12.73
含义
将开盘价升序排列后,第5小的数值(即前5低价中最高的那个),反映低价区间的次低水平。
公式

业务解读
除了最低的12.43元,前5低价的门槛约为12.73元,低价股的开盘价集中在12-13元区间。
- 置信度(95.0%):0.246830196
含义
在95%的置信水平下,总体均值的误差范围,即真实的总体平均开盘价落在

区间内(22.426~22.9196元)。
公式(t分布,大样本可近似正态分布)

业务解读
有95%的把握认为,这批股票的真实平均开盘价在22.43~22.92元之间,误差仅约0.25元,均值的可信度高。
总结
这批开盘价数据的核心特征:
中枢水平:均值22.67元,中位数22.23元(右偏,少数高价拉高均值);
波动程度:标准差6.06元,极差42.62元(价格跨度大);
分布形态:尖峰右偏(峰度1.86,偏度1.05);
统计可靠性:均值的95%置信误差仅0.25元,统计结果可信。
2.2 直方图分析
以10到55的价格区间进行分析,每隔5元来分析统计一下
|----|-----|---------|----|-----|---------|---|
| 价格 | 频率 | 累积 % | 价格 | 频率 | 累积 % | |
| 10 | 0 | 0.00% | 25 | 854 | 36.86% | |
| 15 | 147 | 6.34% | 20 | 669 | 65.73% | |
| 20 | 669 | 35.22% | 30 | 385 | 82.35% | |
| 25 | 854 | 72.08% | 35 | 167 | 89.56% | |
| 30 | 385 | 88.69% | 15 | 147 | 95.90% | |
| 35 | 167 | 95.90% | 40 | 57 | 98.36% | |
| 40 | 57 | 98.36% | 45 | 32 | 99.74% | |
| 45 | 32 | 99.74% | 55 | 4 | 99.91% | |
| 50 | 1 | 99.78% | 50 | 1 | 99.96% | |
| 55 | 4 | 99.96% | 其他 | 1 | 100.00% | |
| 其他 | 1 | 100.00% | 10 | 0 | 100.00% | |

总结:
总体价格区间在25以上的占比为 64.78% 大概2/3的时间价格是超过25元的。
2.3回归分析
|-------------------|-------------|
| 回归统计 ||
| Multiple R | 0.995997723 |
| R Square | 0.992011465 |
| Adjusted R Square | 0.992008014 |
| 标准误差 | 0.541643519 |
| 观测值 | 2317 |
|-------------|--------------|----------|-----------|-----------|--------------|-------------|------------|------------|
| | Coefficients | 标准误差 | t Stat | P-value | Lower 95% | Upper 95% | 下限 95.0% | 上限 95.0% |
| Intercept | 0.055278347 | 0.043659 | 1.2661452 | 0.2055885 | -0.030336037 | 0.14089273 | -0.030336 | 0.14089273 |
| close_Price | 0.997784705 | 0.001861 | 536.16722 | 0 | 0.994135387 | 1.001434024 | 0.99413539 | 1.00143402 |
总结:
总体开盘价格和收盘价格密切相关,偏差极小。
3、通过LSTM来大胆预测
3.1 配置LSTM环境
Python ==3.8
Tensorflow==2.9.0
Numpy==1.22.0
3.2 使用 堆叠LSTM模型来分析
模型参数为:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm (LSTM) (None, 7, 118) 56640 lstm_1 (LSTM) (None, 118) 111864 dense (Dense) (None, 50) 5950 dense_1 (Dense) (None, 1) 51 ================================================================= Total params: 174505 (681.66 KB) Trainable params: 174505 (681.66 KB) Non-trainable params: 0 (0.00 Byte) |
3.3 数据分割
从2016-01-04到2025-12-18共有2313个交易日,按照输入7个数据输出1个来分割,组合分成2305个输入,predictMonth 设置为5,划分训练数据和测试数据
X_train=XPredict[:-1 * predictMonth - 12]
y_train=yPredict[:-1 * predictMonth - 12]
X_test=XPredict[-1 * predictMonth - 12:-1 * predictMonth]
y_test=yPredict[-1 * predictMonth - 12:-1 * predictMonth]
3.4运行后对最后5天的预测和实际值

总体趋势没有问题,但是和实际值还是有较大偏差。