在 Python 演算法交易領域中,穩固的基礎設施至關重要。本文將引導讀者建立一個 Python 演算法交易環境,涵蓋套件管理、虛擬環境設定、容器化佈署及雲端例項應用。此基礎建設將作為後續開發和佈署交易策略的基本,無論是互動式分析或自動化交易系統。我們將深入探討 Conda 作為套件和環境管理器,並介紹 Docker 容器技術和雲端例項的佈署流程,確保讀者能建構一個高效、可擴充套件且穩定的交易系統。

焦點和先決條件

本章的焦點在於Python作為演算法交易的程式語言。這本章假設讀者已經具備一些Python和流行的Python套件的經驗,例如資料分析。好的入門書包括Hilpisch(2018)、McKinney(2017)和VanderPlas(2016),這些書可以幫助建立Python資料分析和金融的堅實基礎。讀者也應該具備一些使用Python的互動式分析工具的經驗,例如IPython。

本章將呈現和解釋適用於相關主題的Python程式碼,例如回測交易策略或使用流資料。然而,它不能提供所有套件的徹底介紹。它試圖強調套件的核心功能,例如NumPy的向量化。

本章也不提供金融和營運方面的徹底介紹。相反,它關注於使用Python建立自動演算法交易系統的必要基礎設施。當然,絕大多數例子都是從演算法交易領域中選取的。然而,當涉及動量或均值迴歸策略時,它們基本上只是簡單地使用,而不提供(統計)驗證或對其複雜性的深入討論。

交易策略

在整本章中,四種不同的演算法交易策略被用作例子。它們在以下章節中簡要介紹,並在第4章中更詳細地介紹。所有這些交易策略都可以分類為主要尋求alpha的策略,因為它們的主要目標是生成與市場方向無關的正收益。

典型的例子是股票指數、單一股票或加密貨幣(以法定貨幣計價)。本章不涉及同時涉及多個金融工具的策略(配對交易策略、根據籃子的策略等)。它只涵蓋從結構化金融時間序列資料中派生的交易訊號,而不是從未結構化資料來源(如新聞或社交媒體)中派生的訊號。

簡單移動平均線

第一種交易策略型別依靠簡單移動平均線(SMA)來生成交易訊號和市場定位。這些交易策略已被推廣。基本思想是,較短期的SMA如果高於較長期的SMA,則訊號為多頭市場定位,反之則訊號為中性或空頭市場定位。

動量

動量策略背後的基本思想是,假設金融工具將繼續按照其最近的表現行事一段時間。例如,如果股票指數在過去五天平均回報為負,則預計其明天的表現也將為負。

均值迴歸

在均值迴歸策略中,假設金融工具如果目前遠離某個均值或趨勢水平,則將迴歸到該水平。例如,假設一檔股票的價格低於其200天SMA水平10美元,則預計股票價格將在不久的將來迴歸到其SMA水平。

Python 基礎設施

在建造一棟房子時,選擇合適的木材是非常重要的。木匠的目標應該是使用能夠有效切割的工具,並在有時間時將其磨利。

— Miyamoto Musashi (《五輪書》)

對於 Python 新手來說,Python 的佈署可能看起來很複雜。同樣,Python 的眾多函式庫和套件也可能令人感到不知所措。首先,Python 有多種版本,如 CPython、Jython、IronPython 或 PyPy。此外,還有 Python 2.7 和 3.x 之間的區別。本章著重於 CPython,Python 最流行的版本,以及 3.8 版本。

即使只關注 CPython 3.8(以下簡稱「Python」),佈署仍然存在多個挑戰:

  • 解譯器(標準 CPython 安裝)只包含所謂的標準函式庫(例如,涵蓋典型的數學函式)。
  • 可選的 Python 套件需要單獨安裝,有數百個可供選擇。
  • 編譯(「建造」)此類非標準套件可能很棘手,需要考慮相依性和作業系統特定的要求。
  • 處理這些相依性和版本一致性(維護)可能很繁瑣且耗時。
  • 某些套件的更新和升級可能需要重新編譯許多其他套件。
  • 更改或替換一個套件可能會在其他地方引起問題。
  • 在某個時候從一個 Python 版本遷移到另一個版本可能會放大所有上述問題。

