量化交易開發(fā)之context與判斷(五)

量化交易開發(fā)之context與判斷(五)

通過前文的講解,我們已經(jīng)能理解最開始那個(gè)最簡單的策略例子,如下:

    def initialize(context):
        run_daily(period, time = 'every_bar')
        g.security = '000001.XSHE'
    
    def period(context):
        order(g.security, 100)

下面我們看看什么是context。

一、context的結(jié)構(gòu)

  • context是一個(gè)回測系統(tǒng)建立的Context類型的對象,其中存儲了如當(dāng)前策略運(yùn)行的時(shí)間點(diǎn)、所持有的股票、數(shù)量、持倉成本等數(shù)據(jù)。

  • 對象可以理解為特殊類型的變量,對象的結(jié)構(gòu)往往比我們之前見過的list與dict更復(fù)雜,被定義好的對象是有名字的,比如context是一個(gè)變量,它的變量類型是一個(gè)Context類型的對象,就像dict包括key與value,Context類型的對象也包括很多屬性,而且可以嵌套另一個(gè)種類型的對象。

1706520776061.png

二、數(shù)據(jù)取用方法

  • 獲取對象類型變量內(nèi)包含的數(shù)據(jù)方法是用英文句號隔開,而當(dāng)包含的是另一個(gè)對象時(shí),只需在應(yīng)用英文句號隔開即可,例子如下:
    # 打印可用的資金
    print(context.portfolio.available_cash)
    # 打印運(yùn)行的頻率
    print(context.run_params.frequency)
    # 打印當(dāng)前時(shí)間的開始時(shí)間
    print(context.current_dt)

    # 執(zhí)行后日志內(nèi)容如下
    # 1000000.0
    # day
    # 2016-06-01 09:30:00

1706520776061.png
  • 當(dāng)要獲取的對象內(nèi)的數(shù)據(jù)是另一種有結(jié)構(gòu)的變量類型時(shí),比如dict或者list,正常按照該變量類型進(jìn)一步取用數(shù)據(jù)即可。例如context.portfolio.posiotions是一個(gè)dct,例子如下,這次給出完整代碼:
# context.portfolio.positions的含義是倉位信息,需要在取之前買入并持有股票

def initialize(context):
    run_daily(period, time='every_bar')
    g.security = '000001.XSHE'

def period(context):
    order(g.security, 100)
    # 打印所有鍵
    print(context.portfolio.positions.keys())
    # 打印所有值
    print(context.portfolio.positions.values())
    # 打印g.security的開倉均價(jià)
    print(context.portfolio.positions[g.security].avg_cost)

    # 執(zhí)行后日志內(nèi)容如下
    # ['000001.XSHE']
    # [UserPosition({'avg_cost': 8.539999999999997, 'security': '000001.XSHE', 'closeable_amount':    0, 'price': 8.53, 'total_amount': 100})]
    # 8.54

常用的context數(shù)據(jù)寫法如下,推薦自己動(dòng)手試一下

  • 當(dāng)前時(shí)間 context.current_dt
  • 當(dāng)前時(shí)間的“年-月-日”的字符串格式 context.current_dt.strftime("%Y-%m-%d")
  • 前一個(gè)交易日 context.previous_date
  • 當(dāng)前可用資金 context.portfolio.available_cash
  • 持倉價(jià)值 context.portfolio.positions_value
  • 累計(jì)收益 context.portfolio.returns
  • 當(dāng)前持有股票 context.portfolio.positions.keys()
  • 當(dāng)前持有的某股票的開倉均價(jià) context.portfolio.positions['xxxxxx.xxxx'].avg_cost
  • 當(dāng)前持有的某股票的可賣持倉量 context.portfolio.positions['xxxxxx.xxxx'].closeable_amount

三、條件判斷

