feat: add durable WorldQuant backtests with UI and AI confirmation

This commit is contained in:
yuxuanhui
2026-09-08 10:06:00 +08:00
parent 404a4d8a04
commit a4b93200c5
34 changed files with 4437 additions and 23 deletions
@@ -0,0 +1,186 @@
"""durable worldquant backtests"""
import sqlalchemy as sa
from alembic import op
revision = "0003"
down_revision = "0002"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"backtest_config",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("concurrency", sa.Integer(), nullable=False),
sa.Column("batch_size", sa.Integer(), nullable=False),
sa.Column("version", sa.Integer(), nullable=False),
sa.Column("blocked_reason", sa.Text(), nullable=True),
sa.Column("blocked_until", sa.DateTime(timezone=True), nullable=True),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"backtest_drafts",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("version", sa.Integer(), nullable=False),
sa.Column("name", sa.String(length=200), nullable=False),
sa.Column("source", sa.JSON(), nullable=False),
sa.Column("candidates", sa.JSON(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"backtest_previews",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("version", sa.Integer(), nullable=False),
sa.Column("name", sa.String(length=200), nullable=False),
sa.Column("source", sa.JSON(), nullable=False),
sa.Column("candidates", sa.JSON(), nullable=False),
sa.Column("batches", sa.JSON(), nullable=False),
sa.Column("batch_size", sa.Integer(), nullable=False),
sa.Column("digest", sa.String(length=64), nullable=False),
sa.Column("duplicates", sa.JSON(), nullable=False),
sa.Column("ai_context", sa.JSON(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"backtest_runs",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("preview_id", sa.String(length=36), nullable=False),
sa.Column("idempotency_key", sa.String(length=100), nullable=False),
sa.Column("name", sa.String(length=200), nullable=False),
sa.Column("source", sa.JSON(), nullable=False),
sa.Column("ai_context", sa.JSON(), nullable=False),
sa.Column("control", sa.String(length=20), nullable=False),
sa.Column("status", sa.String(length=30), nullable=False),
sa.Column("version", sa.Integer(), nullable=False),
sa.Column("event_seq", sa.Integer(), nullable=False),
sa.Column("total", sa.Integer(), nullable=False),
sa.Column("batch_size", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["preview_id"],
["backtest_previews.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("idempotency_key"),
sa.UniqueConstraint("preview_id"),
)
op.create_index(op.f("ix_backtest_runs_status"), "backtest_runs", ["status"], unique=False)
op.create_table(
"backtest_events",
sa.Column("run_id", sa.String(length=36), nullable=False),
sa.Column("seq", sa.Integer(), nullable=False),
sa.Column("kind", sa.String(length=50), nullable=False),
sa.Column("payload", sa.JSON(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["run_id"],
["backtest_runs.id"],
),
sa.PrimaryKeyConstraint("run_id", "seq"),
)
op.create_table(
"simulation_attempts",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("run_id", sa.String(length=36), nullable=False),
sa.Column("ordinal", sa.Integer(), nullable=False),
sa.Column("state", sa.String(length=30), nullable=False),
sa.Column("payload", sa.JSON(), nullable=False),
sa.Column("progress_url", sa.Text(), nullable=True),
sa.Column("remote_complete", sa.Boolean(), nullable=False),
sa.Column("children", sa.JSON(), nullable=False),
sa.Column("receipts", sa.JSON(), nullable=False),
sa.Column("poll_count", sa.Integer(), nullable=False),
sa.Column("submit_count", sa.Integer(), nullable=False),
sa.Column("next_poll_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("error", sa.Text(), nullable=True),
sa.Column("error_code", sa.String(length=50), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["run_id"],
["backtest_runs.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("run_id", "ordinal"),
)
op.create_index(op.f("ix_simulation_attempts_run_id"), "simulation_attempts", ["run_id"], unique=False)
op.create_index(op.f("ix_simulation_attempts_state"), "simulation_attempts", ["state"], unique=False)
op.create_table(
"backtest_items",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("run_id", sa.String(length=36), nullable=False),
sa.Column("attempt_id", sa.String(length=36), nullable=False),
sa.Column("client_item_id", sa.String(length=100), nullable=False),
sa.Column("ordinal", sa.Integer(), nullable=False),
sa.Column("expression", sa.Text(), nullable=False),
sa.Column("settings", sa.JSON(), nullable=False),
sa.Column("fingerprint", sa.String(length=64), nullable=False),
sa.Column("platform_status", sa.String(length=30), nullable=False),
sa.Column("collection_status", sa.String(length=30), nullable=False),
sa.Column("persistence_status", sa.String(length=30), nullable=False),
sa.Column("simulation_id", sa.String(length=100), nullable=True),
sa.Column("alpha_id", sa.String(length=100), nullable=True),
sa.Column("error", sa.Text(), nullable=True),
sa.ForeignKeyConstraint(
["attempt_id"],
["simulation_attempts.id"],
),
sa.ForeignKeyConstraint(
["run_id"],
["backtest_runs.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("run_id", "client_item_id"),
)
op.create_index(op.f("ix_backtest_items_attempt_id"), "backtest_items", ["attempt_id"], unique=False)
op.create_index(op.f("ix_backtest_items_fingerprint"), "backtest_items", ["fingerprint"], unique=False)
op.create_index(op.f("ix_backtest_items_run_id"), "backtest_items", ["run_id"], unique=False)
op.create_table(
"backtest_results",
sa.Column("item_id", sa.String(length=36), nullable=False),
sa.Column("attempt_id", sa.String(length=36), nullable=False),
sa.Column("alpha_id", sa.String(length=100), nullable=False),
sa.Column("snapshot", sa.JSON(), nullable=False),
sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("complete", sa.Boolean(), nullable=False),
sa.ForeignKeyConstraint(
["alpha_id"],
["alphas.id"],
),
sa.ForeignKeyConstraint(
["attempt_id"],
["simulation_attempts.id"],
),
sa.ForeignKeyConstraint(
["item_id"],
["backtest_items.id"],
),
sa.PrimaryKeyConstraint("item_id"),
)
op.create_index(op.f("ix_backtest_results_alpha_id"), "backtest_results", ["alpha_id"], unique=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_backtest_results_alpha_id"), table_name="backtest_results")
op.drop_table("backtest_results")
op.drop_index(op.f("ix_backtest_items_run_id"), table_name="backtest_items")
op.drop_index(op.f("ix_backtest_items_fingerprint"), table_name="backtest_items")
op.drop_index(op.f("ix_backtest_items_attempt_id"), table_name="backtest_items")
op.drop_table("backtest_items")
op.drop_index(op.f("ix_simulation_attempts_state"), table_name="simulation_attempts")
op.drop_index(op.f("ix_simulation_attempts_run_id"), table_name="simulation_attempts")
op.drop_table("simulation_attempts")
op.drop_table("backtest_events")
op.drop_index(op.f("ix_backtest_runs_status"), table_name="backtest_runs")
op.drop_table("backtest_runs")
op.drop_table("backtest_previews")
op.drop_table("backtest_drafts")
op.drop_table("backtest_config")
# ### end Alembic commands ###