Skip to content

fix: 修复 SQLite 写入时 pd.Timestamp 绑定错误#6

Open
jaden1q84 wants to merge 27 commits intoxbfighting:masterfrom
jaden1q84:master
Open

fix: 修复 SQLite 写入时 pd.Timestamp 绑定错误#6
jaden1q84 wants to merge 27 commits intoxbfighting:masterfrom
jaden1q84:master

Conversation

@jaden1q84
Copy link
Copy Markdown

sqlite3 使用精确类型匹配查找适配器,不识别 pd.Timestamp(虽是
datetime.datetime 子类),导致 INSERT OR IGNORE 报 InterfaceError。

做法:先调用 to_dict('records') 得到 dict 列表,再遍历 dict
将 pd.Timestamp → datetime.pydatetime()、pd.NaT → None,此时 Python dict 不会触发 pandas 类型推断,转换结果可靠传入 sqlite3。

jaden1q84 and others added 27 commits April 4, 2026 17:37
sqlite3 使用精确类型匹配查找适配器,不识别 pd.Timestamp(虽是
datetime.datetime 子类),导致 INSERT OR IGNORE 报 InterfaceError。

之前的修复尝试在 DataFrame 上原地替换,但 pandas 会把赋值的
datetime 对象重新推断为 datetime64,to_dict() 后又变回 Timestamp,
转换失效。

正确做法:先调用 to_dict('records') 得到 dict 列表,再遍历 dict
将 pd.Timestamp → datetime.pydatetime()、pd.NaT → None,此时
Python dict 不会触发 pandas 类型推断,转换结果可靠传入 sqlite3。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- reader.py: 新增 read_gbbq() 读取通达信本地权息文件;新增 _read_day_file_raw() 绕过 pytdx 类型检查支持科创板(688xxx)
- processor.py: 新增 apply_forward_adj() 前复权算法,process_daily_data() 新增 gbbq 参数
- storage.py: DailyData 模型新增 adj_factor 字段
- cli.py: daily 命令支持纯6位代码自动推断市场(6/688→sh,其余→sz);修复 reset_index 条件漏掉 date 索引;修复 code 过滤格式不匹配
- scripts/migrate_add_adj_factor.sql: 已有数据库迁移脚本