能夠獲取context的數(shù)據(jù)后,我們會考慮利用這些數(shù)據(jù)豐富策略的邏輯,但在此之前我們還要學(xué)習(xí)if條件判斷語句,如下:

    # 如果 條件1成立為 True 將執(zhí)行代碼塊1
    # 如果 條件1不成立為False,將判斷條件2
    # 如果 條件2成立為 True 將執(zhí)行代碼塊2
    # 如果 條件2還不成立為False,將執(zhí)行代碼塊3

    if 條件1:
        代碼塊1
    elif 條件2:
        代碼塊2
    else:
        代碼塊3

    # 注意
    # elif 可以有多個(gè)連續(xù)寫
    # 且elif和else都可以省略
    # 條件判斷語句中可以嵌套條件判斷語句

舉幾個(gè)例子:

    # 打印a、b中最大值
    if a>=b:
        print(a)
    else:
        print(b)

    # 判斷a的正負(fù)性   
    if a>0:
        print('正')
    elif a<0:
        print('負(fù)')
    elif a==0:
        print('零')

    # 如果當(dāng)前是2018-05-04,則下單買入100股平安銀行
    date=context.current_dt.strftime("%Y-%m-%d")
    if date=='2018-05-04':
        order('000001.XSHE',100)

    # 判斷a大小情況
    if a>0:
        if a<1:
            print('a大于0且小于1')
        else:
            print('a大于等于1')
    else:
        print('a小于等于0')

條件判斷語句比較簡單,但還需說明的是條件的寫法中用到的運(yùn)算符:

    # 寫條件常用運(yùn)算符:
    # < 小于
    # > 大于
    # <= 小于等于
    # >= 大于等于
    # == 等于
    # != 不等于
    # and 與,即and兩邊條件同為真,則真
    # or 或,即or兩邊條件任意一個(gè)為真,則真
    # not 非,即not右側(cè)條件為真,則假,not右側(cè)條件為假,則真

    # 以判斷a是否為0的幾個(gè)寫法為例
    # 寫法1
    if a!=0:
        print('否')
    else:
        print('是')
    # 寫法2    
    if a>0 or a<0:
        print('否')
    else:
        print('是')
    # 寫法2    
    if a>=0 and a=<0:
        print('是')
    else:
        print('否')
    # 寫法3   
    if not a==0:
        print('否')
    else:
        print('是')

四、止損

  • 狹義的止損是指當(dāng)虧損達(dá)到一定幅度后下單賣出該股票的操作,目的是減少進(jìn)一步的虧損。廣義則指在狹義的思路上衍生的復(fù)雜的減少虧損的方法。
  • 更多的情況下指狹義的止損。綜合運(yùn)用前文的講過的內(nèi)容我們已經(jīng)可以實(shí)現(xiàn)當(dāng)虧損達(dá)到一定幅度后下單賣出該股票的止損操作了。

通過context的數(shù)據(jù)可以得到持有股票的成本和現(xiàn)價(jià),從而可以算出該股票的盈虧情況,運(yùn)用條件判斷語句根據(jù)盈虧情況從而決定是否賣出股票,從而實(shí)現(xiàn)止損操作,代碼如下:

    def initialize(context):
        run_daily(period,time='every_bar')
        g.security = '000001.XSHE'

    def period(context):
        # 買入股票
        order(g.security, 100)
        # 獲得股票持倉成本
        cost=context.portfolio.positions['000001.XSHE'].avg_cost
        # 獲得股票現(xiàn)價(jià)
        price=context.portfolio.positions['000001.XSHE'].price
        # 計(jì)算收益率
        ret=price/cost-1
        # 打印日志
        print('成本價(jià):%s' % cost)
        print('現(xiàn)價(jià):%s' % price)
        print('收益率:%s' % ret)
        # 如果收益率小于-0.01,即虧損達(dá)到1%則賣出股票,幅度可以自己調(diào),一般10%
        if ret<-0.01:
            order_target('000001.XSHE',0)
            print('觸發(fā)止損')

  • 設(shè)置回測時(shí)間為從2017-03-01到2017-03-31,初始資金為100000,頻率為天。回測發(fā)現(xiàn)會在2017-03-20觸發(fā)止損。

五、未完待續(xù)

下章將繼續(xù)介紹context中的數(shù)據(jù)和條件判斷。

歡迎關(guān)注知乎:北京不北

歡迎+V:beijing_bubei

歡迎關(guān)注douyin:near.X (北京不北)

獲得技術(shù)答疑,長期技術(shù)交流。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容