【量化交易】 python 基本語法與變量 【003】 策略 複習一下

本文是量化交易零基礎入門教程中的一篇,點擊藍字鏈接可查看該系列詳情。


摘要

  • python 是什麼
  • python 的基礎語法
  • 變量與賦值
  • Python 保留字符
  • 打印 print
  • 全局變量
  • 基本數據類型 - 數字與字符串
  • 算術運算
  • 查看數據類型 type
  • 數據類型 - 列表與字典
  • 自測與自學

  • 前文講解了量化交易中策略運行的基本框架以及實現方法,其中雖然給出一個簡單策略的完整代碼,但只是初步認識,想完全看懂並自己寫需要掌握 python 這門編程語言。
  • 一般常見的 python 教程都是針對程序員的,所以很多內容在做量化寫策略時都往往用不到。而本教程則是以量化的情景從零講解 python 編程,所以將更適合想學做量化策略的人。
  • 當然,對如果想更完備而全面的學習 python 語言的人,不妨看下這個文章(可能會繁雜些,也可能更適合你):python 教程合集

  • 我們將以前文策略代碼爲例進行講解,如下:

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

python 是什麼

  • python 是與計算機交流的一種語言。我們把想讓計算機做的事情用 python 寫出來,就如同前文那樣的一行行代碼,從而,計算機才能理解並去按我們的想法去做。這是一種通俗易懂的理解,但已經足夠了。想了解更多專業角度的介紹就自行搜索瞭解吧。

  • Python2 與 Python3

    • Python 語言本身也是如同自然語言般在不斷變化的,升級到 python3.0 版本時出現了較大的變化,以至於 python 分爲了 python2 與 python3 兩個不互相兼容的版本。
    • 由於世界上有很多流行功能函數庫對 python3 的支持並非很好,而有些量化過程中策略或系統可能會用到,所以我們用 python2 來寫策略,而且聚寬做策略回測代碼也只支持 python2。(聚寬投資研究功能中支持使用 python3)
    • 不過對寫策略來說,python2 與 python3 的區別並不明顯。具體區別見 python 官方文檔

