219 lines
6.0 KiB
Markdown
219 lines
6.0 KiB
Markdown
|
|
# 香港股票数据管理系统 - 项目分析与改进建议
|
|||
|
|
|
|||
|
|
## 项目概述
|
|||
|
|
|
|||
|
|
本项目是一个香港股票数据管理系统,主要功能包括:
|
|||
|
|
- 从Futu API获取股票K线数据
|
|||
|
|
- 处理和分析股票数据
|
|||
|
|
- 将数据存储到MySQL数据库
|
|||
|
|
- 导出数据到CSV文件
|
|||
|
|
- 计算月度平均数据
|
|||
|
|
|
|||
|
|
## 当前项目结构分析
|
|||
|
|
|
|||
|
|
### 主要文件结构
|
|||
|
|
```
|
|||
|
|
HKDataManagment/
|
|||
|
|
├── base/ # 基础工具类
|
|||
|
|
│ ├── Config.py # 配置管理
|
|||
|
|
│ ├── LogHelper.py # 日志工具
|
|||
|
|
│ └── MySQLHelper.py # 数据库操作工具
|
|||
|
|
├── config/ # 配置文件目录
|
|||
|
|
├── DataAnalysis/ # 数据分析模块
|
|||
|
|
├── UpdateFutuData/ # Futu数据更新模块
|
|||
|
|
├── export.py # 数据导出脚本
|
|||
|
|
├── getKline.py # K线数据获取脚本
|
|||
|
|
├── main.py # 主演示文件
|
|||
|
|
└── updatekline.py # K线更新类(已重构)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 主要问题识别
|
|||
|
|
|
|||
|
|
### 1. 代码重复和功能重叠
|
|||
|
|
- `export.py` 和 `getKline.py` 存在大量重复代码(导入语句、函数定义)
|
|||
|
|
- 两个文件都包含相同的 `exportMonthlyAvgData` 和 `calculate_update_monthly_avg_table` 函数
|
|||
|
|
|
|||
|
|
### 2. 缺乏统一的入口点
|
|||
|
|
- 多个独立的脚本文件(export.py, getKline.py, main.py)
|
|||
|
|
- 没有统一的主程序来协调各个功能模块
|
|||
|
|
|
|||
|
|
### 3. 配置管理分散
|
|||
|
|
- 数据库配置在多个文件中硬编码
|
|||
|
|
- 缺少统一的配置管理系统
|
|||
|
|
|
|||
|
|
### 4. 错误处理不完善
|
|||
|
|
- 部分异常处理不够详细
|
|||
|
|
- 日志记录可以更加规范化
|
|||
|
|
|
|||
|
|
### 5. 模块化程度不足
|
|||
|
|
- 功能模块之间的耦合度较高
|
|||
|
|
- 可复用性有待提高
|
|||
|
|
|
|||
|
|
## 改进建议
|
|||
|
|
|
|||
|
|
### 1. 代码重构和去重
|
|||
|
|
**建议措施:**
|
|||
|
|
- 将 `export.py` 和 `getKline.py` 中的重复函数提取到公共模块
|
|||
|
|
- 创建统一的工具类或模块来共享通用功能
|
|||
|
|
|
|||
|
|
**示例代码结构:**
|
|||
|
|
```python
|
|||
|
|
# common/utils.py
|
|||
|
|
def exportMonthlyAvgData(db_config, table_suffix):
|
|||
|
|
# 通用导出函数
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
def calculate_update_monthly_avg_table(db_config, reserved_codes_path):
|
|||
|
|
# 通用计算函数
|
|||
|
|
pass
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 创建统一的主程序
|
|||
|
|
**建议措施:**
|
|||
|
|
- 开发一个主命令行界面(CLI)应用程序
|
|||
|
|
- 使用 argparse 或 click 库创建命令子系统
|
|||
|
|
|
|||
|
|
**示例结构:**
|
|||
|
|
```python
|
|||
|
|
# main_cli.py
|
|||
|
|
import argparse
|
|||
|
|
from UpdateFutuData.KLineUpdater import KLineUpdater
|
|||
|
|
from common.utils import exportMonthlyAvgData, calculate_update_monthly_avg_table
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
parser = argparse.ArgumentParser(description='香港股票数据管理系统')
|
|||
|
|
subparsers = parser.add_subparsers(dest='command')
|
|||
|
|
|
|||
|
|
# 更新数据命令
|
|||
|
|
update_parser = subparsers.add_parser('update', help='更新K线数据')
|
|||
|
|
update_parser.add_argument('--codes', nargs='+', help='股票代码列表')
|
|||
|
|
|
|||
|
|
# 导出数据命令
|
|||
|
|
export_parser = subparsers.add_parser('export', help='导出数据')
|
|||
|
|
|
|||
|
|
args = parser.parse_args()
|
|||
|
|
|
|||
|
|
if args.command == 'update':
|
|||
|
|
updater = KLineUpdater()
|
|||
|
|
updater.update_kline_data(stock_codes=args.codes)
|
|||
|
|
elif args.command == 'export':
|
|||
|
|
exportMonthlyAvgData()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 改进配置管理
|
|||
|
|
**建议措施:**
|
|||
|
|
- 创建统一的配置文件(如 config.yaml 或 config.ini)
|
|||
|
|
- 使用环境变量进行敏感信息管理
|
|||
|
|
- 实现配置的热重载功能
|
|||
|
|
|
|||
|
|
**示例配置:**
|
|||
|
|
```yaml
|
|||
|
|
# config/config.yaml
|
|||
|
|
database:
|
|||
|
|
host: localhost
|
|||
|
|
user: root
|
|||
|
|
password: ${DB_PASSWORD}
|
|||
|
|
database: hk_kline_1d
|
|||
|
|
|
|||
|
|
futu:
|
|||
|
|
host: 127.0.0.1
|
|||
|
|
port: 11111
|
|||
|
|
|
|||
|
|
paths:
|
|||
|
|
data: ./data
|
|||
|
|
config: ./config
|
|||
|
|
logs: ./logs
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 增强错误处理和日志
|
|||
|
|
**建议措施:**
|
|||
|
|
- 实现更详细的异常分类和处理
|
|||
|
|
- 添加重试机制对于API调用
|
|||
|
|
- 完善日志记录,包括操作审计日志
|
|||
|
|
|
|||
|
|
**示例改进:**
|
|||
|
|
```python
|
|||
|
|
def get_market_data_with_retry(self, market, max_retries=3):
|
|||
|
|
for attempt in range(max_retries):
|
|||
|
|
try:
|
|||
|
|
return self.get_market_data(market)
|
|||
|
|
except Exception as e:
|
|||
|
|
self.logger.warning(f"获取市场数据失败,尝试 {attempt + 1}/{max_retries}: {e}")
|
|||
|
|
time.sleep(2 ** attempt) # 指数退避
|
|||
|
|
raise Exception(f"无法获取 {market} 市场数据,已达到最大重试次数")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 提高模块化和可测试性
|
|||
|
|
**建议措施:**
|
|||
|
|
- 使用依赖注入模式
|
|||
|
|
- 增加单元测试和集成测试
|
|||
|
|
- 创建接口抽象层
|
|||
|
|
|
|||
|
|
**示例改进:**
|
|||
|
|
```python
|
|||
|
|
# 定义数据访问接口
|
|||
|
|
class IDataProvider(ABC):
|
|||
|
|
@abstractmethod
|
|||
|
|
def get_market_data(self, market) -> List[str]:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
@abstractmethod
|
|||
|
|
def get_kline_data(self, code, start_date, end_date) -> pd.DataFrame:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
# Futu实现
|
|||
|
|
class FutuDataProvider(IDataProvider):
|
|||
|
|
def __init__(self, host, port):
|
|||
|
|
self.host = host
|
|||
|
|
self.port = port
|
|||
|
|
|
|||
|
|
def get_market_data(self, market):
|
|||
|
|
# 实现具体逻辑
|
|||
|
|
pass
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6. 性能优化建议
|
|||
|
|
**建议措施:**
|
|||
|
|
- 实现批量操作减少数据库IO
|
|||
|
|
- 添加缓存机制减少API调用
|
|||
|
|
- 使用异步IO提高并发性能
|
|||
|
|
|
|||
|
|
**示例改进:**
|
|||
|
|
```python
|
|||
|
|
async def update_multiple_stocks(self, stock_codes):
|
|||
|
|
tasks = []
|
|||
|
|
for code in stock_codes:
|
|||
|
|
task = asyncio.create_task(self.update_single_stock(code))
|
|||
|
|
tasks.append(task)
|
|||
|
|
|
|||
|
|
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|||
|
|
return results
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7. 文档和维护建议
|
|||
|
|
**建议措施:**
|
|||
|
|
- 编写详细的API文档
|
|||
|
|
- 创建项目README和使用指南
|
|||
|
|
- 设置自动化测试和CI/CD流水线
|
|||
|
|
|
|||
|
|
## 实施优先级建议
|
|||
|
|
|
|||
|
|
1. **高优先级**:
|
|||
|
|
- 代码去重和重构
|
|||
|
|
- 统一配置管理
|
|||
|
|
- 增强错误处理
|
|||
|
|
|
|||
|
|
2. **中优先级**:
|
|||
|
|
- 创建统一CLI界面
|
|||
|
|
- 提高模块化程度
|
|||
|
|
- 添加基本测试
|
|||
|
|
|
|||
|
|
3. **低优先级**:
|
|||
|
|
- 性能优化
|
|||
|
|
- 高级功能开发
|
|||
|
|
- 自动化部署
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
本项目有良好的基础架构,但需要通过重构提高代码质量、可维护性和可扩展性。建议按照上述改进措施逐步优化,首先解决代码重复和配置管理问题,然后逐步实现更高级的功能和优化。
|