예제 #1
0
    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)
예제 #2
0
    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]
예제 #3
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'))
예제 #4
0
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)
예제 #5
0
            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")
예제 #6
0
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()
예제 #7
0
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")