官术网_书友最值得收藏!

3.9 賬戶相關屬性

3.9.1 下單函數

1.order

order表示可以對股票、期貨、指數策略進行下單操作。根據指定的參數,進行策略訂單委托下單指定股數。訂單類型支持市價單或限價單,限價單需設置order_type為’limit',并設置下單價格。示例代碼如下:

        stock_account.order(symbol, amount)            # 股票賬戶下單指定股數
        futures_account.order(symbol, amount, 'open')  # 期貨賬戶委托開倉指定份數
        otc_fund_account.order(symbol, amount)         # 場外賬戶申購指定份數基金
        index_account.order(symbol, amount, 'open')    # 指數賬戶委托開倉指定份數

參數說明如下。

· symbol:需要交易的證券代碼。

參數類型:str。

· amount:需要交易的證券數量,正數表示買入,負數表示賣出。

參數類型:int。

· price:定義下限價單時指定的下單價格,僅用于分鐘線策略。

參數類型:float。

· order_type:下單類型。包括兩個值,即’market’表示市價單,'limit’表示限價單。其中限價單僅用于分鐘線策略,日線策略下單時可以省略order_type參數。

參數類型:str。

· offset_flag:期貨開平倉方向,僅用于期貨策略。包括兩個值,即’open’表示開倉,'close'表示平倉。

參數類型:str。

返回策略訂單的ID,這個ID全局唯一,且包含了時間順序。

例如,采用日線策略下單,每個交易日買入上證50成分股各100股,代碼如下:

        start = '2019-01-01'                    # 回測起始時間
        end = '2019-03-01'                      # 回測結束時間
        universe = DynamicUniverse('SH50')      # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                     # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                        # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):                # 初始化策略運行環境
            pass
        def handle_data(context):              # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=True)
            for stk in current_universe:
              stock_account.order(stk, 100)

期貨日線策略下單的示例代碼如下:

        start = '2018-01-01'                    # 回測起始時間
        end = '2019-01-01'                      # 回測結束時間
        universe = ['CUM0', 'IFM0']             # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                     # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                        # 執行handle_data的時間間隔
        accounts = {
            'futures_account': AccountConfig(account_type='futures', capital_base=
    10000000)
        }
        def initialize(context):                # 初始化策略運行環境
            pass
        def handle_data(context):               # 核心策略邏輯
            futures_account = context.get_account('futures_account')
            current_futures = context.get_universe('futures')
            for symbol in current_futures:
              futures_contract = context.get_symbol(symbol)
              futures_account.order(futures_contract, 1, 'open')

期貨分鐘線策略下單的示例代碼如下:

        import numpy as np
        import pandas as pd
        import talib as ta
        universe = ['RBM0']                     # 策略期貨合約
        start = '2018-01-01'                    # 回測起始時間
        end = '2019-02-01'                      # 回測結束時間
        refresh_rate = 5                        # 調倉周期
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'm'
        max_history_window = (150, 200)
        lfast = 5                               # 入場短均線窗口
        lslow = 20                              # 入場長均線窗口
        sfast = 3                               # 出場短均線窗口
        sslow = 10                              # 出場長均線窗口
        accounts   =   {'futures_account':   AccountConfig(account_type='futures',
    capital_base=1000000)}
        # 初始化虛擬期貨賬戶,一般用于設置計數器、回測輔助變量等
        def initialize(context):
            context.current_bar = 0
            context.symbol = 'RB1605'
        # 回測調倉邏輯,每個調倉周期運行一次,可在此函數內實現信號生產,生成調倉指令
        def handle_data(context):
            futures_account = context.get_account('futures_account')
            symbol = context.get_symbol(universe[0])
            long_position = futures_account.get_positions().get(symbol,
    dict()).get('long_amount', 0)
            if context.mapping_changed(universe[0]):
              symbol_before, symbol_after = context.get_rolling_tuple
    (universe[0])
              if futures_account.get_position(symbol_before):
                  futures_account.switch_position(symbol_before, symbol_after)
            else:
              data = context.history(symbol=symbol, attribute=['closePrice',
    'openPrice', 'lowPrice', 'highPrice'], time_range=20, freq='60m')
              high_price = np.array(data[symbol]['highPrice'], dtype=float)
              low_price = np.array(data[symbol]['lowPrice'], dtype=float)
              open_price = np.array(data[symbol]['openPrice'], dtype=float)
              close_price = np.array(data[symbol]['closePrice'], dtype=float)
              malfast = ta.MA(close_price, lfast)
              malslow = ta.MA(close_price, lslow)
              masfast = ta.MA(close_price, sfast)
              masslow = ta.MA(close_price, sslow)
              if long_position == 0:
                  if malfast[-1] > malslow[-1] and masfast[-1] > masslow[-1] and
    high_price[-1] > high_price[-2]:
                      ids = futures_account.order(symbol, 10, 'open')
              if long_position ! = 0:
                  if masfast[-1] < masslow[-1]:
                      futures_account.order(symbol, -long_position, 'close')
              context.current_bar += 1

