# tradeanalysis **Repository Path**: tczzld/tradeanalysis ## Basic Information - **Project Name**: tradeanalysis - **Description**: 交易分析程序 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-15 - **Last Updated**: 2026-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 股票交易分析系统 基于Python的股票交易分析系统,通过东方财富API获取实时股票数据,模拟股票买入卖出操作,并分析收益情况。 ## 功能特点 - 自动从zbfx表读取股票推荐数据 - 9:30自动 股票获取开盘价 - 15:00自动更新收盘价和涨跌幅 - 每只股票监听10个交易日 - 完整的交易数据记录和汇总分析 - 支持交易日历(自动跳过周末和节假日) - 定时任务调度和异常处理 - 详细的日志记录 ## 系统架构 ``` tradeanalysis/ ├── config/ # 配置文件 │ └── config.py # 数据库、API、交易时间等配置 ├── database/ # 数据库连接层 │ └── connect_sqlserver.py # SQL Server连接(pymssql) ├── repositories/ # Repository模式数据访问层 │ ├── base_repository.py # 基础Repository类 │ ├── zbfx_repository.py # 股票推荐数据Repository │ ├── mnjt_repository.py # 交易记录数据Repository │ └── database_factory.py # 数据库工厂(单例管理) ├── models/ # 数据模型定义 │ └── stock_model.py # 数据模型定义 ├── services/ # 业务服务层 │ ├── east_money_service.py # 东方财富API服务 │ ├── trade_service.py # 交易业务逻辑 │ └── scheduler_service.py # 定时任务调度 ├── utils/ # 工具类 │ └── trade_calendar.py # 交易日历工具 ├── templates/ # Web界面模板 │ ├── base.html # 基础模板 │ ├── dashboard.html # 主仪表板 │ └── reports.html # 详细报告 ├── static/ # 静态资源 │ ├── css/dashboard.css # 样式文件 │ └── js/dashboard.js # JavaScript脚本 ├── main.py # 主程序入口 ├── web_app.py # Web应用入口 ├── start_web.py # Web服务启动脚本 ├── web_service.sh # Web服务管理脚本(macOS/Linux) ├── web_service.bat # Web服务管理脚本(Windows) ├── requirements.txt # 依赖包列表 ├── Dockerfile # Docker容器配置 ├── docker-compose.yml # Docker编排配置 └── README.md # 项目文档 ``` ### 架构特点 - **分层清晰**: 数据库连接层、数据访问层、业务逻辑层职责分离 - **Repository模式**: 采用Repository模式管理数据访问,代码组织清晰 - **极简设计**: 删除不必要的中间层,直接使用Repository - **单例工厂**: DatabaseFactory统一管理数据库连接和Repository实例 - **Web界面**: FastAPI + Bootstrap 5 现代化Web界面 - **容器化**: 支持Docker部署,便于生产环境使用 ## 数据库表结构 ### zbfx表(源数据) - Id: 主键 - StockCode: 股票代码 - Reason: 推荐原因 - Strength: 得分 - dtm: 推荐时间 ### mnjt表(结果数据) - id: 主键 - code: 股票代码 - Reason: 推荐原因 - Score: 得分 - buy_jiage: 买入价格 - buy_dtm: 买入时间 - jiage: 收盘价格 - zhangfu: 当日涨幅 - days: 总持仓天数 - isend: 是否结束监听 ## 安装和使用 ### 1. 环境要求 - Python 3.8+ - SQL Server数据库 - ODBC Driver 17 for SQL Server ### 2. 创建虚拟环境(推荐) ```bash # 创建虚拟环境 python -m venv .venv # 激活虚拟环境 source .venv/bin/activate # macOS/Linux # 或 .venv\Scripts\activate # Windows ``` ### 3. 安装依赖 ```bash # 方式一:自动安装(推荐) python setup.py # 方式二:手动安装 pip install -r requirements.txt # 方式三:针对ARM64 macOS的特殊安装 pip install --only-binary=all pymssql pip install requests pandas flask apscheduler fastapi uvicorn psutil ``` ## Web界面访问 系统提供了现代化的Web界面,支持多用户同时访问,可以部署到服务器供团队使用。 ### 启动Web服务 #### 🚀 快捷启动(推荐) ```bash # 激活虚拟环境 source .venv/bin/activate # macOS/Linux # 或 .venv\Scripts\activate # Windows # 一键启动(最简单) ./web_service.sh start 8000 # macOS/Linux # 或 web_service.bat start 8000 # Windows # 后台启动(不占用终端) ./web_service.sh background 8000 # 查看服务状态 ./web_service.sh status 8000 ``` #### 📋 其他启动方式 **使用Python脚本**: ```bash # 开发模式(本地访问) python start_web.py --mode dev # 开发模式(允许外部访问) python start_web.py --mode dev --host 0.0.0.0 # 生产模式 python start_web.py --mode prod --host 0.0.0.0 --workers 4 ``` **直接启动**: ```bash # 开发环境 uvicorn web_app:app --host 127.0.0.1 --port 8000 --reload # 生产环境 uvicorn web_app:app --host 0.0.0.0 --port 8000 --workers 4 ``` **Docker部署**: ```bash # 构建并启动 docker-compose up -d # 查看日志 docker-compose logs -f # 停止服务 docker-compose down ``` ### Web功能特点 - 📊 **实时仪表板**: 关键指标卡片、收益趋势图表 - 📈 **数据可视化**: Chart.js图表库,支持收益曲线、分布图等 - 📋 **交易记录**: 当前持仓、历史交易、详细分析 - 🔄 **自动刷新**: 30秒自动更新数据,实时监控 - 📱 **响应式设计**: 支持手机、平板、桌面访问 - 🎨 **现代UI**: Bootstrap 5 + 自定义样式 - 🚀 **高性能**: FastAPI异步框架,支持高并发 - 🔒 **稳定可靠**: 完整的错误处理和健康检查 ### 访问地址 启动成功后,通过浏览器访问: - **本地访问**: http://127.0.0.1:8000 - **局域网访问**: http://[服务器IP]:8000 - **Docker访问**: http://localhost:8000 ### 页面说明 1. **主仪表板** (`/`): - 总交易次数、胜率、平均收益率、净收益等关键指标 - 当前持仓表格,实时显示股票代码、买入价、当前价、收益率 - 最近交易记录,快速查看交易状态 - 收益趋势图表,可视化展示累计收益 2. **详细报告** (`/reports`): - 多时间段分析(7天、30天、90天、180天) - 收益趋势分析、收益分布饼图 - 交易频次统计、风险指标计算 - 详细交易记录表格,支持搜索和分页 - 报告导出和打印功能 3. **API接口** (`/api/*`): - `/api/performance`: 性能汇总数据 - `/api/recent-trades`: 最近交易记录 - `/api/current-holdings`: 当前持仓 - `/api/daily-performance`: 每日收益数据 ### 部署建议 #### 开发环境 ```bash python start_web.py --mode dev ``` #### 生产环境 ```bash # 方式1: 直接部署 python start_web.py --mode prod --host 0.0.0.0 --port 8000 --workers 4 # 方式2: Docker部署(推荐) docker-compose up -d ``` #### 反向代理(可选) 使用Nginx作为反向代理,提供SSL、负载均衡等功能: ```nginx server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` ### 4. 配置数据库 修改 `config/config.py` 中的数据库连接信息(已配置): ```python DATABASE_CONFIG = { 'server': 'fast9.shenzhuo.vip,56472', 'database': 'GP', 'username': 'sa', 'password': 'shanks00', 'connection_string': '...' } ``` ### 数据库架构使用说明 系统采用Repository模式进行数据访问,使用方式如下: ```python # 导入数据库工厂 from repositories.database_factory import database_factory # 获取Repository实例 zbfx_repo = database_factory.get_zbfx_repository() # 股票推荐数据 mnjt_repo = database_factory.get_mnjt_repository() # 交易记录数据 # 使用Repository进行数据操作 stocks = zbfx_repo.get_stocks_by_date(date.today()) mnjt_repo.insert_stock_record(stock_data) ``` **架构优势**: - ✅ **极简直观**: 删除了不必要的DatabaseManager包装层 - ✅ **职责分离**: 按表和业务领域组织代码 - ✅ **易于维护**: 代码路径清晰,新人容易上手 - ✅ **单例管理**: DatabaseFactory统一管理连接和实例 ### 5. 配置选股策略 可以通过修改 `config/config.py` 中的选股配置来调整策略: ```python # 选股配置 STOCK_SELECTION = { 'top_count': 30, # 按strength排序取最高的N只股票 'bottom_count': 30, # 按strength排序取最低的N只股票 'min_strength': 0.5 # 最小strength阈值(可选) } # 交易时间配置 TRADE_TIME = { 'buy_time': '09:30', # 买入时间 'sell_time': '15:00', # 收盘统计时间 'hold_days': 10 # 持仓天数 } # 调度器配置 SCHEDULER = { 'timezone': 'Asia/Shanghai' # 时区设置 } ``` **选股策略示例**: - **保守策略**: `top_count=10, bottom_count=10, min_strength=0.8` (高质量少数股票) - **平衡策略**: `top_count=30, bottom_count=30, min_strength=0.5` (当前默认配置) - **激进策略**: `top_count=50, bottom_count=50, min_strength=0.3` (更多机会) - **精选策略**: `top_count=5, bottom_count=5, min_strength=0.9` (超高质量) - **仅高质量**: `top_count=50, bottom_count=0, min_strength=0.7` (只选高strength股票) - **对比分析**: `top_count=20, bottom_count=20, min_strength=0.3` (高低对比) ### 6. 启动系统 #### 🚀 Web服务启动(推荐) **方式一:使用快捷脚本(最简单)** ```bash # 激活虚拟环境 source .venv/bin/activate # macOS/Linux # 或 .venv\Scripts\activate # Windows # 查看所有可用命令 ./web_service.sh # macOS/Linux # 或 web_service.bat # Windows # 快速启动服务 ./web_service.sh start 8000 # 前台启动(可看日志) ./web_service.sh background 8001 # 后台启动(不占用终端) ./web_service.sh dev 8000 # 开发模式(自动重载) ./web_service.sh prod 8000 # 生产模式 # 服务管理 ./web_service.sh status 8000 # 查看服务状态 ./web_service.sh restart 8000 # 重启服务 ./web_service.sh stop 8000 # 停止服务 ``` **方式二:使用Python脚本** ```bash # 激活虚拟环境 source .venv/bin/activate # 启动服务(多种方式) python start_web.py --action start --port 8000 # 前台启动 python start_web.py --action background --port 8001 # 后台启动 python start_web.py --mode dev --port 8000 # 开发模式 python start_web.py --mode prod --host 0.0.0.0 --port 8000 # 生产模式 # 服务管理 python start_web.py --action status --port 8000 # 查看状态 python start_web.py --action restart --port 8000 # 重启服务 python start_web.py --action stop --port 8000 # 停止服务 ``` **方式三:直接启动** ```bash # 开发环境 uvicorn web_app:app --host 127.0.0.1 --port 8000 --reload # 生产环境 uvicorn web_app:app --host 0.0.0.0 --port 8000 --workers 4 ``` #### 📊 服务状态监控 启动后可以通过以下方式监控服务状态: ```bash # 查看详细状态信息 ./web_service.sh status 8000 # 输出示例: # 🔍 端口 8000 上发现 1 个进程: # 🐍 进程 #1 (主要服务) # PID: 12345 # 进程名: Python # 类型: Python Web服务 # 启动时间: Wed Aug 20 14:30:00 2025 # 内存使用: 25.6 MB # CPU使用: 0.1% # 🌐 访问地址: http://127.0.0.1:8000 ``` #### 🔧 核心交易系统启动 ```bash # 正常启动(后台运行定时任务) python main.py # 测试API连接 python main.py --test-api # 手动执行买入任务 python main.py --manual buy # 手动执行收盘统计任务 python main.py --manual sell ``` #### 💡 启动建议 **开发环境**: ```bash # 1. 启动Web服务(开发模式,可以看到实时日志) ./web_service.sh dev 8000 # 2. 另开终端启动核心交易系统 python main.py ``` **生产环境**: ```bash # 1. 后台启动Web服务 ./web_service.sh background 8000 # 2. 后台启动核心交易系统 nohup python main.py > logs/main.log 2>&1 & # 3. 监控服务状态 ./web_service.sh status 8000 ``` **Docker部署**: ```bash # 构建并启动(包含Web服务和核心系统) docker-compose up -d # 查看日志 docker-compose logs -f # 停止服务 docker-compose down ``` ## 定时任务 系统包含以下定时任务: - **买入任务**: 每个交易日 9:30 执行 - **收盘统计**: 每个交易日 15:00 执行 - **每日汇总**: 每个交易日 15:30 执行 ## 业务流程 1. **每日9:30买入** - 从zbfx表读取前一交易日的股票推荐,需要把同一个股票编号(stockCode,strength,reason)进行合并,然后再按strength排序最高的30个股票,和最低的30个股票 - 通过东方财富API获取当前开盘价格 - 创建mnjt记录,设置买入价格和时间 2. **每日15:00收盘统计** - 查询所有活跃股票(isend != 'Y') - 获取当前收盘价格 - 计算涨跌幅:(收盘价-买入价)/买入价*100 - 更新持仓天数(days +1) - 如果达到10天,设置isend = 'Y' 3. **交易日历管理** - 自动识别交易日(工作日且非节假日) - 内置2024-2025年节假日数据 - 支持动态添加/移除节假日 ## 东方财富API接口说明 ### 按代码批量查询接口(精准获取) **接口地址**: `http://push2.eastmoney.com/api/qt/ulist.np/get` **请求参数**: - `secids`: 股票代码列表,格式为"市场.代码" - 沪市:`1.600519`(茅台) - 深市:`0.000001`(平安银行) - 创业板:`0.300001`(特锐德) - `fields`: 返回字段列表 - `ut`: 接口令牌 **字段对照表**: | 字段 | 含义 | 示例值 | 说明 | |------|------|--------|------| | f2 | 最新价 | 42.99 | 当前股价 | | f3 | 涨跌幅% | 14.85 | 相对昨收的涨跌百分比 | | f4 | 涨跌额 | 5.56 | 相对昨收的涨跌金额 | | f5 | 成交量(手) | 107988 | 当日成交量 | | f6 | 成交额 | 457355536.99 | 当日成交金额 | | f7 | 振幅% | 13.22 | (最高价-最低价)/昨收*100 | | f8 | 换手率% | 46.75 | 成交量/流通股本*100 | | f9 | 动态市盈率 | 64.15 | 股价/每股收益 | | f10 | 市净率 | 7.35 | 股价/每股净资产 | | f12 | 股票代码 | "301560" | 6位股票代码 | | f14 | 股票名称 | "众捷汽车" | 股票简称 | | f15 | 最高价 | 44.83 | 当日最高价 | | f16 | 最低价 | 39.88 | 当日最低价 | | f17 | 开盘价 | 39.88 | 当日开盘价 | | f18 | 昨收价 | 37.43 | 前一交易日收盘价 | | f20 | 总市值 | 5227584000 | 总股本*股价 | | f21 | 流通市值 | 993051804 | 流通股本*股价 | | f25 | 静态市盈率 | 160.55 | 基于年报数据计算 | | f100 | 所属行业 | "汽车零部件" | 行业分类 | ### 3. 系统使用策略 - **统一使用批量接口**: 系统已简化为只使用按代码批量接口(`ulist.np/get`) - **买入/收盘**: 根据股票代码列表精准获取指定股票的开盘价和收盘价 - **价格单位智能处理**: 自动识别并处理API返回的价格单位差异(分/元) ### 4. 重要技术说明 #### 价格单位智能处理 ⚠️ **关键注意**: 批量接口(`ulist.np/get`)的价格单位不一致! | 股票类型 | 价格返回单位 | 示例 | 系统处理 | |----------|-------------|------|----------| | 高价股(>100元) | **分** | f2: 3771 (平安银行37.71元) | **自动除以100转换** | | 低价股(≤100元) | **元** | f2: 6.97 (兴蓉环境6.97元) | **直接使用** | | 涨跌幅 | **%** | f3: 0.29 (0.29%) | **直接使用** | **智能单位处理**: 系统会根据价格大小智能判断单位,自动处理价格转换,确保买入价格和收盘价格单位统一。 **修复历史**: - v1.0: 发现批量接口价格单位不一致问题 - v1.1: 实现智能单位判断,根据价格大小自动转换 #### 买入价格逻辑 系统的 `buy_jiage` 字段使用以下优先级: 1. **优先**: f17字段(开盘价) - 9:30买入时的开盘价 2. **回退**: f2字段(最新价) - 当开盘价不可用时使用 #### 数据验证示例 ``` 原始API数据: f17: 930 (批量接口) 系统转换后: 9.30元 数据库存储: buy_jiage: 9.30 ``` ## 日志说明 系统会在`logs/`目录下生成日志文件: - 文件轮转:单文件最大10MB - 保留5个备份文件 - 同时输出到控制台和文件 - 包含详细的执行过程和异常信息 ## 监控和维护 系统提供以下监控功能: - 任务执行状态监控 - 交易汇总统计 - API连接状态检查 - 数据库操作异常处理 - 完整的错误日志记录 ## 注意事项 1. **交易日历**: 系统内置节假日数据,需要根据实际情况更新 2. **API限制**: 东方财富API可能有频率限制,系统已做错误处理 3. **数据完整性**: 系统会检查价格数据有效性,异常数据会跳过处理 4. **持仓管理**: 每只股票严格按照10个交易日进行监听 5. **去重机制**: 同一只股票在同一天不会重复买入 ## 常见问题 ### Q: 系统如何处理API调用失败? A: 系统包含完整的异常处理机制,API失败时会记录日志并跳过当次操作,不会影响整体运行。 ### Q: 如何添加新的节假日? A: 可以通过修改 `utils/trade_calendar.py` 中的节假日列表,或调用 `add_holiday()` 方法动态添加。 ### Q: 数据库连接失败怎么办? A: 检查数据库服务状态、网络连接和配置信息,系统会在日志中记录详细的错误信息。 ## 技术支持 如有技术问题,请查看日志文件或联系开发团队。