1. 程式人生 > >用 Python 實現你的量化交易策略

用 Python 實現你的量化交易策略

Python 的學習者中,有相當一部分是衝著爬蟲去的。因為爬蟲可以幫你解決很多工作和生活中的問題,節約你的生命。不過 Python 還有一個神祕而有趣的應用領域,那就是量化交易。

量化交易,就是以數學模型替代人的主觀判斷來制定交易策略。通常會藉助計算機程式來進行策略的計算和驗證,最終也常直接用程式根據策略設定的規則自動進行交易。

Python 由於開發方便,工具庫豐富,尤其科學計算方面的支援很強大,所以目前在量化領域的使用很廣泛。市面上也出現了很多支援 Python 語言的量化平臺。通過這些平臺,你可以很方便地實現自己的交易策略,進行驗證,甚至對接交易系統(由於政策原因,現在很多交易介面暫停開放)。

在交易策略方面,我是外行(雖然曾經也有證券從業資格)。所以本文只是介紹幾個 Python 量化平臺,以及一些最基本的使用方法。更多的功能、更強大的策略還有待各位自己去挖掘。

目前國內比較知名的幾個平臺:

國外知名平臺:

它們都可以使用 Python 進行策略開發。

以優礦為例,註冊之後,在“開始研究”頁面,新建一個 Notebook,就可以開始用 Python 寫你自己的策略。

右上角的下拉框選擇“策略”,就會幫你自動填寫上策略回測的基本結構程式碼。

開始的一些變數是對回測的基本配置。initialize 裡可以做一些初始化的工作。handle_data 則是回測程式碼的核心,用來實現每個交易日(或每分鐘)的交易指令。

具體的變數含義,這裡不做特別細緻的解釋,文件裡都有說明。僅從命名和註釋裡也可以看出,設定了回測的時間,股票池,資金,交易頻率等。

文件裡給了一個最簡單的日線策略程式碼:

defhandle_data(account):
    for stock in account.universe:
        order(stock,100)

此策略就是,在每個交易日,把股票池裡每一隻股票都買入一手。

account.universe 就是開頭設定的 universe 值。這裡遍歷股票池中的股票。

order 是買賣指令,函式原型是:order(symbol, amount)

引數 symbol 是股票程式碼,amount 是買賣數量,正為買入,負為賣出。此處買入 100 股,即 1 手。

點選“執行”,或 Ctrl+Enter,即可在頁面上看到策略的執行情況。

我們再嘗試改動一點點,寫一個自己的策略。

我拍腦袋想了這樣一個策略:

如果一隻未持有的股票 2 個交易日累計漲了 10% 以上,就以當前資金的 5% 買入它。反過來,如果累計跌了 10% 以上,就全部賣出止損。

下面把它實現出來看下回測效果如何。

時間設為去年(2015)全年,起始資金 10 萬元。

universe = set_universe('A')

股票池為 A 股所有股票。

account.get_attribute_history('closePrice', 3)

取得股票池中所有股票前 3 天的收盤價(closePrice)。

hist[s][2] - hist[s][0]

得到 1 天前和 3 天前收盤價的差值。

account.valid_secpos

是賬戶當前所持有的證券資訊。

如果收盤價 2 天的差值滿足買入條件且未持有,就執行:

order_pct(s, 0.05)

order_pct 表示按賬戶當前總價值的百分比買入股票。

如果滿足賣出條件則執行:

order_to(s, 0)

OK,一個簡單到不行的策略已完成。執行一下:

居然,這麼簡單的策略在最高的時候有超過 90% 的收益,即使在經歷了年中的股災和下半年的震盪之後,到年底也還有 30% 多的收益率,應該超越了大部分散戶去年的成績吧。如果按照這個策略進行交易,嘖嘖,想想還有點小激動呢。(喂!快醒醒!)

然而現實是殘酷的,真實的市場分分鐘教你做人。

量化投資以及程式化交易是很有前途的行業,但在你想從事這行,甚至用它賺錢之前,請先深入瞭解它。

有興趣的,去看下這個問題:

前面提到的另外幾個平臺,和優礦基本類似,API 和功能會有些差異,可以自行嘗試,這裡不再分別演示。也有人做過比較:

如果你對這個領域充滿好奇,不如現在就立刻動手,從你的第一個策略開始。誰知道你會不會成為下一個巴菲特呢:)

其他文章及回答:

Crossin的程式設計教室

微信ID:crossincode