def do_initialize(self, engine: Engine): engine.register_event( EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketOpen()), self.market_open) engine.register_event( EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketClose(offset=-1)), self.market_close)
def do_initialize(self, engine: Engine, data_portal: DataPortal): if engine.is_backtest: market_close = EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketClose()) market_open = EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketOpen()) else: market_open = EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketOpen(second_offset=5)) market_close = EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketClose(second_offset=-60)) market_close_set_price = EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketClose()) engine.register_event(market_close_set_price, self.set_close_price) engine.register_event(market_open, self.market_open) engine.register_event(market_close, self.market_close) # 初始化昨日开盘价和收盘价 self.last_open = None self.last_close = None if not engine.is_backtest: command = HistoryDataQueryCommand(None, None, self.scope.codes, window=1) command.with_calendar(trading_calendar=self.scope.trading_calendar) df = data_portal.history_data("ibAdjustedDailyBar", command) if len(df) >= 1: self.last_open = df.iloc[-1]['open'] self.last_close = df.iloc[-1]['close'] logging.info("初始化数据成功,昨日开盘价:{}, 昨日收盘价:{}, bar的开始时间:{}" .format(self.last_open, self.last_close, df.iloc[-1]['start_time'])) else: raise RuntimeError("没有获取到昨日开盘价和收盘价") # self.last_open = 35.17 # self.last_close = 33.77 if len(self.scope.codes) != 1: raise RuntimeError("wrong codes") self.code = self.scope.codes[0]
def do_initialize(self, engine: Engine, data_portal: DataPortal): if engine.is_backtest: raise RuntimeError("不支持回测") engine.register_event(EventDefinition(ed_type=EventDefinitionType.DATA, ts_type_name='ibTick', event_data_type=EventDataType.TICK), self.on_tick) engine.register_event(event_definition=EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketOpen()), callback=self.market_open) engine.register_event( event_definition=EventDefinition(ed_type=EventDefinitionType.TIME, time_rule=MarketOpen()), callback=self.market_close) self.daily_ticks: DataFrame = DataFrame() self.time_span = Timedelta(minutes=1) self.threshold = 0.005 self.code = self.scope.codes[0] self.market_is_open = self.scope.trading_calendar.is_open_on_minute(Timestamp.now(tz='Asia/Shanghai'))
from trading_calendars import get_calendar from se import config, BeanContainer, AccountRepo from se.domain2.engine.engine import Engine, Scope from se.infras.td import TDAccount from st import SPCEStrategy engine = Engine() scope = Scope(["SPCE_STK_USD_SMART"], trading_calendar=get_calendar("NYSE")) strategy = SPCEStrategy(scope) account_name = "td_local_spce" repo: AccountRepo = BeanContainer.getBean(AccountRepo) acc: TDAccount = repo.find_one(account_name) if not acc: acc = TDAccount(account_name, 100) acc.with_order_callback(strategy).with_client( config.get("td_account", "client_id"), config.get("td_account", 'redirect_url'), config.get("td_account", 'credentials_path'), config.get("td_account", 'account_id')) acc.start_save_thread() engine.run(strategy, acc)
buy_order = LimitOrder(self.code, OrderDirection.BUY, dest_quantity - hold_quantity, current_time, down_price) account.place_order(buy_order) def __init__(self, scope: Scope, n=5, p=0.02): super().__init__(scope) self.n = n self.p = p self.code = scope.codes[0] # from trading_calendars import get_calendar # scope = Scope(codes=['CCL_STK_USD_SMART'], trading_calendar=get_calendar("NYSE")) # start = Timestamp("2020-01-01", tz='Asia/Shanghai') # end = Timestamp("2020-01-30", tz='Asia/Shanghai') # Engine().run_backtest(TestStrategy1(scope), start, end, 10000, "test3") if __name__ == "__main__": # 计算策略的回报序列 from trading_calendars import get_calendar import pandas as pd calendar = get_calendar("NYSE") engine = Engine() scope = Scope(['CCL_STK_USD_SMART'], calendar) st = TestStrategy1(scope, n=5, p=0.01) start = pd.Timestamp("2020-01-01", tz='Asia/Shanghai') end = pd.Timestamp("2020-01-30", tz='Asia/Shanghai') result = engine.run_backtest(st, start, end, 10000, "test16") print("done")
import os os.environ[ 'config.dir'] = "/Users/zhang/PycharmProjects/strategy_engine_v2/interface" # 如果没有日志目录的话,则创建 if not os.path.exists("log"): os.makedirs("log") from se import BeanContainer, AccountRepo from se.domain2.account.account import AbstractAccount import pandas as pd from trading_calendars import get_calendar from se.domain2.engine.engine import Engine, Scope from strategies.strategy import TestStrategy2 engine = Engine() scope = Scope(["SPCE_STK_USD_SMART"], trading_calendar=get_calendar("NYSE")) strategy = TestStrategy2(scope) # 回测 start = pd.Timestamp("2021-02-01", tz='Asia/Shanghai') end = pd.Timestamp("2021-02-18", tz='Asia/Shanghai') result = engine.run_backtest(strategy, start, end, 10000, "test60", "ibAdjustedDailyBar") print("done") # 查看结果 # repo: AccountRepo = BeanContainer.getBean(AccountRepo) # account: AbstractAccount = repo.find_one("test56") # s = pd.Series(account.history_net_value) # s.plot()
from configparser import ConfigParser from pandas._libs.tslibs.timestamps import Timestamp from trading_calendars import get_calendar from se.domain2.engine.engine import Engine, Scope, EventDefinition, MarketOpen, \ MarketClose, Event from se.infras.ib import IBAccount from se.strategies.strategy import TestStrategy2 import pandas as pd engine = Engine() scope = Scope(["SPCE_STK_USD_SMART"], trading_calendar=get_calendar("NYSE")) strategy = TestStrategy2(scope) # 初始化配置 config_file_name = 'config.ini' config = ConfigParser() config.read(config_file_name) # 回测 start = pd.Timestamp("2020-01-01", tz='Asia/Shanghai') end = pd.Timestamp("2020-12-01", tz='Asia/Shanghai') result = engine.run_backtest(strategy, start, end, 10000, "test55") print("done") # 实盘测试 # acc = IBAccount("ib_test1", 10000) # # # acc_repo: AccountRepo = BeanContainer.getBean(AccountRepo) # # acc = acc_repo.find_one("ib_test1")