Skip to content

高级自定义运行

run_paper.pyrun_live.py 适合快速启动。需要精细控制行情源、选股器、策略、组合优化、风控、持久化或实盘 broker 时,可以直接组装 trading service。

手动运行模拟盘

下面示例创建两个模拟盘 session:一个使用海龟策略作为基准,一个使用 RSI 策略做对照。MarketDataService 默认使用 TuShare 历史行情,同时会在交易日合并当日行情,并在进入执行层前统一为 trading schema。

from jh_quant.trading import (
MultiSessionService,
PersistenceCoordinator,
SQLiteOrderRecorder,
RSIStrategyConfig,
TurtleStrategyConfig,
build_session_config,
create_market_data_service,
run_trading_app,
)
symbols = ["688256.SH", "688012.SH", "688981.SH", "688041.SH"]
market_data = create_market_data_service(
backend="tushare",
default_symbols=symbols,
)
persistence = PersistenceCoordinator(
recorder=SQLiteOrderRecorder(db_path="trading-paper.db")
)
base_config = (
build_session_config()
.with_session(
execution_mode="paper",
clock_mode="live",
frequency="1d",
price_lookback_days=180,
auto_start=True,
)
.with_selection(name="static", params={"symbols": symbols})
)
turtle_config = (
base_config
.with_session(session_id="paper-turtle")
.with_strategy(name="turtle", alias="turtle", weight=1.0, params=TurtleStrategyConfig())
.build()
)
rsi_config = (
build_session_config()
.with_session(
session_id="paper-rsi",
execution_mode="paper",
clock_mode="live",
frequency="1d",
price_lookback_days=180,
auto_start=True,
)
.with_selection(name="static", params={"symbols": symbols})
.with_strategy(name="rsi", alias="rsi", weight=1.0, params=RSIStrategyConfig())
.build()
)
manager = MultiSessionService(market_data_provider=market_data, persistence=persistence)
manager.create_session(config=turtle_config, initial_capital=100_000)
manager.create_session(config=rsi_config, initial_capital=100_000)
run_trading_app(manager=manager, host="127.0.0.1", port=8000)

启动后访问:

  • http://127.0.0.1:8000/health
  • http://127.0.0.1:8000/sessions
  • http://127.0.0.1:8000/sessions/{session_id}/runtime

关键配置

with_session() 控制运行模式:

  • execution_mode="paper":模拟盘。
  • execution_mode="live":实盘,需要 broker。
  • clock_mode="live":按真实时间运行。
  • clock_mode="backfill":补跑历史窗口,需要 backfill_start
  • frequency:调度频率,例如 "1d"
  • price_lookback_days:策略计算信号需要回看的行情天数。
  • auto_start=True:创建 session 后自动启动调度器。

with_selection() 控制股票池:

.with_selection(
name="static",
params={"symbols": ["688256.SH", "688012.SH"]},
)

with_strategy()add_strategy() 控制策略组合:

config = (
build_session_config()
.with_strategy(name="turtle", weight=0.6, params=TurtleStrategyConfig())
.add_strategy(name="rsi", weight=0.4, params=RSIStrategyConfig())
.build()
)

with_risk_rule()add_risk_rule() 可添加执行前风控:

config = (
build_session_config()
.with_risk_rule(name="max_position_weight", params={"max_weight": 0.2})
.add_risk_rule(name="min_cash_ratio", params={"min_cash_ratio": 0.05})
.build()
)

手动运行实盘

实盘需要显式配置 broker。当前常见场景是 MiniQMT / XtQuant:

from jh_quant.trading import (
MomentumStrategyConfig,
build_session_config,
create_market_data_service,
run_trading_app,
MultiSessionService,
)
symbols = ["688256.SH", "688012.SH", "688981.SH"]
market_data = create_market_data_service(
backend="tushare",
default_symbols=symbols,
)
broker_params = {
"account_id": "YOUR_ACCOUNT_ID",
"account_type": "STOCK",
"path": r"C:\miniQMT\userdata_mini",
}
live_config = (
build_session_config()
.with_session(
session_id="live-momentum",
execution_mode="live",
clock_mode="live",
frequency="1d",
cron_expression="0 14 * * 1-5",
price_lookback_days=240,
auto_start=False,
)
.with_selection(name="static", params={"symbols": symbols})
.with_broker(name="xtquant", params=broker_params, alias="miniqmt-live")
.with_strategy(name="momentum", alias="momentum", weight=1.0, params=MomentumStrategyConfig())
.build()
)
manager = MultiSessionService(market_data_provider=market_data)
manager.create_session(config=live_config, initial_capital=1_000_000)
run_trading_app(manager=manager, host="127.0.0.1", port=8000)

实盘建议先保持 auto_start=False,通过 API 或 Dashboard 检查配置、行情、账户连接后再启动。

Dashboard

bootstrap 模式会在开启 API 后自动调用 display_trading()。手动模式下可以自己启动:

from jh_quant.dashboard import display_trading
display_trading(host="127.0.0.1", port=8000, refresh_interval_ms=15000)

Dashboard 依赖 API 端口,默认连接 http://127.0.0.1:8000