2.order_to

order_to僅用于股票策略,根據指定的參數進行策略訂單委托下單,將股票倉位調整到指定股數。每次調用handle_data,最多只允許調用一次order_to函數,否則可能會造成下單量計算錯誤。示例代碼如下:

        stock_account.order_to(symbol, amount)  # 股票策略下單到指定股數

參數說明如下。

· symbol:需要交易的證券代碼。

參數類型:str。

· amount:調倉后需要達到的目標股數,需要是100的正整數倍或0。

參數類型:int。

· price:定義下限價單時指定的下單價格,僅用于分鐘線策略。

參數類型:float。

· order_type:下單類型。包括兩個值,即’market’表示市價單,'limit’表示限價單。其中限價單僅用于分鐘線策略,日線策略下單時可以省略order_type參數。

參數類型:str。

返回訂單的ID,這個ID全局唯一,且包含了時間順序。

例如,初始持倉1000股浦發銀行,目標持倉100股浦發銀行的代碼如下:

        start = '2019-01-01'                # 回測起始時間
        end = '2019-01-05'                  # 回測結束時間
        universe = ['600000.XSHG']          # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                 # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                    # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000, position_base = {'600000.XSHG':1000}, cost_base = {'600000.
    XSHG':10.05})
        }
        def initialize(context):            # 初始化策略運行環境
            pass
        def handle_data(context):           # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=True)
            for stk in current_universe:
              stock_account.order_to(stk, 100)
            print stock_account.get_orders()

查看下單明細:

        [Order(order_id: 2019-01-02-0000001, order_time: 2019-01-02 09:30, symbol:
    600000.XSHG, direction: -1, order_amount: 900, state: ORDER_SUBMITTED,
    filled_time: , filled_amount: 0, transact_price: 0.0000, slippage: 0.0000,
    commission: 0.0000)]

3.order_pct

order_pct僅用于股票策略,根據當前賬戶總資產,進行策略訂單委托下單到指定百分比的股票倉位。示例代碼如下:

        stock_account.order_pct(symbol, pct)  # 股票策略下單指定百分比

例如,1000000元總資產(含股票和現金),下單20%,表示下單1000000元總資產的20%。

參數說明如下。

· symbol:需要交易的證券代碼,必須包含后綴,其中上證證券的后綴為.XSHG,深證證券的后綴為.XSHE。

參數類型:str。

· pct:每次下單的交易額占總資產的百分比,取值范圍為-1~1,負值代表賣出,正值代表買入。

參數類型:float。

返回訂單的ID,這個ID全局唯一,且包含了時間順序。

示例代碼如下:

        start = '2019-01-01'                    # 回測起始時間
        end = '2019-06-01'                      # 回測結束時間
        universe = DynamicUniverse('SH50')      # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                     # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                        # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):                # 初始化策略運行環境
            pass
        def handle_data(context):               # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=True)
            for stk in current_universe:
              stock_account.order_pct(stk, 0.1)

4.order_pct_to

order_pct_to僅用于股票策略,根據當前賬戶總資產,進行策略訂單委托下單到指定目標百分比的股票倉位,示例代碼如下:

        stock_account.order_pct_to(symbol, pct)  # 股票策略下單到指定百分比

例如,1000000元總資產(含股票和現金),下單到20%,系統會根據持倉自動進行計算并下單。

參數說明如下。

· symbol:需要交易的證券代碼,必須包含后綴,其中上證證券的后綴為.XSHG,深證證券的后綴為.XSHE。

參數類型:str。

· pct:交易下單后證券持倉占賬戶總資產的目標百分比,范圍為0~1。

參數類型:float。

返回訂單的ID,這個ID全局唯一,且包含了時間順序。

示例代碼如下:

        start = '2019-01-01'                    # 回測起始時間
        end = '2019-06-01'                      # 回測結束時間
        universe = DynamicUniverse('SH50')      # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                     # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                        # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):                # 初始化策略運行環境
            pass
        def handle_data(context):               # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=True)
            for stk in current_universe:
              stock_account.order_pct_to(stk, 0.1)

5.close_all_positions

close_all_positions表示賣出當前所有持倉,期貨平倉時包含多頭持倉和空頭持倉,示例代碼如下:

        close_all_positions(symbol)