幸運的是,有工具和策略可以幫助解決 Python 佈署問題。本章涵蓋以下型別的技術,以幫助 Python 佈署:

套件管理器

套件管理器,如 pip 或 conda,幫助安裝、更新和刪除 Python 套件。它們還幫助維護不同套件的版本一致性。

虛擬環境

虛擬環境,如 venv 或 conda 環境,允許您為每個專案建立一個獨立的 Python 環境,具有自己的套件和版本。這有助於避免版本衝突和相依性問題。

套件管理工具

套件管理工具,如 pipenv,結合了套件管理器和虛擬環境的功能。它們允許您管理套件和版本,並為每個專案建立一個獨立的環境。

Python 佈署策略

Python 佈署策略,例如使用 Docker 或 Kubernetes,允許您將 Python 應用程式容器化和佈署到雲端或本地環境。

程式碼示例

以下是使用 pip 安裝套件的示例:

# 安裝套件
pip install numpy

# 更新套件
pip install --upgrade numpy

# 刪除套件
pip uninstall numpy

以下是使用 conda 建立虛擬環境的示例:

# 建立虛擬環境
conda create --name myenv python=3.8

# 啟用虛擬環境
conda activate myenv

# 安裝套件
conda install numpy

# 關閉虛擬環境
conda deactivate

以下是使用 pipenv 管理套件的示例:

# 建立 pipenv 環境
pipenv --python 3.8

# 安裝套件
pipenv install numpy

# 更新套件
pipenv update

# 刪除套件
pipenv uninstall numpy

虛擬環境管理器

虛擬環境管理器(Virtual Environment Manager)是一種工具,允許使用者在同一臺機器上管理多個Python版本的安裝。例如,使用者可以在同一臺機器上安裝Python 2.7和Python 3.8,或者測試最新的Python套件開發版本,而不會影響其他版本的安裝。

容器技術

Docker容器代表了一個完整的檔案系統,包含所有執行特定軟體所需的元件,例如程式碼、執行時環境和系統工具。例如,使用者可以在Docker容器中執行Ubuntu 20.04作業系統,搭配Python 3.8安裝和相應的Python程式碼,並將其佈署在Mac OS或Windows 10機器上。這樣的容器化環境可以之後佈署在雲端,無需進行重大修改。

雲端例項

佈署Python程式碼用於金融應用通常需要高用性、安全性和效能。這些要求通常只能透過雲端例項(虛擬伺服器)來滿足。與長期租用專用伺服器相比,雲端例項的好處是使用者只需為實際使用的時間付費。另一個優點是雲端例項可以在幾分鐘內即可使用,這有助於敏捷開發和擴充套件。

本章結構

本章的結構如下:

  • 「Conda作為套件管理器」介紹Conda作為Python的套件管理器。
  • 「Conda作為虛擬環境管理器」關注Conda的虛擬環境管理能力。
  • 「使用Docker容器」簡要介紹Docker作為容器化技術,並關注建立Ubuntu基礎容器的Python 3.8安裝。
  • 「使用雲端例項」展示如何佈署Python和Jupyter Lab,一個強大的根據瀏覽器的工具套件,用於Python開發和佈署在雲端。

本章的目標是建立一個適當的Python安裝,包括最重要的工具、數值、資料分析和視覺化套件,所有這些都可以在專業的基礎設施上使用。這種組合將作為後續章節中實作和佈署Python程式碼的骨幹,無論是互動式金融分析程式碼還是指令碼和模組形式的程式碼。

Conda作為套件管理器

雖然Conda可以單獨安裝,但透過Miniconda安裝是一種高效的方法。Miniconda是一個最小的Python分佈,包括Conda作為套件和虛擬環境管理器。

安裝Miniconda