gbbq 字段单位:hongli/10 = 每股红利(元),songgu/10 = 实际送股比例

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
get_stock_list 上海正则 `(60|688)\d{4}` 要求 688 后跟4位(共7位),
实际科创板代码为 688xxx(6位),改为 `(60\d{4}|688\d{3})` 精确匹配。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
改为调用前先检查 security_type,不支持时直接走 _read_day_file_raw,
避免 pytdx 内部 print 污染日志输出。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- processor.py: process_daily_data 新增 adj_type 参数(forward/backward/none),新增 apply_backward_adj 后复权实现
- cli.py: daily/sync 子命令新增 --adj-type 参数;daily 不带 --code 时改为逐股票处理,修复原先 apply_forward_adj 只处理第一只股票的缺陷

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 删除分钟线、板块关系、均线计算等全部非日线功能
- 将包重组为 src/tdx2db/,支持 pip install 后 from tdx2db import TdxDailySync
- 日期格式改为 YYYYMMDD 整数,DailyData 表去除 MA 列,新增 turnover_rate 预留列
- 增量策略:一次查询所有股票最新日期;有除权事件时自动全量重写该股数据
- 新增 tests/test_daily.py:7 个测试用例覆盖全量同步、指定股票、复权正确性、增量更新
- 更新 pyproject.toml / README.md / requirements.txt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
不再需要 sz/sh 前缀,cli 层根据首位数字自动判断市场(6开头→上海,其他→深圳),更新 README 和 CLAUDE.md 中的相关说明与示例。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- code → stock_code(列重命名)
- date 类型 Integer(YYYYMMDD整数) → String(8)(YYYYMMDD字符串)
- 更新所有 SQL 查询、conflict_columns、日期比较逻辑
- 同步更新测试断言

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- reader: 扫描 vipdoc/bj/lday/,匹配 8xxxxx 和 92xxxx 代码(market=2)
- reader: get_security_type 异常时回退到原始二进制读取,与科创板处理一致
- cli: 三处市场识别逻辑支持 bj 前缀和 8/92 开头代码
- tests: 修复 make_gbbq_with_event market 映射,新增 TestMultiMarket 三市场测试

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 新增 downloader.py:流式下载 hsjday.zip,手动处理 Windows 反斜杠路径,上下文管理器自动清理临时目录
- reader.py:新增 vipdoc_path 参数支持下载模式,抑制 pytdx 北交所 print 噪音
- cli.py:新增 download 子命令(--url/--adj/--no-clean),延迟 TdxDataReader 初始化
- config.py:新增 TDX_DOWNLOAD_URL 配置项
- requirements.txt:新增 requests 依赖
- 新增 tests/test_download.py:19 个测试用例覆盖下载/解压/读取/CLI 全流程

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- stock_info 表字段改为 stock_code/stock_name,与 daily_data 格式统一
- stock_code 格式统一为 000001.SZ,去掉 id/market 字段
- get_stock_list() 返回 list[str],不再返回 DataFrame
- stock-list 命令通过 akshare.stock_info_a_code_name() 获取真实中文名
- save_stock_info 改为 upsert,支持名称更新
每次 sync/daily/download 命令完成后,自动写入一条统计记录,
包含 stock_count(成功同步股票数)、total_rows(daily_data 总行数)
和 sync_time(同步时间)。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 新增 smb_accessor.py:SmbAccessor 类封装所有 SMB I/O,使用 smbprotocol 库
- config.py 追加 SMB_ENABLED/HOST/SHARE/USER/PASSWORD/TDX_PATH/PORT 共 7 个配置项
- reader.py:TdxDataReader 新增 smb 参数,三个核心方法增加 SMB 分支,临时文件方式适配 pytdx
- cli.py:新增 --smb-* 命令行参数,提取 _create_reader() 统一处理本地/SMB 两种模式
- 新增 tests/test_smb.py:31 个测试用例,全部 mock,覆盖路径构建、I/O、Reader 和 CLI
- .env.example 和 README 补充 SMB 配置说明,注明需使用 Windows 本地账户

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- config.py: 新增 SMB_WORKERS(默认16)和 SMB_BATCH_SIZE(默认200)配置项
- smb_accessor.py: 新增 download_batch_to_dir() 批量并发下载方法(ThreadPoolExecutor)
- reader.py: 新增 _parse_local_day_file() 统一解析逻辑,新增 read_daily_data_batch() 批量生成器
- cli.py: sync_all_daily() SMB 模式走批量并发路径,本地模式保持串行不变
- .env.example: 补充 SMB_WORKERS/SMB_BATCH_SIZE 配置说明

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- processor.py:新增 _calc_turnover_rate(),从 gbbq category==5 记录取
  流通股本(万股),通过 merge_asof 匹配每个交易日,计算
  换手率(%) = volume(手) × 10000 / 流通股本(股)
- processor.py:process_daily_data() 中替换原 turnover_rate=None 占位符,
  gbbq 有效时实际计算并填入
- smb_accessor.py:修复 exists() 在 SMB session 未注册时静默返回 False 的
  bug,导致 gbbq 文件始终判断为不存在而跳过复权和换手率计算

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- smb_accessor: share_access 改为 'rw' 修复 SMB 文件访问冲突
- smb_accessor: 删除重复的 base_dbf_unc 属性
- reader: _parse_base_dbf 股票代码字段名 GDM → GPDM
- processor: build_float_capital_map 加调试日志
- processor: _calc_turnover_rate 加调试日志
- tests: 修复 test_exists_returns_true 缺少 register_session mock
- tests: 修复 test_vipdoc_path_get_stock_list 返回值类型错误
volume 由"手"改为"股"(×100),amount 由"元"改为"万元"(÷10000);
同步修正换手率公式系数(×10000 → ×100)。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
消除 akshare 网络依赖,完全基于通达信本地数据文件获取个股中文名:

- reader.py: 新增 read_stock_names(),解析 T0002/hq_cache/{szs,shs,bjs}.tnf
  - _parse_tnf_file(): 自动探测 record_len 和名称字段偏移,兼容新旧版本 TDX
  - _detect_tnf_record_len(): 搜索相邻代码对定位记录边界,策略二用间距众数兜底
  - _detect_tnf_name_offset(): 扫描记录内首个非零字节簇定位名称偏移
  - 返回格式 {'SZ': {...}, 'SH': {...}, 'BJ': {...}},按市场分组避免代码空间重叠覆盖
- smb_accessor.py: 新增 tnf_unc(market) 方法构建 .tnf 文件 UNC 路径
- cli.py: sync_stock_list() 改用 reader.read_stock_names(),按后缀查对应市场字典
- requirements.txt: 移除 akshare 依赖
- tests/test_smb.py: 补充 tnf_unc mock 及 read_stock_names SMB 模式测试

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant