本文档描述 AI for Investor 的数据库模型设计。
开发环境 : SQLite (无需额外安装)
生产环境 : PostgreSQL / MySQL
字段
类型
说明
id
String(36)
主键 UUID
username
String(50)
用户名 (唯一)
email
String(100)
邮箱 (唯一)
hashed_password
String(255)
加密密码
is_active
Boolean
是否激活
is_admin
Boolean
是否管理员
created_at
DateTime
创建时间
updated_at
DateTime
更新时间
idx_username on username
idx_email on email
字段
类型
说明
id
String(64)
主键 (token_hash)
token_hash
String(128)
Token哈希 (唯一)
user_id
String(36)
用户ID (外键)
expires_at
DateTime
过期时间
created_at
DateTime
创建时间
revoked_at
DateTime
撤销时间
is_revoked
Boolean
是否已撤销
idx_token_hash on token_hash
idx_user_id on user_id
idx_is_revoked on is_revoked
字段
类型
说明
id
String(36)
主键 UUID
user_id
String(36)
所有者ID (外键)
name
String(100)
策略名称
description
Text
策略描述
code
Text
策略代码
params
JSON
参数定义
category
String(50)
分类
created_at
DateTime
创建时间
updated_at
DateTime
更新时间
idx_user_id on user_id
idx_category on category
字段
类型
说明
id
String(36)
主键 UUID
user_id
String(36)
用户ID (外键)
strategy_id
String(36)
策略ID (外键)
symbol
String(20)
交易标的
status
String(20)
状态 (pending/running/completed/failed/cancelled)
request_data
JSON
请求数据
created_at
DateTime
创建时间
updated_at
DateTime
更新时间
idx_user_id on user_id
idx_strategy_id on strategy_id
idx_status on status
idx_created_at on created_at
字段
类型
说明
id
String(36)
主键 UUID
task_id
String(36)
任务ID (外键)
total_return
Float
总收益率
annual_return
Float
年化收益率
sharpe_ratio
Float
夏普比率
max_drawdown
Float
最大回撤
win_rate
Float
胜率
total_trades
Integer
总交易次数
equity_curve
JSON
资金曲线
trades
JSON
交易记录
metrics_source
String(20)
指标来源
idx_task_id on task_id (唯一)
字段
类型
说明
id
String(36)
主键 UUID
user_id
String(36)
用户ID (外键)
name
String(100)
账户名称
initial_cash
Float
初始资金
current_cash
Float
当前现金
created_at
DateTime
创建时间
字段
类型
说明
id
String(36)
主键 UUID
account_id
String(36)
账户ID (外键)
symbol
String(20)
交易标的
side
String(10)
方向 (buy/sell)
quantity
Float
数量
price
Float
价格
status
String(20)
状态
created_at
DateTime
创建时间
idx_account_id on account_id
idx_status on status
字段
类型
说明
id
String(36)
主键 UUID
user_id
String(36)
用户ID (外键)
name
String(100)
告警名称
type
String(20)
类型
condition
JSON
触发条件
is_active
Boolean
是否启用
created_at
DateTime
创建时间
idx_user_id on user_id
idx_is_active on is_active
erDiagram
users ||--o{ refresh_tokens : "has"
users ||--o{ strategies : "owns"
users ||--o{ backtest_tasks : "submits"
users ||--o{ paper_accounts : "creates"
users ||--o{ alerts : "configures"
backtest_tasks ||--o| backtest_results : "produces"
backtest_tasks }o--|| strategy_versions : "uses"
paper_accounts ||--o{ paper_orders : "contains"
strategies ||--o{ strategy_versions : "has"
users {
string id PK "UUID"
string username UK
string email UK
string hashed_password
boolean is_active
boolean is_admin
datetime created_at
}
strategies {
string id PK "UUID"
string user_id FK
string name
text code
json params
string category
}
backtest_tasks {
string id PK "UUID"
string user_id FK
string strategy_id FK
string symbol
string status "pending/running/completed/failed/cancelled"
json request_data
text log_dir
}
backtest_results {
string id PK "UUID"
string task_id FK "unique"
float total_return
float sharpe_ratio
float max_drawdown
float win_rate
integer total_trades
json equity_curve
json trades
}
paper_accounts {
string id PK "UUID"
string user_id FK
string name
float initial_cash
float current_cash
}
paper_orders {
string id PK "UUID"
string account_id FK
string symbol
string side "buy/sell"
float quantity
float price
string status
}
alerts {
string id PK "UUID"
string user_id FK
string name
string type
json condition
boolean is_active
}
refresh_tokens {
string id PK
string token_hash UK
string user_id FK
datetime expires_at
boolean is_revoked
}
strategy_versions {
string id PK "UUID"
string strategy_id FK
integer version_number
text code
boolean is_default
}
Loading
from app .db .database import init_db
await init_db ()
使用 SQLAlchemy ORM 自动创建
支持版本化迁移 (可选 Alembic)
# 备份
cp backtrader.db backtrader.db.backup
# 恢复
cp backtrader.db.backup backtrader.db
# 备份
pg_dump ai_for_investor > backup.sql
# 恢复
psql ai_for_investor < backup.sql
为外键创建索引
为常用查询字段创建索引
复合索引优化多条件查询
使用批量操作
避免循环查询
使用连接查询 (eager loading)
# Redis 缓存回测结果
await cache .set (f"backtest:{ task_id } " , result , ttl = 3600 )