使用非美国(欧洲)日内数据的zipline回测

时间:2014-08-06 16:29:32

标签: hft zipline

我正在努力让zipline与非美国的日内数据一起使用,我已将其加载到pandas DataFrame中:

                        BARC    HSBA     LLOY     STAN
Date                                                  
2014-07-01 08:30:00  321.250  894.55  112.105  1777.25
2014-07-01 08:32:00  321.150  894.70  112.095  1777.00
2014-07-01 08:34:00  321.075  894.80  112.140  1776.50
2014-07-01 08:36:00  321.725  894.80  112.255  1777.00
2014-07-01 08:38:00  321.675  894.70  112.290  1777.00

我已经按照移动平均线教程here,用我自己的符号代码替换“AAPL”,用“1m”数据代替“1d”代替历史调用。

然后我使用algo_obj.run(DataFrameSource(mydf))进行最终通话,其中mydf是上面的数据框。

然而,TradingEnvironment出现了各种各样的问题。根据源代码:

# This module maintains a global variable, environment, which is
# subsequently referenced directly by zipline financial
# components. To set the environment, you can set the property on
# the module directly:
#       from zipline.finance import trading
#       trading.environment = TradingEnvironment()
#
# or if you want to switch the environment for a limited context
# you can use a TradingEnvironment in a with clause:
#       lse = TradingEnvironment(bm_index="^FTSE", exchange_tz="Europe/London")
#       with lse:
# the code here will have lse as the global trading.environment
#           algo.run(start, end)

但是,使用上下文似乎并不完全有效。我仍然会遇到错误,例如说明我的时间戳是在市场开放之前(实际上,看trading.environment.open_and_close时间是针对美国市场的。

我的问题是,有没有人设法使用非美国日内数据的zipline?你能指点我一个资源,理想情况下代码如何做到这一点?

n.b。我已经看到github上有一些似乎与交易日历有关的tests(tradincalendar_lse.py,tradingcalendar_tse.py等) - 但这似乎只处理每日级别的数据。我需要修理:

  • 开放/关闭时间
  • 基准的参考数据
  • 可能更多......

2 个答案:

答案 0 :(得分:6)

在摆弄教程笔记本之后,我已经开始工作了。代码示例如下。如原始问题中所述,它使用DF mid。有几点值得一提:

  1. 交易日历我手动创建一个,并使用 tradingcalendar_lse.py 中的non_working_days分配给trading.environment。或者,您可以创建一个完全符合您数据的数据(但对于样本外数据可能会出现问题)。您需要定义两个字段:trading_daysopen_and_closes

  2. sim_params 默认的开始/结束值存在问题,因为它们无法识别时区。所以你必须创建一个sim_params对象并使用时区传递开始/结束参数。

  3. 此外,必须使用参数overwrite_sim_params = False调用run(),因为calculate_first_open / close会引发时间戳错误。

  4. 我应该提一下,它也可以传递pandas Panel数据,其中minor_axis中的字段为open,high,low,close,price和volume。但在这种情况下,前面的字段是强制性的 - 否则会引发错误。

    请注意,此代码仅生成性能的每日摘要。我确定必须有一种方法可以在一分钟的分辨率下得到结果(我认为这是由emission_rate设定的,但显然它不是)。如果有人知道请评论,我会更新代码。 另外,不确定api的电话是什么叫“分析”#39; (即在IPython中使用%%zipline魔法时,如教程中所述,analyze()方法会自动调用。如何手动执行此操作?)

    import pytz
    from datetime import datetime
    
    from zipline.algorithm import TradingAlgorithm
    from zipline.utils import tradingcalendar
    from zipline.utils import tradingcalendar_lse
    from zipline.finance.trading import TradingEnvironment
    from zipline.api import order_target, record, symbol, history, add_history
    from zipline.finance import trading
    
    def initialize(context):
        # Register 2 histories that track daily prices,
        # one with a 100 window and one with a 300 day window
        add_history(10, '1m', 'price')
        add_history(30, '1m', 'price')
    
        context.i = 0
    
    
    def handle_data(context, data):
        # Skip first 30 mins to get full windows
        context.i += 1
        if context.i < 30:
            return
    
        # Compute averages
        # history() has to be called with the same params
        # from above and returns a pandas dataframe.
        short_mavg = history(10, '1m', 'price').mean()
        long_mavg = history(30, '1m', 'price').mean()
    
        sym = symbol('BARC')
    
        # Trading logic
        if short_mavg[sym] > long_mavg[sym]:
            # order_target orders as many shares as needed to
            # achieve the desired number of shares.
            order_target(sym, 100)
        elif short_mavg[sym] < long_mavg[sym]:
            order_target(sym, 0)
    
        # Save values for later inspection
        record(BARC=data[sym].price,
               short_mavg=short_mavg[sym],
               long_mavg=long_mavg[sym])
    
    def analyze(context,perf) : 
        perf["pnl"].plot(title="Strategy P&L")
    
    # Create algorithm object passing in initialize and
    # handle_data functions
    
    # This is needed to handle the correct calendar. Assume that market data has the right index for tradeable days.
    # Passing in env_trading_calendar=tradingcalendar_lse doesn't appear to work, as it doesn't implement open_and_closes
    from zipline.utils import tradingcalendar_lse
    trading.environment = TradingEnvironment(bm_symbol='^FTSE', exchange_tz='Europe/London')
    #trading.environment.trading_days = mid.index.normalize().unique()
    trading.environment.trading_days = pd.date_range(start=mid.index.normalize()[0],
                                                     end=mid.index.normalize()[-1],
                                                     freq=pd.tseries.offsets.CDay(holidays=tradingcalendar_lse.non_trading_days))
    
    trading.environment.open_and_closes = pd.DataFrame(index=trading.environment.trading_days,columns=["market_open","market_close"])
    trading.environment.open_and_closes.market_open = (trading.environment.open_and_closes.index + pd.to_timedelta(60*7,unit="T")).to_pydatetime()
    trading.environment.open_and_closes.market_close = (trading.environment.open_and_closes.index + pd.to_timedelta(60*15+30,unit="T")).to_pydatetime()
    
    
    from zipline.utils.factory import create_simulation_parameters
    sim_params = create_simulation_parameters(
       start = pd.to_datetime("2014-07-01 08:30:00").tz_localize("Europe/London").tz_convert("UTC"),  #Bug in code doesn't set tz if these are not specified (finance/trading.py:SimulationParameters.calculate_first_open[close])
       end = pd.to_datetime("2014-07-24 16:30:00").tz_localize("Europe/London").tz_convert("UTC"),
       data_frequency = "minute",
       emission_rate = "minute",
       sids = ["BARC"])
    algo_obj = TradingAlgorithm(initialize=initialize, 
                                handle_data=handle_data,
                                sim_params=sim_params)
    
    # Run algorithm
    perf_manual = algo_obj.run(mid,overwrite_sim_params=False) # overwrite == True calls calculate_first_open[close] (see above)
    

答案 1 :(得分:2)

@Luciano

您可以在代码末尾添加analyze(None, perf_manual),以便自动运行分析流程。