Limit Order Book 指値戦略の高速バックテスト (on pybind11)
pip3 install git+https://github.com/Ros522/backtestlob
- 成行のシミュレーション
※現行は引数の注文価格にて常に約定すると判定 - 取引所遅延のシミュレーション https://github.com/Ros522/lazy_backtest_lob
- 取引所APIラッパー
- ビジュアライゼーション(by Python)
- 買い指値に対して、「買い約定履歴 < 指値」 で注文の約定判定を行う
- 売り指値に対して、「売り約定履歴 > 指値」 で注文の約定判定を行う
- 約定したら内部のポジションを更新して、その注文約定の収支、トレード回数返す
- 注文はネットアウト注文として保持する
- 安値、高値入力で約定判定(step)、または1約定履歴流し込み(step_by_tick)
- 成行は試験中
-
OrderType
- OrderType.LIMIT
- OrderType.MARKET
-
Side
- Side.BUY
- Side.SELL
-
BackTestEnv
- size
現在の建玉のサイズを示す - side
現在の建玉が、Side.BUYかSide.SELLかを示す - price
現在の建玉の平均価格を示す
- get_orders
for k, o in env.get_orders().items(): print(f"Order{k}", o.side, o.size, o.price)
- entry
orderid = env.entry(OrderType, Side, size, price)
- cancel
env.cancel(orderid)
- cancel_all
env.cancel_all()
- size
env = BackTestEnv()
# 1枚買い
orderid = env.entry(OrderType.LIMIT, Side.BUY, 1, 500000)
for k, o in env.get_orders().items():
print(f"Order{k}", o.side, o.size, o.price)
# Low,Highで約定判定
profit, trade = env.step(480000, 510000)
# 本stepでの収支0,ポジション買い 1枚 平均単価50万
# profit=0,trade=1
# position=1.0 side=0.0 price=500000.0
self.assertEqual(profit, 0)
self.assertEqual(env.size, 1.0)
self.assertEqual(env.side, Side.BUY)
self.assertEqual(env.price, 500000)
# 1枚売り
orderid = env.entry(OrderType.LIMIT, Side.SELL, 1.5, 520000)
for k, o in env.get_orders().items():
print(f"Order{k}", o.side, o.size, o.price)
# 約定判定
profit, trade = env.step(510000, 530000)
# 本stepでの収支20000,ポジション売り 0.5枚 平均単価52万
# profit=20000,trade=1
# position=0.5 side=1.0 price=520000.0
self.assertEqual(profit, 20000)
self.assertEqual(env.size, 0.5)
self.assertEqual(env.side, Side.SELL)
self.assertEqual(env.price, 520000)