2022年9月1日 星期四

Python 學習筆記 : 安裝量化投資套件 twstock 與 Ta-Lib

最近打算活化資產, 讓兩台 Pi 3 做量化投資的統計運算 (已空轉好幾年), 在這之前要安裝所需要的 Python 第三方套件, 如下表所示 : 


 量化投資第三方套件 說明
 requests 爬蟲工具, 用來擷取網頁
 BeautifulSoup 爬蟲工具, 用來解析所擷取之網頁
 Matplotlib 繪圖工具, 用來繪製統計圖形
 Pandas 資料分析工具, 用來做資料前處理與時間序列分析
 twstock 擷取台股價量資料 (歷史 & 即時)
 Ta-Lib 技術分析套件, 包含價量之平均, 動能, 量能, 波動, 與型態等指標


其中 requests, BeautifulSoup, Matplotlib, 以及 Pandas 都已經安裝過了, 這幾個套件在 Windows 都可以用 pip install 順利安裝, 在樹莓派上大部分套件用 pip3 install 安裝也沒問題, 只有 Ta-Lib 較麻煩, 必須先用 make 從 0.4.0 版原始碼編譯安裝後, 再用 pip3 install 安裝到最新的 0.4.24 版, 參考 :


以下紀錄安裝程序 (Windows 主要是測試用, 而 Pi 3 則是運轉用) : 


1. 在 Windows 安裝 twstock 與 Ta-Lib : 

在 Windows 安裝 Ta-Lib 與 twstock 都很快 :

D:\test\python>pip install twstock -U    
Requirement already satisfied: twstock in c:\python37\lib\site-packages (1.3.1)
Requirement already satisfied: requests in c:\python37\lib\site-packages (from twstock) (2.21.0)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\python37\lib\site-packages (from requests->twstock) (3.0.4)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in c:\python37\lib\site-packages (from requests->twstock) (1.24.1)
Requirement already satisfied: certifi>=2017.4.17 in c:\python37\lib\site-packages (from requests->twstock) (2018.11.29)
Requirement already satisfied: idna<2.9,>=2.5 in c:\python37\lib\site-packages (from requests->twstock) (2.8)

但 Ta-Lib 不要直接用 pip install Ta-Lib 安裝, 因為過程中會出現編譯錯誤, 必須到州大學爾灣分校網站根據本機 Python 版本與位元長度 (32/64)下載正確的 whl 檔, 然後再用 pip install 離線方式安裝 :




例如本機 Python 是 64 位元 3.7 版, 故要下載上圖中框起來的檔案來安裝 : 

D:\test\python>pip install TA_Lib-0.4.24-cp37-cp37m-win_amd64.whl    
Processing d:\test\python\ta_lib-0.4.24-cp37-cp37m-win_amd64.whl
Requirement already satisfied: numpy in c:\python37\lib\site-packages (from TA-Lib==0.4.24) (1.19.4)
Installing collected packages: TA-Lib
Successfully installed TA-Lib-0.4.24   


2. 在樹莓派 Pi 3 安裝 twstock 與 Ta-Lib : 

在樹莓派安裝 twstock 也很快 : 

pi@raspberrypi:~ $ pip3 install twstock      
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting twstock
  Downloading https://files.pythonhosted.org/packages/38/a0/61e6b65093a7564cb8e34aea54de28113bfe24409fb05e173360fbf5a35d/twstock-1.3.1-py3-none-any.whl (1.9MB)
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from twstock) (2.21.0)
Installing collected packages: twstock
Successfully installed twstock-1.3.1

但安裝 Ta-Lib 卻沒這麼容易, 如果直接用 pip3 install Ta-Lib 安裝會出現很多 C 原始碼的編譯錯誤 :  

pi@raspberrypi:~ $ sudo pip3 install TA-Lib    
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting TA-Lib
  Downloading https://files.pythonhosted.org/packages/78/f5/59f1d7d0c43d3d96e93249ae9d5415b42591362bfcf2f4e50574ad063312/TA-Lib-0.4.24.tar.gz (269kB)

.... (略) .....

  talib/_ta_lib.c:682:10: fatal error: ta-lib/ta_defs.h: 
   #include "ta-lib/ta_defs.h"
            ^~~~~~~~~~~~~~~~~~
  compilation terminated.
  error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
  
  ----------------------------------------
  Failed building wheel for TA-Lib
  Running setup.py clean for TA-Lib