使用者可以在Miniconda頁面下載Miniconda的不同版本。以下假設使用Python 3.8 64位版本,可以在Linux、Windows和Mac OS上使用。以下示例是在Ubuntu基礎的Docker容器中,透過wget下載Linux 64位安裝程式,然後安裝Miniconda。以下程式碼應該可以正常執行(可能需要進行一些小的修改):

$ docker run -ti -h pyalgo -p 11111:11111 ubuntu:latest /bin/bash
root@pyalgo:/# apt-get update; apt-get upgrade -y
...
root@pyalgo:/# apt-get install -y gcc wget
...
root@pyalgo:/# cd root
root@pyalgo:~# wget \
> -O miniconda.sh \
> https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
...
HTTP request sent, awaiting response... 200 OK

內容解密:

以上命令使用Docker執行一個Ubuntu容器,安裝必要的套件,然後下載Miniconda的安裝指令碼。使用者可以根據自己的需求修改命令,例如更改Docker容器的版本或安裝不同的Python版本。

圖表翻譯:

以下是使用Mermaid語法繪製的Docker容器執行過程圖表:

  graph LR
    A[Docker容器] -->|執行|> B[Ubuntu容器]
    B -->|安裝套件|> C[Miniconda安裝]
    C -->|下載安裝指令碼|> D[Miniconda.sh]
    D -->|執行安裝指令碼|> E[Miniconda安裝完成]

以上圖表展示了Docker容器執行、安裝套件、下載Miniconda安裝指令碼、執行安裝指令碼的過程。使用者可以根據自己的需求修改圖表,例如新增或刪除步驟。

安裝 Miniconda

Miniconda 是一種輕量級的 Python 分佈版,包含了 Conda 包管理器和 Python 解譯器。以下是安裝 Miniconda 的步驟:

下載安裝指令碼

首先,下載 Miniconda 的安裝指令碼。這個指令碼是一個 shell 指令碼,會下載和安裝 Miniconda。

wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh -O miniconda.sh

執行安裝指令碼

下載完成後,執行安裝指令碼。

bash miniconda.sh

接受授權條款

安裝過程中,會要求您接受授權條款。按下 Enter 鍵即可開始安裝。

確認安裝位置

安裝過程中,會要求您確認安裝位置。按下 Enter 鍵即可使用預設位置。

初始化 Miniconda

安裝完成後,會要求您是否要初始化 Miniconda。輸入 yes 即可初始化 Miniconda。

驗證安裝

安裝完成後,開啟新的 terminal 視窗,輸入 conda --version 即可驗證安裝是否成功。

Conda 包管理器

Conda 是一個包管理器,允許您輕鬆地安裝、更新和管理 Python 包。以下是 Conda 的一些基本命令:

  • conda create --name myenv:建立一個新的環境。
  • conda activate myenv:啟用環境。
  • conda install package_name:安裝包。
  • conda update package_name:更新包。
  • conda remove package_name:移除包。

Python 基礎

Python 是一種高階語言,易於學習和使用。以下是 Python 的一些基本語法:

  • print("Hello, World!"):印出字串。
  • x = 5:指定。
  • if x > 10::條件陳述式。
  • for i in range(10)::迴圈。

練習

  1. 安裝 Miniconda。
  2. 建立一個新的環境。
  3. 安裝必要的包。
  4. 寫一個 Python 程式,印出 “Hello, World!"。

內容解密:

上述內容介紹瞭如何安裝 Miniconda、使用 Conda 包管理器和 Python 基礎語法。這些是 Python 開發的基礎知識,瞭解這些知識可以幫助您更好地使用 Python。

基礎Python環境設定與Conda的基本操作

在進行演算法交易的Python環境設定中,首先需要安裝Miniconda。Miniconda是一個輕量級的Conda版本,包含了基本的Conda功能和Python解譯器。下面是安裝Miniconda的過程:

首先,下載並安裝Miniconda。安裝完成後,會提示您重新啟動shell以使變更生效。您也可以設定Conda的基礎環境不在啟動時自動啟動,方法是執行以下命令:

conda config --set auto_activate_base false

接下來,更新Conda以確保您擁有最新的功能和安全補丁:

conda update -y conda

