From 27632816a4694778d18d4a4483fdf3d77d91aa5d Mon Sep 17 00:00:00 2001 From: Qihang Zhang Date: Sat, 19 Apr 2025 20:07:53 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(data=5Fmanager):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC=E4=B8=BA=E5=B8=83=E5=B0=94=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_manager.py | 62 ++++++++++++++++++++++++++++++++++++++++++++----- main.py | 16 +++++++++---- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/data_manager.py b/data_manager.py index b47a3f5..d56da49 100644 --- a/data_manager.py +++ b/data_manager.py @@ -38,17 +38,17 @@ class DataFetcher: # 确保pro中存在对应的API方法 if not hasattr(pro, api_name): logger.error(f"Tushare API '{api_name}'不存在") - return pd.DataFrame() + return False try: df = getattr(pro, api_name)() # 将数据保存到数据库 db_manager.save_df_to_db(df, table_name=api_name, if_exists='replace') - return df + return True except Exception as e: logger.error(f"获取基础数据时出错: {e}") logger.debug(f"完整的错误追踪信息:\n{traceback.format_exc()}") - return pd.DataFrame() + return False @staticmethod def get_trade_date(api_name, start_date=None, end_date=None, force_update=False, batch_size=100000): @@ -71,7 +71,7 @@ class DataFetcher: # 确保pro中存在对应的API方法 if not hasattr(pro, api_name): logger.error(f"Tushare API '{api_name}'不存在") - return pd.DataFrame() + return False # 获取目标交易日历 all_trade_dates = DataReader.get_trade_cal(start_date, end_date) @@ -89,7 +89,7 @@ class DataFetcher: if not dates_to_fetch: logger.info("所有数据已在数据库中,无需更新") - return db_manager.load_df_from_db(table_name=table_name) + return True logger.info(f"需要获取 {len(dates_to_fetch)} 个交易日的数据") # 分批处理数据 @@ -126,7 +126,7 @@ class DataFetcher: logger.info(f"已处理剩余 {total_rows} 行数据") logger.info("数据获取与处理完成") - return db_manager.load_df_from_db(table_name=table_name) + return True @staticmethod def process_batch(batch_dfs, table_name, force_update): @@ -144,6 +144,56 @@ class DataFetcher: # 保存数据,传入force_update参数 db_manager.save_df_to_db(batch_df, table_name=table_name, force_update=force_update) + @staticmethod + def update_all(trade_date_api=None, basic_api=None, start_date=None, end_date=None, force_update=False): + """ + 更新所有数据 + """ + # 获取所有API名称 + if trade_date_api is None: + trade_date_api = [ + 'moneyflow', # 个股资金流向 + 'moneyflow_ind_dc', # 东财概念及行业板块资金流向(DC) + 'daily', # A股日线行情 + 'daily_basic', # 每日指标,获取全部股票每日重要的基本面指标 + 'stk_limit', # 每日涨跌停价格 + 'cyq_perf', # 每日筹码及胜率 + 'moneyflow_ths', # 同花顺资金流向 + 'moneyflow_dc', # 东方财富资金流向 + 'moneyflow_cnt_ths',# 同花顺概念板块资金流向(THS) + 'moneyflow_ind_ths',# 同花顺行业板块资金流向(THS) + 'kpl_concept', # 开盘啦题材库,获取开盘啦概念题材列表 + 'kpl_concept_cons', # 开盘啦题材成分,获取开盘啦概念题材的成分股 + 'kpl_list', # 获取开盘啦涨停、跌停、炸板等榜单数据 + 'top_list', # 龙虎榜每日明细 + 'top_inst', # 龙虎榜机构席位明细 + 'limit_list_d', # 涨跌停列表(新),获取A股每日涨跌停、炸板数据情况,数据从2020年开始(不提供ST股票的统计) + 'ths_daily', # 同花顺板块指数行情 + 'dc_index', # 东方财富概念板块,获取东方财富每个交易日的概念板块数据,支持按日期查询 + 'stk_auction', # 当日集合竞价,获取当日个股和ETF的集合竞价成交情况,每天9点25后可以获取当日的集合竞价成交数据 + 'ths_hot', # 获取同花顺App热榜数据,包括热股、概念板块、ETF、可转债、港美股等等,每日盘中提取4次,收盘后4次,最晚22点提取一次。 + + ] + if basic_api is None: + basic_api = [ + 'stock_basic', # 股票基本信息 + 'trade_cal', # 交易日历 + 'namechange', # 股票曾用名 + 'ths_index', # 同花顺概念和行业指数 + 'hm_list', # 游资名录 + 'index_basic', # 指数基本信息 + ] + + # 使用get_trade_date更新trade_date_api列表中的所有API + for api in trade_date_api: + logger.info(f"更新API: {api}") + DataFetcher.get_trade_date(api_name=api, start_date=start_date, end_date=end_date, force_update=force_update) + + # 使用get_basic更新basic_api列表中的所有API + for api in basic_api: + logger.info(f"更新API: {api}") + DataFetcher.get_basic(api_name=api) + class DataReader: """ diff --git a/main.py b/main.py index 12846bf..5028fbe 100644 --- a/main.py +++ b/main.py @@ -3,12 +3,20 @@ from money_flow_analyzer import MoneyflowAnalyzer if __name__ == "__main__": # 指定日期范围 - start_date = '20250101' + start_date = '20250410' end_date = None - # 获取板块资金流向数据 - # 可以通过force_update=True参数强制更新指定日期范围的数据 - df = DataFetcher.get_trade_date('top_list',start_date, end_date, force_update=False) + # 更新数据 + # trade_date_api = [ + # 'moneyflow', + # 'moneyflow_ind_dc', + # 'daily', + # ] + # basic_api = [ + # 'stock_basic', + # 'trade_cal', + # ] + DataFetcher.update_all(start_date=start_date, end_date=end_date, force_update=False) # analyzer = MoneyflowAnalyzer() # analyzer.main_flow_analyze(days_forward=10,use_consistent_samples=True) \ No newline at end of file