Failed to build TA-Lib
Installing collected packages: TA-Lib
  Running setup.py install for TA-Lib ... - \ | / - error
    Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-mopxrg5g/TA-Lib/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-84sdcdd5/install-record.txt --single-version-externally-managed --compile:
    /tmp/pip-install-mopxrg5g/TA-Lib/setup.py:77: UserWarning: Cannot find ta-lib library, installation may fail.
      warnings.warn('Cannot find ta-lib library, installation may fail.')

.... (略) .....

    talib/_ta_lib.c:682:10: fatal error: ta-lib/ta_defs.h: 
     #include "ta-lib/ta_defs.h"
              ^~~~~~~~~~~~~~~~~~
    compilation terminated.
    error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    ----------------------------------------
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-mopxrg5g/TA-Lib/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-84sdcdd5/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-mopxrg5g/TA-Lib/

在 PyPi 網站的 Ta-Lib 套件說明文件中有 Linux 系統上的安裝方式指引, 參考 :




(1). 下載  Ta-Lib 0.4.0 版原始碼壓縮檔 :  


pi@raspberrypi:~ $ wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz   
--2022-09-01 10:44:33--  http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
正在查找主機 prdownloads.sourceforge.net (prdownloads.sourceforge.net)... 204.68.111.105
正在連接 prdownloads.sourceforge.net (prdownloads.sourceforge.net)|204.68.111.105|:80... 連上了。
已送出 HTTP 要求,正在等候回應... 301 Moved Permanently
位置: http://downloads.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz [跟隨至新的 URL]
--2022-09-01 10:44:33--  http://downloads.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
正在查找主機 downloads.sourceforge.net (downloads.sourceforge.net)... 204.68.111.105
繼續使用和 prdownloads.sourceforge.net:80 的連線。
已送出 HTTP 要求,正在等候回應... 302 Found
位置: http://nchc.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz [跟隨至新的 URL]
--2022-09-01 10:44:33--  http://nchc.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
正在查找主機 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)... 140.110.96.69, 2001:e10:ffff:1f02::17
正在連接 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)|140.110.96.69|:80... 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 1330299 (1.3M) [application/x-gzip]
儲存到:`ta-lib-0.4.0-src.tar.gz'

ta-lib-0.4.0-src.ta 100%[===================>]   1.27M  1.60MB/s  於 0.8s

2022-09-01 10:44:34 (1.60 MB/s) - 已儲存 `ta-lib-0.4.0-src.tar.gz' [1330299/1330299]


(2). 用 tar 解壓縮 :  

pi@raspberrypi:~ $ tar xvf ta-lib-0.4.0-src.tar.gz   
ta-lib/
ta-lib/config.sub
ta-lib/aclocal.m4
ta-lib/CHANGELOG.TXT
ta-lib/include/

.... (略) .....

ta-lib/src/tools/ta_regtest/ta_test_priv.h
ta-lib/src/tools/ta_regtest/ReadMe.txt
ta-lib/src/tools/ta_regtest/ta_gDataLow.c
ta-lib/src/tools/Makefile.in
ta-lib/src/tools/Makefile.am
ta-lib/src/tools/gen_code/
ta-lib/src/tools/gen_code/java/
ta-lib/src/tools/gen_code/java/PrettyCode.java
ta-lib/src/tools/gen_code/java/Main.java
ta-lib/src/tools/gen_code/gen_code.c
ta-lib/src/tools/gen_code/Makefile.in
ta-lib/src/tools/gen_code/Makefile.am
ta-lib/src/tools/gen_code/mcpp.exe


(3). 設定程式存放路徑 : 

由上可知這些原始碼是解壓縮在 ta-lib 子目錄下, 先用 cd 指令切換到此子目錄, 然後用 configure 指令設定程式的存放路徑 : 

pi@raspberrypi:~ $ cd ta-lib    
pi@raspberrypi:~/ta-lib $ ./configure --prefix=/usr   
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out

.... (略) .....

configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/ta_abstract/Makefile
config.status: creating src/ta_common/Makefile
config.status: creating src/ta_func/Makefile
config.status: creating src/tools/Makefile
config.status: creating src/tools/gen_code/Makefile
config.status: creating src/tools/ta_regtest/Makefile
config.status: creating ta-lib-config
config.status: creating ta-lib.spec
config.status: creating ta-lib.dpkg
config.status: creating include/ta_config.h
config.status: executing depfiles commands

參考 :



(4). 用 make 指令編譯原始碼 :  