然後,將Conda的路徑新增到系統的環境變數中,以便在任何地方都能夠使用Conda:

export PATH="/root/miniconda3/bin/:$PATH"

並將此路徑新增到您的shell組態檔中,以便在未來的shell會話中繼續使用Conda:

echo ". /root/miniconda3/etc/profile.d/conda.sh" >> ~/.bashrc

重新啟動shell或執行bash命令以使變更生效。您現在應該可以看到(base)提示,表示您已經在Conda的基礎環境中。

驗證Python環境

驗證Python環境是否正常工作,執行以下命令:

python

您應該會看到Python的版本和相關資訊,例如:

Python 3.8.3 (default, May 19 2020, 18:47:26)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.

在Python環境中,輸入以下命令以測試是否能夠正常執行Python程式:

print('Hello Python for Algorithmic Trading World.')

您應該會看到以下輸出:

Hello Python for Algorithmic Trading World.

離開Python環境,執行以下命令:

exit()

Conda的基本操作

Conda是一個強大的包管理工具,允許您輕鬆地安裝、更新和移除Python包。以下是Conda的一些基本操作:

  • 安裝Python:您可以使用Conda安裝特定的Python版本,例如Python 3.8,使用以下命令:
conda install python=3.8
  • 更新Python:如果您想要更新Python到最新版本,可以使用以下命令:
conda update python

這些命令可以幫助您管理Python環境和包。接下來,我們將探討更多Conda的高階功能和演算法交易相關的應用。

使用Conda進行包管理

Conda是一個強大的包管理工具,能夠輕鬆地管理Python和其他語言的包。以下是Conda的一些基本用法:

更新Python版本

如果您想要更新Conda中的Python版本,可以使用以下命令:

conda update python

這個命令會更新Conda中的Python版本到最新的版本。

安裝包

要安裝一個包,可以使用以下命令:

conda install $PACKAGE_NAME

$PACKAGE_NAME 替換為您想要安裝的包名稱。例如,要安裝NumPy,可以使用以下命令:

conda install numpy

更新包

要更新一個包,可以使用以下命令:

conda update $PACKAGE_NAME

$PACKAGE_NAME 替換為您想要更新的包名稱。

移除包

要移除一個包,可以使用以下命令:

conda remove $PACKAGE_NAME

$PACKAGE_NAME 替換為您想要移除的包名稱。

更新Conda

要更新Conda本身,可以使用以下命令:

conda update conda

搜尋包

要搜尋包,可以使用以下命令:

conda search $SEARCH_TERM

$SEARCH_TERM 替換為您想要搜尋的關鍵字。

列出安裝的包

要列出已經安裝的包,可以使用以下命令:

conda list

安裝NumPy

以下是安裝NumPy的範例:

conda install numpy

這個命令會安裝NumPy和其依賴的包,包括Intel Math Kernel Library(mkl)。

內容解密:

在上面的範例中,Conda會自動安裝NumPy和其依賴的包,包括mkl。mkl是一個高效能的數學函式函式庫,能夠加速數字運算。當您在Intel處理器的機器上安裝NumPy時,Conda會自動安裝mkl,以便您能夠充分利用Intel處理器的效能。

圖表翻譯:

以下是Conda安裝NumPy的流程圖:

  flowchart TD
    A[開始] --> B[搜尋包]
    B --> C[安裝包]
    C --> D[安裝依賴包]
    D --> E[完成安裝]

在這個流程圖中,Conda首先搜尋NumPy包,然後安裝NumPy和其依賴的包,包括mkl。最後,Conda完成安裝並傳回成功訊息。

使用Conda進行套件管理

Conda是一個強大的套件管理工具,允許您輕鬆地安裝、更新和管理套件。以下是使用Conda安裝多個套件的範例:

conda install -y ipython matplotlib pandas pytables scikit-learn scipy

這個命令會安裝ipython、matplotlib、pandas、pytables、scikit-learn和scipy等套件。

安裝套件

