# 需求文件 这是这个项目的需求文件 ## 项目目标 这个项目的目标是通过解析一批pdf文件,抽取里面每天的持仓表格,然后生成对应的买入卖出的数据表格。最后根据查询对应日期的股票价格计算获取资金曲线的项目。 ## 具体流程 1. 直接在配置文件里配置要解析的pdf的目录和要输出买入卖出表格数据的存储目录 2. `context\20250421投资早参(和谈).pdf`是一个示例文档,也就是需要解析的pdf文件 3. 首先读取所有pdf目录里的pdf文件,抽取文件名的前8位,其实是日期。这个pdf发布时间是每个股票交易日的早上,所以应该记录两个日期,一个是文件名里的"记录日期",一个则是对应的"交易日期",也就是上一个文件名的记录日期。这里要注意,因为周末和节假日不交易,所以周末和节假日没有数据是正常的。 4. 其次解析对应的文件,找到里面表格数据的所在位置,如果有多个表格,应该是最后一个表格,表格应该有4-5列的数据。这里的pdf可能是扫描件格式的。 5. 表格里有一列叫"代码",对应的是股票代码,结合前面的"交易日期",就可以获得每个交易日的持仓股票代码。 6. 利用每个交易日的持仓股票代码,则可以进一步核算出每一个股票的买入交易日和卖出交易日。方法应该是遍历每一个股票代码,把所有出现过的日期罗列出来,找到中间中断的时间段。注意1,这里的中断要和前面通过解析文件名的日期列表进行对比,如果日期压根没出现过,说明那个不是交易日,这不算中断。除此以外那就是真正的中断,那么每一段第一次出现的日期就是买入日期,最后一次出现的日期就是卖出日期。注意2,可能同一个股票被多次买卖。 7. 到这里先可以保存交易结果的数据了。 ## 项目目录结构 ``` check_ss_strategy_stock/ ├── config/ │ └── config.yaml # 配置文件,包含PDF目录和输出目录路径 ├── data/ │ ├── pdfs/ # 存放输入的PDF文件 │ │ └── 20250421投资早参(和谈).pdf # 示例PDF文件 │ └── output/ # 存放输出的交易数据文件 │ └── transactions.csv # 示例输出文件(或其他格式) ├── src/ │ ├── __init__.py │ ├── config_loader.py │ │ └── load_config(config_path) # 函数:加载配置文件 │ ├── pdf_processor.py │ │ └── PdfProcessor # 类:处理单个PDF文件 │ │ ├── __init__(self, pdf_path) │ │ ├── extract_record_date(self) # 方法:从文件名提取记录日期 │ │ └── extract_holdings(self) # 方法:解析PDF,提取持仓表格中的股票代码 (需要处理扫描件) │ ├── trading_calculator.py │ │ └── TradingCalculator # 类:计算交易日期和买卖点 │ │ ├── __init__(self, pdf_files_info) # pdf_files_info: [{'record_date': date, 'codes': [code1, ...]}, ...] │ │ ├── calculate_trading_dates(self) # 方法:根据记录日期计算交易日期列表,处理非交易日 │ │ └── determine_buy_sell_dates(self, trading_dates) # 方法:根据每日持仓和交易日历,计算每个股票的买入卖出日期 │ ├── data_exporter.py │ │ └── export_data(data, output_path) # 函数:将计算结果导出到文件 │ └── main.py │ └── main() # 主函数:协调整个流程 ├── tests/ # 单元测试目录 (可选) │ ├── __init__.py │ ├── test_pdf_processor.py │ └── test_trading_calculator.py ├── requirements.txt # 项目依赖库 ├── README.md # 项目说明文件 └── prd.md # 需求文档 (已存在) ``` ## 流程图 ```mermaid graph TD A[开始] --> B{读取配置}; B --> C[获取PDF文件列表]; C --> D{遍历PDF文件}; D -- 对每个PDF --> E[提取文件名中的记录日期]; E --> F[解析PDF,提取持仓股票代码]; F --> G{收集所有PDF的记录日期和持仓}; D -- 完成遍历 --> H[计算实际交易日期列表]; H --> I[根据每日持仓和交易日计算买卖日期]; I --> J{保存交易结果到文件}; J --> K[结束]; subgraph PDF处理 E F end subgraph 交易计算 H I end ```