1. 市场表格与 on_tick 钩子
不是你去拨时钟。框架按每个模拟 tick 循环,并调用你的函数一次,传入当前上市公司快照和你的账户状态。
前几关不需要计算机背景:多数解法就是几行 if market.tick == …。而且起始代码往往已经写好,只是有小错误(买错代码、卖错时刻)——找到并改对即可。
钩子约定
def on_tick(market_data, user_data):
...
| 参数 | 含义 |
|---|---|
market_data | 类似 DataFrame 的表:本 tick 每一家公司一行 |
user_data | 你的账户字典:cash、positions、equity、history、tick、dividends_received 等 |
全局对象 market 已经注入。用它来查询和交易(不要自己写时间循环)。
market_data 列
| 列名 | 含义 |
|---|---|
company_name | 公司名称 |
industry | 行业(如 Metals、Energy、ETF、Income) |
market_cap | 市值(早期关卡可为固定) |
ticker_price | 本 tick 成交价 |
ticker | 传给 market.buy / market.sell 的代码 |
dividend_per_tick | 每持有 1 股、每个 on_tick 后发的现金股息(玩具模型,常为 0) |
description | 简短说明 |
后期规则关才需要像 pandas 一样遍历:
for _, row in market_data.iterrows():
ticker = row["ticker"]
price = float(row["ticker_price"])
user_data 键
| 键 | 含义 |
|---|---|
cash | 可用现金(实时——买卖与分红都会更新) |
positions | {ticker: qty} 持仓 |
equity | 与 market.total_equity() 相同 — 现金 + 股票市值 |
stock_value | 仅持仓市值 |
history | 成交、分红、ETF 定义记录 |
tick | 当前 tick(与 market.tick 相同) |
dividends_received | 累计已收股息 |
etfs | 已知 ETF 配方 |
user_data 是实时视图:user_data["cash"] 始终读当前 market.cash。
财富方法
market.cash # 实时现金
market.stock_value() # 持仓市值合计
market.total_equity() # 现金 + 持仓市值(= market.equity())
user_data["equity"] # 与 total_equity() 相同