當您執行安裝命令時,Conda會先收集套件的中繼資料,然後解決環境的依賴關係。以下是安裝過程的輸出:

Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##
environment location: /root/miniconda3
added / updated specs:
- ipython
- matplotlib
- pandas
- pytables
- scikit-learn
- scipy
The following packages will be downloaded:
package | build

套件管理

Conda不僅可以安裝套件,也可以更新和移除套件。以下是更新套件的範例:

conda update -y ipython

這個命令會更新ipython套件到最新版本。

環境管理

Conda也可以管理多個環境,允許您為不同的專案建立不同的環境。以下是建立新環境的範例:

conda create -n myenv python=3.8

這個命令會建立一個名為myenv的新環境,使用Python 3.8版本。

圖表翻譯:

  graph LR
    A[Conda] -->|安裝套件|> B[ipython]
    A -->|更新套件|> C[ipython]
    A -->|建立環境|> D[myenv]
    B -->|套件管理|> E[Conda]
    C -->|套件管理|> E
    D -->|環境管理|> E

內容解密:

Conda是一個強大的套件管理工具,允許您輕鬆地安裝、更新和管理套件。使用Conda,您可以建立多個環境,為不同的專案建立不同的環境。Conda也可以更新和移除套件,讓您輕鬆地管理套件。

Python 基礎設施

在完成安裝程式後,除了標準函式庫外,還有一些重要的金融分析函式庫已經可用。其中包括:

  • IPython:一種改進的互動式 Python Shell,提供了更好的程式碼完成、除錯和視覺化功能。

以下是安裝過程的詳細輸出:

# 安裝過程輸出
backcall-0.2.0 | py_0 15 KB
...
zstd-1.4.5 | h9ceee32_0 619 KB
# 總安裝大小
Total: 144.9 MB
# 新安裝的套件
The following NEW packages will be INSTALLED:
backcall pkgs/main/noarch::backcall-0.2.0-py_0
blosc pkgs/main/linux-64::blosc-1.20.0-hd408876_0
...
zstd pkgs/main/linux-64::zstd-1.4.5-h9ceee32_0
# 下載和解壓套件
Downloading and Extracting Packages
glib-2.65.0 | 2.9 MB | ############################## | 100%
...
snappy-1.1.8 | 40 KB | ############################## | 100%
# 事務處理
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

內容解密:

上述安裝過程輸出顯示了各個套件的安裝大小和進度。其中,backcallblosczstd 等套件都是金融分析中常用的函式庫。IPython 是一個改進的互動式 Python Shell,提供了更好的程式碼完成、除錯和視覺化功能。

圖表翻譯:

  flowchart TD
    A[開始安裝] --> B[下載套件]
    B --> C[解壓套件]
    C --> D[事務處理]
    D --> E[完成安裝]

圖表說明:

上述流程圖顯示了安裝過程的各個步驟。從開始安裝到完成安裝,各個步驟之間的順序和關係都很清楚。這個流程圖可以幫助使用者更好地理解安裝過程。

Python 資料分析工具包

Python 是一種強大的程式語言,廣泛用於資料分析和科學計算。以下是幾個常用的 Python 資料分析工具包:

從建構穩固 Python 基礎設施的角度來看,本章涵蓋了從套件管理、虛擬環境到容器化與雲端佈署的完整流程,展現了兼顧開發效率和環境穩定性的最佳實務。透過 Conda、Docker 和雲端例項的整合運用,有效解決了 Python 套件管理的複雜性以及版本相容的挑戰,為後續演算法交易策略的實作奠定了堅實的基礎。然而,本章並未深入探討不同佈署方案的成本效益與效能差異,這對於實際應用中的技術選型至關重要。展望未來,隨著 Serverless 技術的興起和雲端原生應用的普及,預期 Python 演算法交易系統的佈署將更加彈性化和自動化。對於追求高效能和低延遲的交易策略,探索根據 WebAssembly 的 Python 執行環境或編譯型 Python 技術,將是未來提升交易系統效能的關鍵方向。玄貓認為,掌握這些新興技術,並將其整合至現有的 Python 基礎設施,將賦予交易者更大的競爭優勢。