參數說明如下。

· symbol:需要全部賣出的證券代碼,必須包含后綴,其中上證證券的后綴為.XSHG,深證證券的后綴為.XSHE,如果該參數為空,表示清倉。

參數類型:str或list。

返回order_id,這個ID全局唯一,且包含了時間順序。

示例代碼如下:

        # 平掉所有持倉
        account.close_all_positions()
        # 平掉指定標的持倉
        account.close_all_positions('IF1601')

6.cancel_order

cancel_order表示根據訂單ID,撤銷未成交或部分成交的訂單,示例代碼如下:

        cancel_order(order_id)

參數:order_id,訂單的唯一指定ID。

返回布爾值,表示是否成功發出撤單指令。

示例代碼如下:

        start = '2019-01-01'                # 回測起始時間
        end = '2019-01-07'                  # 回測結束時間
        benchmark = 'HS300'                 # 策略參考基準
        universe = ['000001.XSHE']          # 證券池,支持股票和基金
        capital_base = 10000000             # 起始資金
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'm'
        # 調倉頻率,表示執行handle_data的時間間隔,若freq = 'd’則表示時間間隔的單位為交易
    日,若freq = 'm’則表示時間間隔為分鐘
        refresh_rate = (2, 1)
        def initialize(account):
            stock_account.record_orders = []
        def handle_data(account):
            if stock_account.universe:
              if '13:14' == stock_account.current_minute:
                  del stock_account.record_orders[:]
                  for stk in stock_account.universe:
                      price = stock_account.referencePrice[stk] * 0.99
                      order_id = order(stk, 500, price=price, otype='limit')
                      stock_account.record_orders.append(order_id)
              elif '13:15' == stock_account.current_minute:
                  for order_id in stock_account.record_orders:
                    _order = get_order(order_id)
                    assert _order.state == OrderState.OPEN
        #               assert _order.state=="ToFill"
                    success = cancel_order(order_id)
              elif '13:16' == stock_account.current_minute:
        #           print stock_account.blotter[0].state
                  assert stock_account.blotter[0].state == OrderState.CANCELED
                  assert stock_account.cash == 10000000

3.9.2 獲取賬戶信息

1.get_order

get_order表示根據訂單ID獲取已委托的訂單對象,示例代碼如下:

        account.get_order(order_id)

參數為order_id:訂單的唯一指定ID。在調用下單函數時生成,可以由FuturesOrder. order_id屬性獲得。

參數類型:str。

返回order_id對應的對象。

不同資產對象支持的參數如表3-17所示。

表3-17

訂單狀態及其描述如表3-18所示。

表3-18

示例代碼如下:

        start = '2019-01-01'                    # 回測起始時間
        end = '2019-01-05'                      # 回測結束時間
        universe = DynamicUniverse('SH50')      # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                     # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                        # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):       # 初始化策略運行環境
            pass
        def handle_data(context):      # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=True)
            for stk in current_universe:
              order_id = stock_account.order(stk, 100)
              print stock_account.get_order(order_id)

