feat: add durable WorldQuant backtests with UI and AI confirmation
This commit is contained in:
@@ -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 ###
|
||||
Reference in New Issue
Block a user