{ "cells": [ { "cell_type": "markdown", "id": "c437407e", "metadata": {}, "source": [ "# Zipline Context 功能介紹" ] }, { "cell_type": "markdown", "id": "7199a965", "metadata": {}, "source": [ "__請於閱讀本文前,預先閱讀 TSMC buy and hold strategy,以了解四大函式 (initialize, handel_data, analyze, run_algorithm) 使用方法。__\n", "\n", "在 Zipline 程式運行中的各種數據,會記錄在context並不斷更新,所以在程式運行中,可以隨時取得即時資訊。下面介紹幾個常用項目:\n", " \n", " context.asset\n", " contexas.account\n", " context.portfolio\n", " context.blotter" ] }, { "cell_type": "markdown", "id": "e8c8d12f", "metadata": {}, "source": [ "# context.asset" ] }, { "cell_type": "markdown", "id": "d3c817a9", "metadata": {}, "source": [ "在 initialize 的階段可以加入\n", "\n", " context.tickers = ['1216', '2330', '2327']\n", " context.asset = [symbol(ticker) for ticker in context.tickers] \n", "\n", "建立一個股票清單:[Equity(2 [1216]), Equity(14 [2330]), Equity(13 [2327])],格式是 list,裡面資料型態是 zipline.asset.Assets,這樣在handle_data 階段就可以用來選取股票。" ] }, { "cell_type": "markdown", "id": "99247186", "metadata": {}, "source": [ "## context.account" ] }, { "cell_type": "markdown", "id": "0e8016a5", "metadata": {}, "source": [ "account 裡面的資訊,大多都是來自 context.portfolio,共計有:\n", " \n", " account.settled_cash = portfolio.cash 帳上現金\n", " account.accrued_interest = 0.0。股票不適用。\n", " account.buying_power = np.inf (無限大)。股票不適用。\n", " account.equity_with_loan = portfolio.portfolio_value 投資組合總市值\n", " account.total_positions_value = portfolio.portfolio_value - portfolio.cash 投資組合總市值 - 現金\n", " account.total_positions_exposure = portfolio.positions_exposure sum(股數 * 當天收盤價),long為正值,short為負值\n", " account.regt_equity = portfolio.cash 現金\n", " account.regt_margin = np.inf (無限大)。股票不適用。\n", " account.initial_margin_requirement = 0.0 必須保證金。股票不適用。\n", " account.maintenance_margin_requirement = 0.0 維持保證金。股票不適用。\n", " account.available_funds = portfolio.cash 現金\n", " account.excess_liquidity = portfolio.cash 現金\n", " account.cushion = portfolio.cash / portfolio.portfolio_value 現金 / 投資組合總市值,後者如果是 0 則回傳 np.inf (無限大)\n", " account.day_trades_remaining = 剩餘交易日,預設np.inf (無限大)。股票不適用。\n", " account.net_liquidation = portfolio.portfolio_value\n", " account.gross_leverage = gross_exposure / portfolio_value 後者如果是 0 則回傳 np.inf (無限大)\n", " account.net_leverage = net_exposure / portfolio_value 後者如果是 0 則回傳 np.inf (無限大)\n", " account.leverage = account.gross_leverage\n", " \n", "gross_exposure算法:sum(股數 * 當天收盤價)。其中,股數不管是long或short都是正值\n", "\n", "net_exposure算法:sum(股數 * 當天收盤價)。其中,股數long為正,short為負" ] }, { "cell_type": "markdown", "id": "26b7b427", "metadata": {}, "source": [ "## context.portfolio" ] }, { "cell_type": "markdown", "id": "029ab99a", "metadata": {}, "source": [ "portfolio裡面的資訊,有一些也同時出現在回測產出的資料中,但是有些計算方式不太一樣\n", " \n", " cash_flow:從開始日到當天的累計現金流,流入正流出負\n", " starting_cash:起始資金,不是當天開始時的現金\n", " portfolio_value:positions_value + cash 投資組合總市值\n", " pnl:累計的pnl,為 portfolio_value - 起始資金\n", " returns:累計return,( 1 + 每日 pnl / 每日起始 portfolio_value) 的乘積 - 1\n", " cash:回測資料中的 ending_cash\n", " positions:帳上的股票部位\n", " start_date:整個測試的開始日\n", " positions_value:跟 net_exposure 算法一樣,sum(股數 * 當天收盤價)。其中,股數long為正,short為負\n", " positions_exposure:買賣股票時 value = exposure,跟上面一樣 參考~\\zipline\\finance\\_finance_ext.pyx\n", " \n", "context.portfolio.positions 回傳內容範例:\n", "\n", "{Equity(0 [1101]): Position({'asset': Equity(0 [1101]), 'amount': 1000, 'cost_basis': 45.56483750129291, 'last_sale_price': 45.1, 'last_sale_date': Timestamp('2018-07-25 05:30:00+0000', tz='UTC')}), Equity(14 [2330]): Position({'asset': Equity(14 [2330]), 'amount': -1000, 'cost_basis': 240.65657496810346, 'last_sale_price': 240.5, 'last_sale_date': Timestamp('2018-07-25 05:30:00+0000', tz='UTC')})}" ] }, { "cell_type": "markdown", "id": "0daed4b4", "metadata": {}, "source": [ "## context.blotter" ] }, { "cell_type": "markdown", "id": "237579c6", "metadata": {}, "source": [ "blotter主要紀錄訂單相關的資訊\n", "\n", "1. slippage_models 紀錄這次模擬時,股票和期貨所用的slippage model,範例:\n", "\n", " {: VolumeShareSlippage(\n", " volume_limit=0.025,\n", " price_impact=0.1), : VolatilityVolumeShare(volume_limit=0.05, eta=)}\n", "\n", " \n", "2. commissions_models 概念相同,範例:\n", "\n", " {: PerDollar(cost_per_dollar=0.001425), : \n", " PerContract(cost_per_contract=0.85, exchange_fee=, min_trade_cost=0)}\n", "\n", " \n", "3. open_orders:回傳字典,key是asset (例如 symbol('2327')),對應list,list裡面是該股票的open orders:\n", " \n", " Order({'id': 'c201d801586349febfd88f3b97b35738', 'dt': Timestamp('2022-10-20 05:30:00+0000', tz='UTC'), 'reason': None, \n", " 'created': Timestamp('2022-10-20 05:30:00+0000', tz='UTC'), 'amount': 1000, 'filled': 0, 'commission': 0, 'stop': None, \n", " 'limit': None, 'stop_reached': False, 'limit_reached': False, 'sid': Equity(11 [2327]), 'status': })\n", " \n", "\n", "4. orders:目前為止所有的訂單,包括open, canceled, filled,回傳格式是字典,key是order id,對應的是和上面一樣的 \n", "\n", "\n", "5. new_orders:當天創立的訂單,回傳一個清單,裡面物件和上面一樣,\n", "\n", "\n", "6. current_dt: 當日日期" ] }, { "cell_type": "markdown", "id": "431a09c5", "metadata": {}, "source": [ "## context.sim_params" ] }, { "cell_type": "markdown", "id": "9538d252", "metadata": {}, "source": [ "sim_params紀錄各種模擬的參數,範例:\n", "\n", " SimulationParameters(\n", " start_session=2022-12-05 00:00:00+00:00,\n", " end_session=2022-12-23 00:00:00+00:00,\n", " capital_base=1000000.0,\n", " data_frequency=daily,\n", " emission_rate=daily,\n", " first_open=2022-12-05 01:01:00+00:00,\n", " last_close=2022-12-23 05:30:00+00:00,\n", " trading_calendar=\n", " )\n", "\n", "1. start_session:開始日,UTC午夜時間\n", "2. end_session:結束日,UTC午夜時間\n", "3. capital_base:起始資金\n", "4. data_frequency:資料頻率,目前僅支援日頻率\n", "5. emission_rate:計算頻率,也是每日\n", "6. first_open:第一個開始交易時間\n", "7. last_close:最後一個收盤時間\n", "8. trading_calendar:使用的交易日曆(TEJ_XTAI)" ] }, { "cell_type": "code", "execution_count": null, "id": "26ee15ae", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:zipline-tej] *", "language": "python", "name": "conda-env-zipline-tej-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.13" } }, "nbformat": 4, "nbformat_minor": 5 }