部分輸出結果如下:

        Order(order_id: 2019-01-02-0000050, order_time: 2019-01-02 09:30, symbol:
        Order(order_id: 2019-01-02-0000051, order_time: 2019-01-02 09:30, symbol:
        Order(order_id: 2019-01-02-0000052, order_time: 2019-01-02 09:30, symbol:
        Order(order_id: 2019-01-02-0000053, order_time: 2019-01-02 09:30, symbol:
        Order(order_id: 2019-01-02-0000054, order_time: 2019-01-02 09:30, symbol:
        Order(order_id: 2019-01-02-0000055, order_time: 2019-01-02 09:30, symbol:

2.get_orders

get_orders用于獲取滿足條件的一系列訂單實例,示例代碼如下:

        account.get_orders(state, symbol)

參數說明如下。

· state:所需訂單的狀態。

參數類型:str。

· symbol:所需訂單的證券限制,即定義之后只會返回symbol范圍內的證券的訂單,可以為字符串或列表,如’000001.XSHE’或['000001.XSHE', '600000.XSHG'];還可以設置為空,代表所有證券。

參數類型:str或list。

返回滿足條件的訂單列表。

示例代碼如下:

        start = '2019-01-01'                    # 回測起始時間
        end = '2019-01-05'                      # 回測結束時間
        universe = DynamicUniverse('SH50')      # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                     # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1            # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):   # 初始化策略運行環境
            pass
        def handle_data(context):  # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=True)
            for stk in current_universe:
              order_id = stock_account.order(stk, 100)
              print stock_account.get_orders()

3.get_position

get_position用于獲取指定資產的持倉情況,示例代碼如下:

        account.get_position(symbol)

參數:symbol,表示資產ID。

參數類型:str。

返回指定資產的持倉信息。

不同資產對象支持的參數如表3-19所示。

表3-19

示例代碼如下:

        start = '2018-01-01'                        # 回測起始時間
        end = '2019-01-01'                          # 回測結束時間
        universe = ['000001.XSHE', '601318.XSHG']   # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                         # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                            # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):                    # 初始化策略運行環境
            pass
        def handle_data(context):                   # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=False)
            for stk in universe:
              stock_account.order(stk, 100)
            print stock_account.get_position('601318.XSHG')

輸出的部分結果如下:

        Position(symbol: 601318.XSHG, amount: 100, available_amount: 100 ...)
        Position(symbol: 601318.XSHG, amount: 200, available_amount: 200 ...)
        Position(symbol: 601318.XSHG, amount: 300, available_amount: 300 ...)
        Position(symbol: 601318.XSHG, amount: 400, available_amount: 400 ...)
        Position(symbol: 601318.XSHG, amount: 500, available_amount: 500 ...)
        Position(symbol: 601318.XSHG, amount: 600, available_amount: 600 ...)

4.get_positions

get_positions用于獲取所有賬戶持倉,示例代碼如下:

        account.get_positions(exclude_halt=False)

參數為exclude_halt:是否移除持倉中停牌的資產。

返回類型:dict。key為證券代碼,value為持倉對象。

示例代碼如下:

        start = '2018-01-01'                        # 回測起始時間
        end = '2019-01-01'                          # 回測結束時間
        universe = ['000001.XSHE', '601318.XSHG']   # 證券池,支持股票、基金、期貨
        benchmark = 'HS300'                         # 策略參考基準
        # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測
        freq = 'd'
        refresh_rate = 1                            # 執行handle_data的時間間隔
        accounts = {
            'stock_account': AccountConfig(account_type='security', capital_base=
    10000000)
        }
        def initialize(context):                    # 初始化策略運行環境
            pass
        def handle_data(context):                   # 核心策略邏輯
            stock_account = context.get_account('stock_account')
            current_universe = context.get_universe('stock', exclude_halt=False)
            for stk in universe:
              stock_account.order(stk, 100)
            print stock_account.get_positions()

輸出的部分結果如下:

        {'000001.XSHE': Position(symbol: 000001.XSHE, amount: 100 ...}
        {'000001.XSHE': Position(symbol: 000001.XSHE, amount: 200 ...}
        {'000001.XSHE': Position(symbol: 000001.XSHE, amount: 300 ...}
        {'000001.XSHE': Position(symbol: 000001.XSHE, amount: 400 ...}
        {'000001.XSHE': Position(symbol: 000001.XSHE, amount: 500 ...}
        {'000001.XSHE': Position(symbol: 000001.XSHE, amount: 600 ...}

3.10 策略結果展示

1.bt

bt的含義:回測報告,格式為pandas.DataFrame。其包括日期、現金頭寸、證券頭寸、投資組合價值、參考指數收益率、交易指令明細表等6列,以及用戶在observe中定義的其他列。

時間從開始日期及需要獲取的最長歷史窗口后開始計算。

用法:策略運行完成后,可以在code單元中輸入bt,運行后查看結果。

2.bt_by_account

bt_by_account的含義:回測報告,格式為dict。其包括日期、現金頭寸、證券頭寸、投資組合價值、參考指數收益率、交易指令明細表等6列,以及用戶在observe中定義的其他列。

時間從開始日期及需要獲取的最長歷史窗口后開始計算。

用法:策略運行完成后,可以在code單元中輸入bt_by_account,運行后查看結果。

3.perf

perf是指根據回測記錄計算各項風險收益指標,類型為dict, key為指標名稱,value為指標的值,有些類型為float或list。參數及其描述如表3-20所示。

表3-20

用法:策略運行完成后,可以在code單元中輸入perf,運行后查看結果。

主站蜘蛛池模板: 集贤县| 浦城县| 阿图什市| 开化县| 奈曼旗| 思南县| 囊谦县| 霸州市| 防城港市| 东平县| 凌海市| 安义县| 广南县| 招远市| 美姑县| 宁海县| 正阳县| 汝南县| 阿鲁科尔沁旗| 衡阳市| 资源县| 凤冈县| 德江县| 鹤壁市| 清流县| 英山县| 辰溪县| 友谊县| 宣化县| 西藏| 施甸县| 怀化市| 博野县| 略阳县| 太湖县| 邵武市| 贵德县| 伊川县| 历史| 类乌齐县| 同仁县|