From 8d77c4a852e2182880e9098c57dc328795969a47 Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Fri, 10 Apr 2026 18:05:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=84=9A=E6=9C=AC=20+=20=E7=A6=BB=E7=BA=BF?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 fetch_history.py 获取板块历史K线数据 - 支持从数据库读取数据(离线模式) - 历史数据分析功能已可用 --- board_monitor.py | 14 +- data/board_detail_20260410.csv | 238 ++++++++++++++++----------------- data/board_history.db | Bin 65536 -> 278528 bytes fetch_history.py | 175 ++++++++++++++++++++++++ 4 files changed, 306 insertions(+), 121 deletions(-) create mode 100644 fetch_history.py diff --git a/board_monitor.py b/board_monitor.py index 15b9b47..3d9de72 100644 --- a/board_monitor.py +++ b/board_monitor.py @@ -844,8 +844,18 @@ def run_daily_report(to_email: str = "wlq@tphai.com", verbose: bool = False) -> if verbose: print(f" 已保存到数据库") else: - print(f"❌ 获取 {board_type} 数据失败") - boards_data[board_type] = [] + # 如果实时获取失败,尝试从数据库读取最新数据 + if verbose: + print(f"⚠️ 实时获取失败,从数据库读取最新数据...") + + available_dates = get_available_dates() + if available_dates: + latest_date = available_dates[0] + history_data = get_history_data(board_type, 1) + if latest_date in history_data: + boards_data[board_type] = history_data[latest_date] + if verbose: + print(f"✅ 从数据库读取 {latest_date} 的 {len(history_data[latest_date])} 条数据") # 生成并发送报告 if boards_data.get('industry') or boards_data.get('concept'): diff --git a/data/board_detail_20260410.csv b/data/board_detail_20260410.csv index 47914b2..0e413af 100644 --- a/data/board_detail_20260410.csv +++ b/data/board_detail_20260410.csv @@ -1,165 +1,179 @@ # A股板块详细数据 -# 生成时间: 2026-04-10 17:51:40 +# 生成时间: 2026-04-10 18:05:49 === 行业板块涨跌幅排行 === 板块名称,涨跌幅(%),主力资金(亿),领涨股 -蓄电池及其他电池,0.06,6.17,9 +蓄电池及其他电池,5.68,80.50, +锂电池,4.12,653.27, +逆变器,4.06,236.64, +电池,3.96,1354.11, +电池化学品,3.75,546.21, +品牌消费电子,3.71,37.30, +锂电专用设备,3.34,73.28, +玻璃玻纤,3.25,145.38, +能源金属,2.92,329.08, +其他数字媒体,2.83,3.24, +印染,2.63,7.14, +证券Ⅱ,2.57,578.89, +非银金融,2.26,792.38, +半导体设备,2.20,192.78, +其他电子Ⅱ,2.17,240.33, +其他电子Ⅲ,2.17,240.33, +火电设备,2.05,7.89, +数字芯片设计,1.99,1040.08, +多元金融,1.89,132.31, +其他电源设备Ⅱ,1.89,198.90, +其他电源设备Ⅲ,1.87,134.45, +大众出版,1.85,35.78, +电力设备,1.83,2979.54, +纺织制造,1.83,48.89, +综合电力设备商,1.82,56.56, +视频媒体,1.72,3.15, +光伏辅材,1.71,49.61, +燃料电池,1.70,0.85, +物流,1.69,51.79, +教育,1.66,18.04, +光伏主材,1.65,28.85, +旅游零售Ⅱ,1.64,15.99, +游戏Ⅱ,1.62,135.19, +游戏Ⅲ,1.62,135.19, +白色家电,1.50,41.61, +橡胶,1.49,30.80, +非金属材料Ⅱ,1.47,30.88, +生物制品,1.47,137.60, +光伏设备,1.45,627.59, +乘用车,1.45,102.48, +计算机设备,1.44,355.06, +造纸,1.43,37.95, +家居用品,1.41,68.17, +装修装饰Ⅱ,1.41,22.03, +汽车零部件,1.38,608.49, +一般零售,1.38,63.40, +半导体,1.38,1982.82, +分立器件,1.37,174.59, +商用车,1.36,55.03, +汽车,1.35,798.23, 玻纤制造,0.05,8.50,8 金融信息服务,0.05,1.26,3 期货,0.04,0.98,4 -锂电池,0.04,26.46,27 -逆变器,0.04,13.09,9 -电池,0.04,46.91,94 -电池化学品,0.04,11.28,42 -品牌消费电子,0.04,1.42,10 -锂电专用设备,0.03,3.06,15 -玻璃玻纤,0.03,9.20,17 镍,0.03,3.97,1 锂,0.03,9.49,7 -能源金属,0.03,13.95,10 -其他数字媒体,0.03,0.33,2 其他纺织,0.03,1.32,11 -印染,0.03,-0.46,4 证券Ⅲ,0.03,51.05,49 -证券Ⅱ,0.03,51.05,49 油气及炼化工程,0.03,-0.31,5 钴,0.02,0.50,2 塑料包装,0.02,0.63,8 其他橡胶制品,0.02,0.10,14 -非银金融,0.02,52.66,78 -半导体设备,0.02,-3.02,16 -其他电子Ⅲ,0.02,12.39,25 -其他电子Ⅱ,0.02,12.39,25 多业态零售,0.02,1.03,14 商用载货车,0.02,2.06,8 -火电设备,0.02,0.04,3 其他家居用品,0.02,0.18,20 机器人,0.02,1.61,20 成品家居,0.02,0.58,16 -数字芯片设计,0.02,38.64,41 玻璃制造,0.02,0.70,9 原材料供应链服务,0.02,0.44,11 纺织服装设备,0.02,1.74,11 冰洗,0.02,0.28,7 -其他电源设备Ⅱ,0.02,8.80,25 -多元金融,0.02,1.44,24 零食,0.02,0.63,8 -其他电源设备Ⅲ,0.02,6.45,20 -大众出版,0.02,0.10,15 资产管理,0.02,-0.06,4 仓储物流,0.02,0.28,5 -电力设备,0.02,60.75,330 -纺织制造,0.02,1.91,25 -综合电力设备商,0.02,2.31,2 金属包装,0.02,0.51,5 公路货运,0.02,0.13,4 电动乘用车,0.02,6.96,3 其他化学纤维,0.02,-0.38,6 教育运营及其他,0.02,0.37,3 其他生物制品,0.02,0.15,31 -视频媒体,0.02,0.12,1 氨纶,0.02,-0.02,1 培训教育,0.02,0.74,10 -光伏辅材,0.02,2.57,16 铁矿石,0.02,0.81,4 -燃料电池,0.02,-0.06,1 -物流,0.02,1.48,42 -信托,0.02,0.31,3 家纺,0.02,0.14,6 +信托,0.02,0.31,3 跨境物流,0.02,0.48,12 商业物业经营,0.02,0.57,15 会展服务,0.02,-0.03,3 -教育,0.02,1.18,15 -光伏主材,0.02,-0.19,3 底盘与发动机系统,0.02,8.49,97 旅游零售Ⅲ,0.02,0.54,2 -旅游零售Ⅱ,0.02,0.54,2 -游戏Ⅲ,0.02,7.26,22 -游戏Ⅱ,0.02,7.26,22 其他计算机设备,0.02,6.34,53 耐火材料,0.02,-0.13,8 其他通用设备,0.02,0.59,43 特种纸,0.02,1.89,11 原料药,0.02,3.23,36 -白色家电,0.01,0.02,9 -橡胶,0.01,-0.36,18 -厨房电器,0.01,0.03,4 -生物制品,0.01,0.05,48 非金属材料Ⅲ,0.01,1.54,9 -非金属材料Ⅱ,0.01,1.54,9 -光伏设备,0.01,12.83,56 -乘用车,0.01,9.18,9 -计算机设备,0.01,8.96,75 -造纸,0.01,2.24,20 +厨房电器,0.01,0.03,4 机床工具,0.01,0.87,19 -家居用品,0.01,0.85,66 装修装饰Ⅲ,0.01,0.25,16 -装修装饰Ⅱ,0.01,0.25,16 -汽车零部件,0.01,6.35,222 端到端供应链服务,0.01,-0.00,7 -半导体,0.01,21.53,129 -一般零售,0.01,2.13,53 鞋帽及其他,0.01,0.24,10 -分立器件,0.01,-1.85,13 -商用车,0.01,1.72,11 -汽车,0.01,16.41,267 === 行业板块资金流向排行 === 板块名称,主力资金(亿),涨跌幅(%),领涨股 -电力设备,60.75,0.02,330 -非银金融,52.66,0.02,78 +电力设备,2979.54,1.83, +半导体,1982.82,1.38, +电池,1354.11,3.96, +数字芯片设计,1040.08,1.99, +汽车,798.23,1.35, +非银金融,792.38,2.26, +锂电池,653.27,4.12, +光伏设备,627.59,1.45, +汽车零部件,608.49,1.38, +证券Ⅱ,578.89,2.57, +电池化学品,546.21,3.75, +计算机设备,355.06,1.44, +能源金属,329.08,2.92, +其他电子Ⅱ,240.33,2.17, +其他电子Ⅲ,240.33,2.17, +逆变器,236.64,4.06, +其他电源设备Ⅱ,198.90,1.89, +半导体设备,192.78,2.20, +分立器件,174.59,1.37, +玻璃玻纤,145.38,3.25, +生物制品,137.60,1.47, +游戏Ⅱ,135.19,1.62, +游戏Ⅲ,135.19,1.62, +其他电源设备Ⅲ,134.45,1.87, +多元金融,132.31,1.89, +乘用车,102.48,1.45, +蓄电池及其他电池,80.50,5.68, +锂电专用设备,73.28,3.34, +家居用品,68.17,1.41, +一般零售,63.40,1.38, +综合电力设备商,56.56,1.82, +商用车,55.03,1.36, +物流,51.79,1.69, 证券Ⅲ,51.05,0.03,49 -证券Ⅱ,51.05,0.03,49 -电池,46.91,0.04,94 -数字芯片设计,38.64,0.02,41 -锂电池,26.46,0.04,27 -半导体,21.53,0.01,129 -汽车,16.41,0.01,267 -能源金属,13.95,0.03,10 -逆变器,13.09,0.04,9 -光伏设备,12.83,0.01,56 -其他电子Ⅲ,12.39,0.02,25 -其他电子Ⅱ,12.39,0.02,25 -电池化学品,11.28,0.04,42 +光伏辅材,49.61,1.71, +纺织制造,48.89,1.83, +白色家电,41.61,1.50, +造纸,37.95,1.43, +品牌消费电子,37.30,3.71, +大众出版,35.78,1.85, +非金属材料Ⅱ,30.88,1.47, +橡胶,30.80,1.49, +光伏主材,28.85,1.65, +装修装饰Ⅱ,22.03,1.41, +教育,18.04,1.66, +旅游零售Ⅱ,15.99,1.64, 锂,9.49,0.03,7 -玻璃玻纤,9.20,0.03,17 -乘用车,9.18,0.01,9 -计算机设备,8.96,0.01,75 -其他电源设备Ⅱ,8.80,0.02,25 玻纤制造,8.50,0.05,8 底盘与发动机系统,8.49,0.02,97 -游戏Ⅲ,7.26,0.02,22 -游戏Ⅱ,7.26,0.02,22 +火电设备,7.89,2.05, +印染,7.14,2.63, 电动乘用车,6.96,0.02,3 -其他电源设备Ⅲ,6.45,0.02,20 -汽车零部件,6.35,0.01,222 其他计算机设备,6.34,0.02,53 -蓄电池及其他电池,6.17,0.06,9 镍,3.97,0.03,1 +其他数字媒体,3.24,2.83, 原料药,3.23,0.02,36 -锂电专用设备,3.06,0.03,15 -光伏辅材,2.57,0.02,16 -综合电力设备商,2.31,0.02,2 -造纸,2.24,0.01,20 -一般零售,2.13,0.01,53 +视频媒体,3.15,1.72, 商用载货车,2.06,0.02,8 -纺织制造,1.91,0.02,25 特种纸,1.89,0.02,11 纺织服装设备,1.74,0.02,11 -商用车,1.72,0.01,11 机器人,1.61,0.02,20 非金属材料Ⅲ,1.54,0.01,9 -非金属材料Ⅱ,1.54,0.01,9 -物流,1.48,0.02,42 -多元金融,1.44,0.02,24 -品牌消费电子,1.42,0.04,10 其他纺织,1.32,0.03,11 金融信息服务,1.26,0.05,3 -教育,1.18,0.02,15 多业态零售,1.03,0.02,14 期货,0.98,0.04,4 机床工具,0.87,0.01,19 -家居用品,0.85,0.01,66 +燃料电池,0.85,1.70, 铁矿石,0.81,0.02,4 培训教育,0.74,0.02,10 玻璃制造,0.70,0.02,9 @@ -169,43 +183,29 @@ 成品家居,0.58,0.02,16 商业物业经营,0.57,0.02,15 旅游零售Ⅲ,0.54,0.02,2 -旅游零售Ⅱ,0.54,0.02,2 金属包装,0.51,0.02,5 钴,0.50,0.02,2 跨境物流,0.48,0.02,12 原材料供应链服务,0.44,0.02,11 教育运营及其他,0.37,0.02,3 -其他数字媒体,0.33,0.03,2 信托,0.31,0.02,3 仓储物流,0.28,0.02,5 冰洗,0.28,0.02,7 装修装饰Ⅲ,0.25,0.01,16 -装修装饰Ⅱ,0.25,0.01,16 鞋帽及其他,0.24,0.01,10 其他家居用品,0.18,0.02,20 其他生物制品,0.15,0.02,31 家纺,0.14,0.02,6 公路货运,0.13,0.02,4 -视频媒体,0.12,0.02,1 -大众出版,0.10,0.02,15 其他橡胶制品,0.10,0.02,14 -生物制品,0.05,0.01,48 -火电设备,0.04,0.02,3 厨房电器,0.03,0.01,4 -白色家电,0.02,0.01,9 端到端供应链服务,-0.00,0.01,7 氨纶,-0.02,0.02,1 会展服务,-0.03,0.02,3 资产管理,-0.06,0.02,4 -燃料电池,-0.06,0.02,1 耐火材料,-0.13,0.02,8 -光伏主材,-0.19,0.02,3 油气及炼化工程,-0.31,0.03,5 -橡胶,-0.36,0.01,18 其他化学纤维,-0.38,0.02,6 -印染,-0.46,0.03,4 -分立器件,-1.85,0.01,13 -半导体设备,-3.02,0.02,16 === 概念板块涨跌幅排行 === 板块名称,涨跌幅(%),主力资金(亿),领涨股 @@ -252,9 +252,9 @@ ERP概念,0.02,4.14,17 蓝宝石,0.02,-6.10,11 电子身份证,0.02,1.16,34 电池技术,0.02,46.49,446 +燃料电池概念,0.02,18.94,112 船舶制造,0.02,2.94,9 数字哨兵,0.02,-1.53,10 -燃料电池概念,0.02,18.94,112 移动支付,0.02,4.00,56 生物识别,0.02,4.48,42 汽车芯片,0.02,26.48,56 @@ -268,47 +268,47 @@ ERP概念,0.02,4.14,17 液冷概念,0.01,-4.57,90 汽车热管理,0.01,6.16,79 减速器,0.01,5.77,68 -昨日首板,0.01,-40.93,22 -第三代半导体,0.01,-21.82,71 新能源车,0.01,106.69,539 +第三代半导体,0.01,-21.82,71 +昨日首板,0.01,-40.93,22 深证100R,0.01,90.28,72 化债(AMC)概念,0.01,7.92,49 减肥药,0.01,3.65,30 -周期股,0.01,60.08,68 -人形机器人,0.01,8.77,189 屏下摄像,0.01,-1.27,9 -茅指数,0.01,62.71,34 +人形机器人,0.01,8.77,189 +周期股,0.01,60.08,68 智能家居,0.01,35.06,134 -百元股,0.01,35.52,140 -消费电子概念,0.01,40.53,140 无线耳机,0.01,34.12,65 +茅指数,0.01,62.71,34 +百元股,0.01,35.52,140 2025三季报扭亏,0.01,0.31,9 +消费电子概念,0.01,40.53,140 +智能穿戴,0.01,41.68,100 +特斯拉概念,0.01,7.24,167 汽车整车,0.01,11.00,23 熔盐储能,0.01,0.15,9 -特斯拉概念,0.01,7.24,167 -智能穿戴,0.01,41.68,100 昨日涨停,0.01,-64.20,31 快递概念,0.01,2.67,35 AIPC,0.01,14.58,37 -电子竞技,0.01,5.27,27 -高压快充,0.01,4.58,44 石墨烯,0.01,2.43,50 +电子竞技,0.01,5.27,27 REITs概念,0.01,2.76,17 -磁悬浮概念,0.01,13.20,25 +高压快充,0.01,4.58,44 电子烟,0.01,22.47,35 +磁悬浮概念,0.01,13.20,25 存储芯片,0.01,31.68,69 -空气能热泵,0.01,1.79,30 基金重仓,0.01,125.63,349 +空气能热泵,0.01,1.79,30 ST股,0.01,-2.32,124 小米概念,0.01,2.29,171 全息技术,0.01,2.58,10 贬值受益,0.01,8.27,143 CRO,0.01,-4.61,31 -2025中报预增,0.01,46.18,332 -百度概念,0.01,-7.02,110 超级电容,0.01,-11.24,25 无人驾驶,0.01,26.46,211 +百度概念,0.01,-7.02,110 虚拟电厂,0.01,1.27,52 +2025中报预增,0.01,46.18,332 === 概念板块资金流向排行 === 板块名称,主力资金(亿),涨跌幅(%),领涨股 diff --git a/data/board_history.db b/data/board_history.db index 5f37c8b1ae3c8aed5b4e4e731837ebb8f4ca6a49..aa3b2f988512bd562ee70f7c60e241dc48660ccf 100644 GIT binary patch literal 278528 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 delta 7531 zcmZ`;30PEB`@iR&yRS1agR%}FxS;4PteOsJerB18JDQ3qie)YprWnFtm`f6Pm1CBD znNnI>7HNHnh^3X8CK?*DxMHQB3$6(+|8wtv5#RIYd6;|7dw%bF-uJv`=H}*_b91S} zK$#^7!qoB)in_)F_Vct&st={sVji1MG!y2v_N=Gy{4X4kEj*ucJ+O=P|a26 zsA=jjcv|hNMytW9tlU>FD|N~tWw)|TS+A^wN0cn(d1ajPq|#f7QUVk~Zjvv`C*_}D zh5VKLk&NUw9h2ku6qBvCSC-xLWL`8TYToLMp!$LXC6+RK(5mpEb zg%^bJ!c#&Yp}P<$h^%jYt=bZ!(kkc;IaIV(rAx7Y@@irvrdU`yCFY(AUGrn95ifov=r$y!;O zxy3XvRm^^72UEhVVe*+wCY>3@3}j-NNXE+0^ewu9uA=wTJLnR64V_PC(&_XldLSK3 zN77cBrfyNe4OA7ipV~o{P;01sDw9g5Mo|N)SSpgTQgmsG=|_OJPk{=WH5-~yPC7K9 zhx*6tY52o79jZu~3eD!LDhwl?c4u6)Jto>=C(agUKpS%aZ#_+XWq%&pX^6*Y&TLqS zlG35wnB}I!e&L|UKUqQdcJnB7Bpuq!UE7hnpwpNf5!sF$fz`Alg%?kQA^kyUJF>0a zJfz(`xZOMm*{4Ap2tY|#oE3Czx7@+-ZyFpL4$SSAOzq|>Ix-FRj093Uy4Y^67ZM7c z4*U54y4@0m(x$@@5|F533hV_QqSI4gs1a1tROk-->z{DqPP_SSlr$CgGT&%NzK+tS zLK}6>aAhhSN)i`Q#Z=f6P0WC1Z~>)dV6%yH{}W>3OgllRQ6Yw+^64-P)Sx4}sYErp zHXYh5C)z=e>&i?SFeHaK)^6!&yLn~1`H^<>U)s$Nx0@eoH~;w`bJX`N^i@b~4p4u` zpMI`~6i12_uK#EF8~l1c1y}TE+(`9f zb-czMxZWx9y&NBu#)NyWn|xS(`+T5k%bdY;$L%(J1H zzd}FL>a>rie*0HK(twl~$K4r}8Kdo;Vu2$(Gqi29ZJLmN4i5KB)3O)X(8*$GQdi%< zv2);tpWK_`1K;;A%+!hwS>Py7x)z-os-;gWfTKNAw1TBJG-(RyV{#WKEJ=OxW@A#< z1K-Z=mcVI^2do(J97cqq-9eQ3|3geR5OqI5vyZ#@jqap0cvl4%z4=1 z(vzm!haR{{)yIt@UKvqvcE8)Swfc{K z1Khu!U9(~Otf5Y?l+lKi!=C|@dHscTzxH_S-$~ss?ARJ|;#r5?5Hi>^N>gTqY29YL zf`c*w!$Z*B$AQVm{r<)iLf<)?lESAiyYAR&cf@N&Z(+NJ8>=eKd)C zWyRWvP8%Fr@?k6KNih(Tm9qM{KX|bJ#b=wgxo>YjH2vt1el1EzdxjYSNb}PJu+e4w zC3P->H>$D*#yEAu_@_P32t-)0zrWTv)gR6L1Mp_|rhmQcIZ<;nY0xX?TkjvwO4Q5? zEc`Q`p$5>VrOXUKzq}1a3_Os3ZT5`ElcJ(s7t13u5)D^}d7jpi({1Rnp-@&!I!3*1 zFISR!XO^BB@Y)zH`JfdJ@eI+Tr`WW>nRRfYXRubZ%!ZbXfI+5hmUCst#^on<{Omm! zGkv2Wjv`V$lXOo@UwbhTz+s;8Sa^tb<%Xig&yK+Jak?@sYPJK*P1WV1t!9chxz}Bp zVq4C`J#}wc``jD%y6%Ja@$50r$bE@OIG>Q}rKM7$cv5^_>?NEO77Nk*FMJjsscu%E zR<0_V(oeoBzby~oj&X~)p6n^MknPRXGs~Dn`aGRSM^Q(q9I6LAR61-6U0-z?fY4+I}~(a=7JVmFU<-znXqj(u*eo*av=iKl3xc~B&ih0$j7;y?|QdjMMEY2K5yB{oZe!0{+L$7XWq-UNXD3WD;wKG%v z&^=$$@TrON(i!EAB))rh;FMDh7A!#zLYTVNN`^-1p|GDKqs8iJq zhqhss1wQL}Njvhg4b_#wjy`U!bBDdVOMH_2D^E=WMISo7Wje$&*GSFruSH{tbBr?m zb15*Jv~l@wXmxAdx9{h?)LFJW^>o4#XB!fOF93hF1(6i?cKV&;h2QI5@c7(i2x3GY zi3NqCx3ZvWF3Q`YiKkB`QN_!yZhQ45d<-=nwgRBruIY=qZqh74#&E33Zd2qC8NxD5(l1e=3i_2mJ@qF!7G~ zk(eSh3m*uB`Kx>Z-9wWvuu$TklS4wZgP|s=QcCa(7YbrglLU+{R^aEUQu#x z#GS(@lk6D_O!2+Gb;fB&GA%fbyBleoy_%HO6(>{h*_7sP_FU_=d1``IF~tf;?KCO+v|?kIp6Iroea_)D&Izqx*<@)A0^J^g z{hzNK7uow&XG<-P&Wpe&V+h*yEU;)NmPf$Rd7Uu9rtMoEk1Y$=Ez_!Ro6T?P8xZ!; zeX0BM8wu}@j5D@N8?j;}E}~Fx%#4Gx>;Mkf%E2jkccmn7=In%R+q<;n)aX2$q3gj| z;A?iT%--`v&cRhlVHX>F{kHu3cs(_7A%%E7#bx7<4!=#xrj=hrE2F87N#PTpstCGZ zO*GOZSWgoq{D9j`>w32>W4o?Uielruy(%xr+pB&7R&Dvp2skz`5EH_*S6AwO1sMF_ zkfh065Xh|~Gb7!bdv8iATlz%|?sd4}{k6KRP_0XW6T8>3je9?T00eWv;`5Q8UU2R? z@f4jGN~AcvEFFw=Ez2WSv%BEyluP*`U%S`-b!+f!I+VbXdwgPt$XqbAcknK}F#r5Bt*b%Gy( zTjF#&RVpJdv*-Ei;J8G>Cq7&t;}i;DgH!`0y0`EQX(5NRB1H*5D<61awZbf67FCBOlnKL_IW(duI+e}9{C0jU zJ6Pq_Y05!vw+hY{C0i+~oan5jn8H!Qc`^vSe4Y$JwSSQPkk3Uj7$sjI@pXr%LQ$eX zg`oeQCqq##rqK?U1N27b1~L#eT*1KAf8v!(B4tA#au{9CQ^9C(0~t!&W1YZ-&hS(K z3g_{1u`cI)0~R|*z|$06;!+Gm)V>0Npfy^sY?V7)M-O zEEv@Cy*DPo0V2J!pO7%)BpJ(&(q%XCR2Z5g;%PU1!3P^g$2uI~4KI2>hgX(d!CJp> z!2a?QHu;8b*rD@e7@B+))Bde{9)6V!goA{wC^^t;$T{7^0^L^K3ruX)li&nh z_3a8mTXc_UYz*&kC4hAKSR08X7J) zE|UGYcesUcH`j*?WSgmA_B(bXI}P+@yOMP*M`kkznNOG%%nOViOrWpB_4HBt3wj+g>hA@*{5AQ1na93L<&!w`Jo{Az@!fg3->9&+5$ASCO zIFKz3{D!J{GFTXbZyOW%MzEeQ zVqx)HS6ofx$r_)88L!mhUe`7q0a*gMi7CCkoaT-;;h6U})!tBlSv7px$V9w@j z5K21}V~G?Fb!V(Xmv_)8AA8Zisvd0kz z=l~+PDB0ftaE>@Y(#1qjQF6x?j#xmojADqRUXa~M9ASLgf*io4F9l+w;)sXFkas2| z5;vG(-gMCyd1qWa2xTr2fknw3THtXppnL1k2|`+iu0-Gk@J?q8aff~4k%d?TJ|lXx zXt3Lf+w77y8gS}?0QOuPxZM>8x_IGsR}68Lt06iTC0o3T?D&WbZW%i5AgE>NNB}L~ zT0&qdpdU|A3$Ow|dlP0f?mdV{It!=oG=+mMb;} z@WR%=!-5v-*)ksQIo?hO{!Jnm4=LedTOOB_xGQ#TOL4{lS^Tbzl<^C(ls1pQeDaY;JahM^BmEA)>3vFkMu#^I#8Cy#!_6oksMK?n|nD;B3<8irAF z<0I}M^zI^K)fo#SP(?N_-x%ViGW3z>LFlnXAc9iCA2BkFYbS3-EcqOb8{TI1g9GpNF@>750n}!|_Zb`GFw8MQjoC9OV?AfDC&GuHrY- z57=xfk17W5G2g?{)W4{4>?kUP^aEdz*O@Pv_vj_`OF3i~vz!ZN|3m&nf6DsP3UiV= z3JEqms@GLk*RZ%L9(W`@E5{x3=(3*d*aC%Kbq zVtNZpgt@{y+!5hfVLMl;;C+)Dq)~hoKbRZHhY6WdiBcu*5GJdW)%9wkn3JMj78eMg ztIOmq(to66MdniFRQWFc`np%yCR(`{)&1({VmGNsd0R~9Wx*^5%N{--|1jLB#0rTr z&u^0ls?|ay*C1s}{vwba+!l!z*2}x4Xl1bcqP&K`FD#QQh09`{xKgNA=1Pb7Kg9#e z1m(VJ#$Rl>-Nr6!BWokHeKo!sI_0Z9Uv1H@*IBdx{5)P`)yC9YwDG5`+7qXIw2+fl z?Wr1zw(&P#tpH=D{btpgPx@*hc>ObsrRsdNdQ4mRn?)N??W^^!wQ3sXpN_FLwU`I5 z4Z<>B$2>WBoxy86G4^7OpVk9ox?;Sw)~ubyx|i4bY4b79o>LZ0#C8>*v}hk<{BSH| z59W8C^3z_&Yjg10@A!XWO*d@}=KCGvdR1Gs%~<|;jQgV2qTR;y+nBc>=DmS!?^kEl zKEXV3SntxBuG+9#A0A&CoWPAEqOGnA*A8O|$FQVb_{mlKXb-S=yRd|RV+%)OF9qy{ ziX(Of&rj9)YO^qQC-xw`#)985=(i_r->GoTdD2f?UG3v_f$=1j~20Z27Ewh%3WyG*)pL@=W|b zqdz-S?#MT@W4M0O&(c@;d+JJVm6Rckkb1Ber4AB_Usn9cToFr|d~x7>wpg6PREvqC zh5JZ&C|qPd6ZQ$8NjHUjIa)|#I|>QxCxVHE`~~$A8_jQJ*72|Nv)L;Aw!+0rYz6+p z+YP(2l}6jkNmEO6|EL*8qBVD+6*V+Li&l7%B5@ZO(F{AIv(3E@`5Gv9mlr#fSB<`o5G{GoJ>_(W;nN)n?Y-)l% z^tL3fY()>njv)~T2F-7Venw9c>ssKn-Duin&9Dn*x-2DQrpgR#uF-=`_uylC50bK5 zeSGB}c3C>pD!TL@j1DBK+dJcmwG+R|e5>_F7m_`Mic-qSK-_%vrZuxk-xi|}H7?e- z;W|prhqwqX$Yrg@xs1!h+@6>WNJVNP2e|C`M)f~B?fT`aauHz zVhs;bW2wG;LwVh6S}3Pqr<6au?gUfDRjOz-#^QTa(KMVa_!hHaxXyD&jqt|6Mj5xK zvLEoiy%E>e7}#(cVjwr%6X$#pgx@J{>~!Qczc&r#b*zd-J{bD9<;fZwH{Z TUyO}O1PXq!P_Jrfrttp*Bd;WP diff --git a/fetch_history.py b/fetch_history.py new file mode 100644 index 0000000..af8dabf --- /dev/null +++ b/fetch_history.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +""" +批量获取板块历史K线数据 +""" + +import urllib.request +import json +import sqlite3 +import os +import time +from datetime import datetime +from pathlib import Path + +# 清除代理 +for v in ['http_proxy', 'https_proxy', 'HTTP_PROXY', 'HTTPS_PROXY']: + os.environ.pop(v, None) + +SCRIPT_DIR = Path(__file__).parent +DATA_DIR = SCRIPT_DIR / "data" +DB_FILE = DATA_DIR / "board_history.db" + + +def get_board_codes(): + """从数据库获取已保存的板块代码""" + conn = sqlite3.connect(DB_FILE) + cursor = conn.cursor() + + cursor.execute('SELECT DISTINCT board_code, board_name FROM board_data WHERE board_type="industry"') + industry = cursor.fetchall() + + cursor.execute('SELECT DISTINCT board_code, board_name FROM board_data WHERE board_type="concept"') + concept = cursor.fetchall() + + conn.close() + return industry, concept + + +def get_kline(code: str, days: int = 25): + """获取板块历史K线""" + secid = f"90.{code}" + url = f"http://push2his.eastmoney.com/api/qt/stock/kline/get?secid={secid}&fields1=f1,f2,f3,f4,f5,f6&fields2=f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63&klt=101&fqt=1&end=20500101&lmt={days}" + + try: + req = urllib.request.Request(url, headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + 'Referer': 'http://quote.eastmoney.com/' + }) + + with urllib.request.urlopen(req, timeout=15) as resp: + data = json.loads(resp.read().decode()) + + if data.get('data') and data['data'].get('klines'): + klines = data['data']['klines'] + result = [] + + for kline in klines: + parts = kline.split(',') + # 格式: 日期,开盘,收盘,最高,最低,成交量,成交额,振幅,涨跌幅,涨跌额,换手率 + result.append({ + 'date': parts[0], + 'pct_change': float(parts[8]) if parts[8] != '-' else 0, + 'amount': float(parts[6]) if parts[6] != '-' else 0, + }) + + return result + except Exception as e: + pass + + return None + + +def save_to_db(board_type: str, code: str, name: str, klines: list): + """保存到数据库""" + conn = sqlite3.connect(DB_FILE) + cursor = conn.cursor() + + count = 0 + for kline in klines: + try: + cursor.execute(''' + INSERT OR REPLACE INTO board_data + (date, board_type, board_code, board_name, pct_change, main_flow, leader_name) + VALUES (?, ?, ?, ?, ?, ?, ?) + ''', ( + kline['date'], + board_type, + code, + name, + kline['pct_change'], + kline['amount'] / 1e8, + '' + )) + count += 1 + except: + continue + + conn.commit() + conn.close() + return count + + +def main(): + print("\n📊 批量获取板块历史数据") + print("=" * 50) + + industry, concept = get_board_codes() + print(f"\n行业板块: {len(industry)} 个") + print(f"概念板块: {len(concept)} 个") + + # 获取行业板块历史 + print("\n📡 获取行业板块历史数据...") + success = 0 + for i, (code, name) in enumerate(industry, 1): + print(f" [{i}/{len(industry)}] {name}...", end=' ', flush=True) + + klines = get_kline(code, 25) + if klines: + count = save_to_db('industry', code, name, klines) + print(f"✅ {count}条") + success += 1 + else: + print("❌") + + time.sleep(0.15) + + print(f"\n行业板块完成: {success}/{len(industry)}") + + # 获取概念板块历史 + print("\n📡 获取概念板块历史数据...") + success = 0 + for i, (code, name) in enumerate(concept, 1): + print(f" [{i}/{len(concept)}] {name}...", end=' ', flush=True) + + klines = get_kline(code, 25) + if klines: + count = save_to_db('concept', code, name, klines) + print(f"✅ {count}条") + success += 1 + else: + print("❌") + + time.sleep(0.15) + + print(f"\n概念板块完成: {success}/{len(concept)}") + + # 统计 + conn = sqlite3.connect(DB_FILE) + cursor = conn.cursor() + + cursor.execute('SELECT COUNT(DISTINCT date) FROM board_data') + date_count = cursor.fetchone()[0] + + cursor.execute('SELECT MIN(date), MAX(date) FROM board_data') + min_date, max_date = cursor.fetchone() + + cursor.execute('SELECT COUNT(*) FROM board_data') + total = cursor.fetchone()[0] + + cursor.execute('SELECT date, COUNT(*) FROM board_data GROUP BY date ORDER BY date') + dates = cursor.fetchall() + + conn.close() + + print(f"\n✅ 完成!") + print(f" 数据日期: {date_count} 天") + print(f" 日期范围: {min_date} ~ {max_date}") + print(f" 总记录: {total} 条") + + print(f"\n 日期分布:") + for date, cnt in dates[-10:]: + print(f" {date}: {cnt} 条") + + +if __name__ == "__main__": + main() \ No newline at end of file