python 的基礎語法

  • 大小寫敏感
    • 比較容易理解,就是字母的大寫與小寫是區分的,所以如果你把前文例子的代碼中的若干個字母從小寫變成大寫,系統會報錯。
  • 要用英文符號
    • 之前講過,冒號、逗號、分號、括號、引號等各種符號必須用英文的,中文的會不識別而報錯。
  • 註釋

    • 爲了讓代碼的便於交流理解,通常都會在代碼中寫入註釋用以說明代碼,註釋是給人看的,所以計算機會忽略(順便提下,空行也會被忽略),用中文記錄思路也沒關係。強烈建議養成寫註釋的好習慣。註釋的方法有二:
    • (#) 會把所在行的其後的所有內容設定爲註釋,如下

        # 註釋樣例
        # 這是一一個每天買平安銀行的策略
      
        # 初始化
        def initialize(context):
            run_daily(period,time='every_bar')
            # 設定要買入的股票是平安銀行
            g.security = '000001.XSHE'
        # 週期循環
        def period(context):
            #買入100股平安銀行
            order(g.security, 100)
      
    • 三個單引號 (''') 或三個雙引號 (""") 會把之間的內容設定爲註釋,以單引號爲例如下:

        '''
        註釋樣例
        這是一一個每天買平安銀行的策略
        是我寫的:)
        '''
        '''初始化'''
        def initialize(context):
            run_daily(period,time='every_bar')
            g.security = '000001.XSHE'
        '''週期循環'''
        def period(context):
            '''買入100股平安銀行'''
            order(g.security, 100)
      
  • 行與縮進

    • 之前講過,代碼縮進的時候要對齊,縮進方法是四個空格或一個 tab 鍵 (推薦用 tab),不要混着用。比如例子中週期循環部分除第一句都是要縮進的。
    • 縮進的含義是這樣的,有些語句是要包含其他連續若干條語句才成立的,這些語句通過縮進表示這種被包含的關係。如下:

        # initialize這條語句包含了其下的兩條語句
        def initialize(context):
            # 這兩條語句是要被其上的initialize包含的,要縮進
            run_daily(period,time='every_bar')
            g.security = '000001.XSHE'
      
  • 一行寫多條語句

    • 一般習慣是一行只寫一條語句,如果要一行寫多條語句要用分號隔開,不常用但要認識,如下,我把例子中原本的第二行與第三行寫在一行了(比較長排版可能會自動換行顯示)。

        def initialize(context):
            run_daily(period,time='every_bar');g.security = '000001.XSHE'
      
  • 一條語句寫在多行

    • 有時一條語句可能就會很長,爲了便於閱讀會用斜槓(不是除號,是從左上到右下的)分隔後寫在多行。如下,例子的第二行代碼被斜槓分隔後寫在兩行。

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

變量與賦值

  • 我們在之前的例子中見過這樣一行語句

      g.security = '000001.XSHE'
    
  • 當時沒細講,含義是把 '000001.XSHE' 這個字符串賦值給名爲 g.security 的變量 (security 是英文證券的意思)。

  • 變量通俗的理解是,計算機中存放數據的有名字的盒子。另外變量名字是在賦值語句中定義的。

  • 賦值,即賦予變量數據,寫法是等號,含義是把等號右邊的數據(或變量裏的數據)放入左邊的變量中去。用法如下:

      # 用法: 變量名 = 數據或變量
    
      a=1
      b='你好'
    
      # 把a中的數據1賦值給了c
      c=a  
      # 把b中的數據'你好'賦值給了a,此時a中的1被替換了
      a=b
    

Python 保留字符

  • 有些名字被系統所佔用不能用作變量名,或任何其他標識符名稱,如下:

      and        exec    not     assert    finally    continue
      break    for        pass    class    from    print
      or      global    raise   def        if        return
      del        import    try     elif    in        while
      else    is        with    except    lambda    yield
    

打印 print

  • print 是非常常用而重要的語句,它能把變量裏的內容在日誌中打印輸出出來,通過它我們能瞭解程序運行的細節。 用法如下:

      # 用法: print(變量名)
      a=1
      print(a)
      b='你好'
      print(b)
    
  • 如下圖,把代碼放到週期循環裏後,點編譯運行執行代碼,每個交易日都打印了 a、b,因爲運行了兩個交易日,所以打印了 2 組 a、b。注意,後面的例子都可以這個方法來執行

    print用法.png

  • print 也可以直接打印數據,如下

      # 用法: print(數據)
      print(1)
      print('你好')
    
  • 爲了能在日誌中看出打印內容的含義,可以採用如下方法,此方法經常用於記錄策略的運行情況。

      # 用法:print("說明、解釋等,用%s表示變量的位置" % (變量或數據))
    
      a=1
      b='hello'
    
      print("a=%s" % (a))
      print("b=%s" % (b))
      print("%s是你好的意思" % (b))
      #\n是在所在位置換行的意思,能讓日誌在日期信息的下一行開始打印
      print("\na=%s" % (a))
    
      # 用之前的方法執行後結果如下:
      2016-06-01 09:30:00 - INFO  - a=1
      2016-06-01 09:30:00 - INFO  - b=hello
      2016-06-01 09:30:00 - INFO  - hello是你好的意思
      2016-06-01 09:30:00 - INFO  - 
      a=1
    

全局變量

  • 你可能會發現初始化裏的變量與週期循環裏的變量是不通的,比如你運行如下的代碼會報錯:

      def initialize(context):
          run_daily(period,time='every_bar')
          a=1
      def period(context):
          print(a)
    
  • 報錯信息如下,含義是 a 沒有被定義

      NameError: global name 'a' is not defined
    
  • 爲了讓變量能在全局被使用,需要在變量前加 'g.',使之成爲全局變量。所以,把剛剛的代碼中的 a 改爲全局變量就能正確運行了。

      def initialize(context):
          run_daily(period,time='every_bar')
          g.a=1
      def period(context):
          print(g.a)
    

基本數據類型 - 數字與字符串

  • 對計算機來說,不同的數據往往需要不同的操作與存儲要求,因此在賦值時 python 會自動爲數據分類,從而對不同的數據採取不同的應對方法。比如,數字可以數學運算,但文本就不可以,字母可以轉換大小寫,數字不行。

  • 數字(Number)

    • 數字就是數字,可以做諸如加減乘除的計算操作,具體可分爲多種類型,比如股價一般就是浮點數型。因爲在賦值變量的時候,python 會自動調整變量類型。所以需要關注數字類型的時候並不多。
    • 數字具體分爲 int(整數)、float(浮點數,即 包含小數位)、bool(布爾值,即 True 和 False,True 是 1,False 是 0)等。

        a = 3      # 整數
        b = 3.1415 # 浮點數
        c = True   # 布爾值
      
  • 字符串(String)

    • 字符串可以理解爲文本或文字,不能像數字進行數學運算,有其特別的操作,比如股票代碼、股票名稱一般都是字符串。
    • Python 可使用引號 (')、雙引號 ( ")、三引號 ( ''' 或""" ) 來表示字符串,引號的開始與結束必須的相同類型的。如下,不妨用剛講的 print 打印下看看。

        # 其中三引號可以由多行組成來編寫多行文本
        a = '九歌'
        b = "嫋嫋兮秋風"
        c ="""嫋嫋兮秋風,
        洞庭波兮木葉下。
        ——屈原《九歌》""" 
      

算術運算

  • 數字變量之間是可以進行算術運算的,如下:

      a=3.0
      b=2.0
    
      # 爲了查看結果我用了print打印
      # 加
      print("a+b=%s" % (a+b))
      # 減
      print("a-b=%s" % (a-b))
      # 乘
      print("a*b=%s" % (a*b))
      # 除
      print("a/b=%s" % (a/b))
      # a除以b的商的整數部分
      print("a//b=%s" % (a//b))
      # a的b次冪,即指數運算
      print("a**b=%s" % (a**b))
      # a除以b的餘數,即取餘運算,爲了打印“%”百分號要用兩個百分號代表“%”百分號
      print("a%%b=%s" % (a%b)) 
    
      # 用之前的方法執行後結果如下,日期信息省去了
      a+b=5.0
      a-b=1.0
      a*b=6.0
      a/b=1.5
      a//b=1.0
      a**b=9.0
      a%b=1.0
    
  • 注意如果兩個整數類型進行計算,結果默認還是整數。如下:

      # 這樣寫沒有.0,系統會默認當成整數
      a=3
      b=2
    
      # 爲了查看結果我用了print打印
      # 加
      print("a+b=%s" % (a+b))
      # 減
      print("a-b=%s" % (a-b))
      # 乘
      print("a*b=%s" % (a*b))
      # 除
      print("a/b=%s" % (a/b))
      # a除以b的商的整數部分
      print("a//b=%s" % (a//b))
      # a的b次冪,即指數運算
      print("a**b=%s" % (a**b))
      # a除以b的餘數,即取餘運算,爲了打印“%”百分號要用兩個百分號代表“%”百分號
      print("a%%b=%s" % (a%b)) 
    
      # 用之前的方法執行後結果如下,日期信息省去了
      a+b=5
      a-b=1
      a*b=6
      a/b=1 # 3/2=1.5 .5被省略了
      a//b=1
      a**b=9
      a%b=1
    

查看數據類型 type

  • type 語句可以,告訴我們變量裏存放的是什麼類型的數據。用法如下:

          # 用法:type(變量名)
          a=1
          b='1'
          # 爲了看到結果需要用print把結果在日誌中打印
          print(type(a))
          print(type(b))
    
          # 用之前的方法執行後結果如下,可以看到a是int即整數,b是str即字符串。
          2016-06-01 09:30:00 - INFO  - 
          2016-06-01 09:30:00 - INFO  - 
    

數據類型 - 列表與字典

  • 爲了更方便的取用數據,在最基本的數據類型 - 數字與字符串基礎上,還有其他的數據類型,他們往往具有更復雜的結構更便捷的功能。比如接下來要介紹的列表(List)、字典(Dictionary),不過這裏的內容實在是繁多,此處只介紹最常用的內容,其他內容後續用到再講。

  • 列表(list)

    • 列表數據類型能方便我們操作一組數據。比如一組股價、一組股票名等。
    • 建立方法如下:

        # 建立一個list: 變量名=[數據或變量名,數據或變量名,......]
      
        a=[1,1,2,3,5,8,13,21]
        b=['000001.XSHE','002043.XSHE','002582.XSHE','600000.XSHG']
        c=[1,2,'good',[1,2,'luck'],a,b]
      
        # 值得注意的是例子中的c,c是一個list,其中的包含了6個元素,其中有數字(1,2),有字符串('good'),以及三個list([1,2,'luck'],a,b)。
        # 因此你應該知道,list中可混合的存放多種數據類型,list中放一個list也行。
      
    • 選取 list 中的某個元素的用法如下:

        # 方法: list類型的變量[位置(或稱下標或索引)]
        # 索引從0開始
        # 可以用負數代表倒數第幾
      
        c=[1,2,3,4]
      
        # 爲了看到結果我們用print打印
        print(c[0])
        print(c[1])
        print(c[2])
        print(c[-1])
      
        # 用之前的方法執行後結果如下:(前面的日期以後就不寫了)
        1
        2
        3
        4
      
    • 選取 list 中的一段的用法如下:

        # 方法: list類型的變量[起點索引:終點索引]
        # 起點索引省略則默認爲0
        # 終點索引省略則默認爲最後的索引
        # 注意此時的結果仍是一個list
      
        c=[1,2,3,4]
      
        # 爲了看到結果我們用print打印
        print(c[2:3])
        print(c[:-1])
        print(c[3:])
        print(c[:])
      
        # 執行後結果如下:
        [3]
        [1, 2, 3]
        [4]
        [1, 2, 3, 4]
      
  • 字典(dictionary)

    • 字典數據類型同樣能方便我們操作一組數據,與 list 不同的是我們可以爲這組數據自定義地建立索引。
    • 建立方法如下:

        # 建立方法: 變量名={索引名:數據,索引名:數據,....}
        # dict中的索引也叫鍵(key),數據也叫值(value)
      
        a={'平安銀行':'000001.XSHE','浦發銀行':'600000.XSHG'}
        b={'開盤價':10.0,'收盤價':11.0,'漲跌幅':0.10}
      
    • 選取 dict 中的某個 key 的值方法如下:

        # 選取方法 dict類型的變量[key]
        a={'平安銀行':'000001.XSHE','浦發銀行':'600000.XSHG'}
      
        # 爲了看到結果我們用print打印
        print(a['平安銀行'])
      
        # 執行後結果如下:
        000001.XSHE
      
    • 選取 dict 中的所有 key 與所有 value

        # 選取dict中的所有key: dict類型變量.keys()
        # 選取dict中的所有value: dict類型變量.values()
        # 注意返回的結果是list類型的
      
        a={'平安銀行':'000001.XSHE','浦發銀行':'600000.XSHG'}
        b=a.keys()
        c=a.values()
      
        # 爲了看到結果我們用print打印
        print("a.keys()=%s" % (a.keys()))
        print("b=%s" % (b))
        print("c=%s" % (c))
        # list中的中文難以正常顯示,需如下這樣單獨打印
        print("b[0]=%s" % (b[0]))
      
        # 執行後結果如下:
        a.keys()=['\xe5\xb9\xb3\xe5\xae\x89\xe9\x93\xb6\xe8\xa1\x8c', '\xe6\xb5\xa6\xe5\x8f\x91\xe9\x93\xb6\xe8\xa1\x8c']
        b=['\xe5\xb9\xb3\xe5\xae\x89\xe9\x93\xb6\xe8\xa1\x8c', '\xe6\xb5\xa6\xe5\x8f\x91\xe9\x93\xb6\xe8\xa1\x8c']
        c=['000001.XSHE', '600000.XSHG']
        b[0]=平安銀行
      
        # 可以看到,list中的中文難以正常顯示。
        # 而且結果都是list(有中括號)
      

自測與自學

  • 實踐下本文中的各個例子
  • 瞭解下 list 與 dict 的更多用法。參考資料:列表字典
  • 以下代碼打印結果是?

      a=1
      b=2
      c=a+b
      b=a+c
      a=b+c
      print(a+b+c)
    
  • 以下代碼的打印結果是?

      lt=[1,2,[3,4],5]
      print(lt[1])
      print(lt[1] lt[2][1])
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章