pi@raspberrypi:~/ta-lib $ sudo make  
Making all in src
make[1]: Entering directory '/home/pi/ta-lib/src'
Making all in ta_abstract
make[2]: Entering directory '/home/pi/ta-lib/src/ta_abstract'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/pi/ta-lib/src/ta_abstract'
Making all in ta_common
make[2]: Entering directory '/home/pi/ta-lib/src/ta_common'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/pi/ta-lib/src/ta_common'
Making all in ta_func
make[2]: Entering directory '/home/pi/ta-lib/src/ta_func'
/bin/bash ../../libtool --tag=CC   --mode=link gcc  -g -O2 -version-info 0:0:0  -o libta_func.la  

.... (略) .....

creating ta_regtest
make[2]: Leaving directory '/home/pi/ta-lib/src/tools/ta_regtest'
make[2]: Entering directory '/home/pi/ta-lib/src/tools'
make[2]: Nothing to be done for 'all-am'.
make[2]: Leaving directory '/home/pi/ta-lib/src/tools'
make[1]: Leaving directory '/home/pi/ta-lib/src/tools'
make[1]: Entering directory '/home/pi/ta-lib'
make[1]: Nothing to be done for 'all-am'.
make[1]: Leaving directory '/home/pi/ta-lib'


(5). 用 make install 安裝程式 : 

pi@raspberrypi:~/ta-lib $ sudo make install   
Making install in src
make[1]: Entering directory '/home/pi/ta-lib/src'
Making install in ta_abstract
make[2]: Entering directory '/home/pi/ta-lib/src/ta_abstract'
make[3]: Entering directory '/home/pi/ta-lib/src/ta_abstract'
make[3]: Nothing to be done for 'install-exec-am'.

.... (略) .....

make[3]: Leaving directory '/home/pi/ta-lib/src/tools'
make[2]: Leaving directory '/home/pi/ta-lib/src/tools'
make[1]: Leaving directory '/home/pi/ta-lib/src/tools'
make[1]: Entering directory '/home/pi/ta-lib'
make[2]: Entering directory '/home/pi/ta-lib'
test -z "/usr/bin" || /usr/bin/mkdir -p "/usr/bin"
 /usr/bin/install -c 'ta-lib-config' '/usr/bin/ta-lib-config'
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/pi/ta-lib'
make[1]: Leaving directory '/home/pi/ta-lib'

這樣就完成 Ta-Lib 0.4.0 版的安裝了. 


(6). 用 pip3 install Ta-Lib 升至最新版 : 

這時再用 sudo pip3 install Ta-Lin 指令安裝就可以順利安裝最新版的 0.4.24 版, 不會出現錯誤 : 

pi@raspberrypi:~/ta-lib $ sudo pip3 install TA-Lib    
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting TA-Lib
  Using cached https://files.pythonhosted.org/packages/78/f5/59f1d7d0c43d3d96e93249ae9d5415b42591362bfcf2f4e50574ad063312/TA-Lib-0.4.24.tar.gz
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (from TA-Lib) (1.16.2)
Building wheels for collected packages: TA-Lib
  Running setup.py bdist_wheel for TA-Lib ... done
  Stored in directory: /root/.cache/pip/wheels/14/b3/21/c411da8eb6ed49519862798a2b5cc01add3c1bf7c026ebb005
Successfully built TA-Lib
Installing collected packages: TA-Lib
Successfully installed TA-Lib-0.4.24   

用 pip3 show Ta-Lib 指令確認目前確實是 0.4.24 版 :

pi@raspberrypi:~/ta-lib $ cd ..    
pi@raspberrypi:~ $pi@raspberrypi:~ $ pip3 show Ta-Lib    
Name: TA-Lib
Version: 0.4.24
Summary: Python wrapper for TA-Lib
Home-page: http://github.com/mrjbq7/ta-lib
Author: John Benediktsson
Author-email: mrjbq7@gmail.com
License: BSD
Location: /usr/local/lib/python3.7/dist-packages
Requires: numpy
Required-by:

Bingo! 大功告成啦! 

以上先編譯 0.4.0 版原始碼安裝舊版 Ta-Lib, 然後再用 pip3 install Ta-Lib 安裝最新版程序能夠成功的原因, 我猜應該是編譯安裝舊版時已經處理掉原始碼中部份 C 程式的編譯問題 (新版 0.4.24 也會用到相同的程式), 所以用 pip3 install 從 PyPi 安裝新版時就不再有原始碼編譯失敗問題了. 

沒有留言 :