本文是量化交易零基礎入門教程中的一篇,點擊藍字鏈接可查看該系列詳情。
摘要
- 學習用 list 存儲多個股票
- 學習使用 for 循環
- 學習寫一個簡單的多股票策略
- 自測與自學
-
我們繼續以如下這個簡單的策略爲例進行學習在策略中操作多個股票。
def initialize(context): run_daily(period,time='every_bar') g.security = '000001.XSHE' def period(context): order(g.security, 100)
用 list 數據類型存儲多個股票
-
事實上,根據前面的所學我們是可以寫多個股票的策略的,無非是把原來單個股票的操作類似地再寫幾遍,比如下面這個策略就在操作兩個股票。
def initialize(context): run_daily(period,time='every_bar') g.security1 = '000001.XSHE' g.security2 = '000002.XSHE' def period(context): order(g.security1, 100) order(g.security2, 100)
-
顯然的問題是,當股票比較多的時候,就要寫很多遍,這樣的寫法就會很麻煩,看着也會比較亂。因此我們要學習其他的寫法。首先我們先學習用 list 數據類型存儲多個股票,如下:
def initialize(context): run_daily(period,time='every_bar') # 把兩個股票代碼作爲list存入g.security中 g.security = ['000001.XSHE','000002.XSHE']
-
list 數據類型用法前文有講過,特點是各個元素用逗號隔開後,用中括號把所以元素包起來,比較簡單,有疑問不妨去回顧下。接下來是重點內容 -- 循環語句,用它可以方便的批量操作多個股票。
循環語句
-
for 循環可以遍歷任何序列的項目,比如一個 list,一般用法如下:
# 含義是依次把序列中的元素賦值給for後的變量,並執行循環語句 for 變量 in 一個序列: 要循環的語句,也叫循環體
-
說起來略複雜,其實不難,來看個使用 for 的例子:
for k in ['大衛','查理曼','凱撒','亞歷山大']: print(k) # 執行後日志如下: # 大衛 # 查理曼 # 凱撒 # 亞歷山大 # 可見,for語句的運行過程是,取出list中第一個元素'大衛'並將其賦值給k,然後執行print(k)即在日誌中打印k,,此時k中是'大衛',之後,取出list中第二個元素'查理曼'並將其賦值給k,然後執行print(k)即在日誌中打印k,此時k中是'查理曼',以此類推,直到'亞歷山大'被打印。
-
使用 for 語句時有一個常見一起使用的語句 range (),它的功能是生成等差數列的,用法如下:
range(首項,上限,步長) # 首項 就是這個數列的第一項,可省略,省略後默認爲0 # 步長 就是數列的公差、間隔,可省略,省略後默認爲1 # 上限 是用來限制數列長度的,即數列不得大於或等於上限。不可省略。 # 另外,python2中range產生的是list,但python3中產生的不是list,但可以用list()這個語句把結果轉成list類型,比如list(range(1,7,2))。我們策略編輯環境是python2。 # 一個例子 for j in range(1,7,2): print(j) print(range(1,7,2)) # 執行後日志如下: # 1 # 3 # 5 # [1, 3, 5]
-
continue 與 break 是重要的修飾循環執行流程的語句,用法如下:
# break的作用是寫在循環體中用來跳出當前的整個循環過程 # continue的作用是寫在循環體中用來跳出當前的這一次的循環過程 # 通過一個例子應該就能明白兩者的作用與區別 # 一個簡單的循環例子 for t in range(4): print(t) # 執行的結果是 # 0 # 1 # 2 # 3 # 在例子中使用break。可以看到當循環到2的時候,打印omg後,執行break,終止了整個循環過程,不再繼續循環3了,所以omg後就什麼都沒了。 for t in range(4): if t == 2: print('omg') break print(t) # 執行的結果是 # 0 # 1 # omg # 在例子中使用continue。可以看到當循環到2的時候,打印omg後,執行continue,跳過了當前正循環的t爲2這個循環過程的餘下部分,不在繼續執行之後的語句(即print(t),此時t等於2),而繼續循環3了,所以omg後有打印3。 for t in range(4): if t == 2: print('omg') continue print(t) # 執行的結果是 # 0 # 1 # omg # 3
寫一個簡單多股票策略
-
用剛學的知識把之前簡單的策略例子改寫成多股票版本,如下。
def initialize(context): run_daily(period,time='every_bar') # 把兩個股票代碼作爲list存入g.security中 g.security = ['000001.XSHE','000002.XSHE'] def period(context): # 每個股票買100股 for stk in g.security: order(stk,100)
-
其實運用所學的知識已經可以進一步的加入很多東西了,比如在這個多股票的基礎上在加入之前講過的止損。不妨自己先嚐試下再看下面的樣例代碼。樣例代碼如下。
def initialize(context): run_daily(period,time='every_bar') # 把兩個股票代碼作爲list存入g.security中 g.security = ['000001.XSHE','000002.XSHE'] def period(context): for stk in g.security: order(stk,100) # 獲得股票持倉成本 cost=context.portfolio.positions[stk].avg_cost # 獲得股票現價 price=context.portfolio.positions[stk].price # 計算收益率 ret=price/cost-1 # 如果收益率小於-0.01,即虧損達到1%則賣出股票,幅度可以自己調,一般10% if ret<-0.01: order_target(stk,0) print('觸發止損')
自測與自學
- 實踐下本文中的例子
- 用 for 語句生成一個 100 項的平方數數列的 list,即 [1,4,9,16,...,10000]
- 用 for 語句計算 100 項的平方數數列的和,即 1+4+9+16+...+10000 的結果
-
以下代碼輸出結果是?(len 之前提到過,不記得的直接百度下)
a = [4,2,1,9,6,5,3,8,7] for i in range(len(a)): for j in range(i+1,len(a)): if a[j] > a[i]: t=a[j] a[j] = a[i] a[i]=t print(a)