量化交易開發(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ù)交流。