2019年4月17日 星期三

"程式教學"簡單入門python預測股價-使用stocker套件(初探)

一直以來對於寫這種文章我是有疑慮的

預測證券市場走勢是一項非常有誘惑力的事情,但是一旦稍有不慎或是過度相信程式,很有可能在黑天鵝事件來臨時,粉身碎骨。

我個人認為,與其努力的在每日獲利上能夠跑贏大盤,不如好好享受在運用程式預測的練習中,學習資料視覺化,程式設計,模型訓練這些領域,說不定在這個領域所學應用在工作上提升的收入,會比投資炒股多很多XD

本篇文章會讓大家簡單地做出像下方的股價預測圖,及預測未來的股價


========================================
本次環境使用anaconda裡面的jupyter
不會操作的請先參考這篇

https://hn28082251.blogspot.com/2019/02/python-mac-os-anaconda.html


我們先來建立個過去股價的資料
這裡用的方法是用google試算表抓資料
詳細方法請參考以下教學
https://hn28082251.blogspot.com/2019/04/google-spreadsheets-stock.html
https://hn28082251.blogspot.com/2018/12/google-k.html

我們在這裡用我在台股的唯一持股玉山金為例
程式碼先幫大家寫好
可以直接複製
={ArrayFormula(text({"Date";int(query(query(googlefinance("2884","ALL","1/1/2016",TODAY(),"daily" ) ,"Select Col1",1),"offset 1",0))},"YYYY-MM-DD")),query(googlefinance("2884","ALL","1/1/2016",TODAY(),"daily" ) ,"Select Col4,Col2,Col5,Col3",1)}
以上是從2016年開始抓
然後因為我們只要收盤價,所以就複製那兩欄
剪下後,然後開一個新的試算表貼上去
記得要選擇僅貼上值,然後把最上面兩格,一個改成date,一個改成price
然後把試算表檔案用csv的格式下載下來


再來說說我們要用的stocker套件
去github上面把檔案抓下來
建議抓整包


大家去把它下載下來,Stocker是一款用於探索股票情況的Python工具。一旦我們安裝了所需的package,我們可以在的同一資料夾中啟動一個Jupyter Notebook

下面的圖片因為我把資料夾單獨複製出來取名,所以可能會跟操作者看到的不太一樣


然後把我們剛剛抓下來的股價csv檔名改成price2884放進同一個資料夾中

然後開jupyter後進到那個Data-Analysis 資料夾
再進入裡面的 stocker 資料夾
接下來就在同一個資料夾裡用jupyter建立一個ipynb的檔案

導入Stocker:

from stocker import Stocker




如果以上執行成功代表我們有抓到package了

再來把股價資料讀取進來
import pandas as pd

### 讀入series
df = pd.read_csv('price2884.csv', index_col='date', parse_dates=['date'])
price = df.squeeze()

price.head()
確定資料格式沒有問題

再來讀取價格資料放進一個變數中

from stocker import Stocker

esun = Stocker(price)
確定時間沒問題後,就可以開始預測了

預測的程式如下 
model, model_data = esun.create_prophet_model(days=10)

#days代表要預測幾天後的股價

由此可見這裡預測的十天後(4/26)玉山金的股價為24.43元

是不是很簡單呢?

預測結果的綠線包含了相對應的信賴區間,這代表在模型預測的不確定性。在這種情況下,如果將信賴區間寬度設置為80%,這意味著我們預計這個範圍將包含實際值的可能性為80%。信賴區間將隨著時間推移會越來越大,這是因為隨著預測時間距離現有數據的時間越來越遠,預測值將面臨更多的不確定性,就像預測天氣一樣。

以上就是使用stocker套件進行股價預測的簡單教學,接下來會講解運用一些方式來檢驗預測的結果。

本文章並沒有推薦任何投資標的,單純是個人的一些觀察與見解,為作者自行查看相關資料後整理而成,資料之正確性以各官方公告為主,任何人觀看本文之後,而有投資該股票基金或ETF之行為,自行對所有後果負責。 

歡迎分享轉載文章,願每一個人都能夠衣食無虞。 

我將思想傳授他人,他人之所得,亦無損於我之所有;猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。湯瑪斯‧傑弗遜(Thomas Jefferson)

40 則留言:

  1. 請教一下
    為何我抓不到package







    ---------------------------------------------------------------------------
    ModuleNotFoundError Traceback (most recent call last)
    in
    ----> 1 from stocker import Stocker

    ~\Desktop\Data-Analysis-master\stocker\stocker.py in
    1 # Quandl for financial analysis, pandas and numpy for data manipulation
    2 # fbprophet for additive models, #pytrends for Google trend data
    ----> 3 import quandl
    4 import pandas as pd
    5 import numpy as np

    ModuleNotFoundError: No module named 'quandl'

    回覆刪除
    回覆
    1. 去開始功能表anaconda裡找Anaconda prompt
      打開後然後輸入下面這個指令
      pip install quandl

      刪除
  2. 請教一下

    esun = Stocker(price)
    再來讀取價格資料放進一個變數中 , 是甚麼變數 感謝
    ---------------------------------------------------------------------------
    AttributeError Traceback (most recent call last)
    in
    1 from stocker import Stocker
    2
    ----> 3 esun = Stocker(price)

    ~\Desktop\Data-Analysis-master\stocker\stocker.py in __init__(self, ticker, exchange)
    21
    22 # Enforce capitalization
    ---> 23 ticker = ticker.upper()
    24
    25 # Symbol is used for labeling plots

    ~\Anaconda3\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
    5065 if self._info_axis._can_hold_identifiers_and_holds_name(name):
    5066 return self[name]
    -> 5067 return object.__getattribute__(self, name)
    5068
    5069 def __setattr__(self, name, value):

    AttributeError: 'Series' object has no attribute 'upper'

    回覆刪除
    回覆
    1. 然後你這個錯誤
      解決方法應該是要去終端機下
      pip install -v pandas==0.22.0
      這個指令

      刪除
    2. 不好意思
      想請問一下
      我也遇到同樣問題
      但是已經有裝pandas了
      問題還是一樣
      想請問還有什麼可能原因嗎?

      刪除
  3. ---------------------------------------------------------------------------
    ModuleNotFoundError Traceback (most recent call last)
    in
    ----> 1 from stocker import Stocker

    ~\Desktop\stocker\stocker.py in
    4 import pandas as pd
    5 import numpy as np
    ----> 6 import fbprophet
    7 import pytrends
    8 from pytrends.request import TrendReq

    ModuleNotFoundError: No module named 'fbprophet'
    請問這個問題如何解決?

    回覆刪除
    回覆
    1. 開啟Anaconda Prompt
      下 pip install fbprophet

      刪除
    2. 請問版主 打完pip install fbprophet 跑完後出現紅字:

      Command "C:\Users\Chanyan\Anaconda3\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\Chanyan\\AppData\\Local\\Temp\\pip-install-oth3146q\\pystan\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\Chanyan\AppData\Local\Temp\pip-record-d2fi5mj4\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\Chanyan\AppData\Local\Temp\pip-install-oth3146q\pystan\
      請問該如何解決

      刪除
    3. 缺少pystan
      變成要先
      pip install pystan

      刪除
    4. 請問輸入完後跑出紅字 : failed building wheel pystan
      是甚麼樣子的問題

      刪除
    5. 你可能還缺了一個編譯器
      去下
      pip install libpython m2w64-toolchain -c msys2

      刪除
    6. 這是接下來出現的 Could not open requirements file: [Errno 2] No such file or directory: 'msys2'

      刪除
  4. 這是接下來出現的 Could not open requirements file: [Errno 2] No such file or directory: 'msys2'

    回覆刪除
    回覆
    1. 把下載下來的stocker檔案
      用下面這個連結下載的覆蓋掉看看
      https://drive.google.com/open?id=14zQ_JAZYei8yCaNP4N3CYsU3DOuHLFzj

      刪除
  5. 我也跟你一樣出現這樣的結果欸
    請問後來怎麼解決呢~

    回覆刪除
    回覆
    1. 樓上兩位可以把下載下來的stocker檔案
      用下面這個連結下載的覆蓋掉看看
      https://drive.google.com/open?id=14zQ_JAZYei8yCaNP4N3CYsU3DOuHLFzj

      刪除
  6. ImportError Traceback (most recent call last)
    in
    ----> 1 from stocker import Stocker

    ~\Desktop\Data-Analysis-master\stocker\stocker.py in
    1 # Quandl for financial analysis, pandas and numpy for data manipulation
    2 # fbprophet for additive models, #pytrends for Google trend data
    ----> 3 import quandl
    4 import pandas as pd
    5 import numpy as np

    D:\Anaconda3\lib\site-packages\quandl\__init__.py in
    5 from .errors.quandl_error import *
    6
    ----> 7 from .model.database import Database
    8 from .model.dataset import Dataset
    9 from .model.datatable import Datatable

    D:\Anaconda3\lib\site-packages\quandl\model\database.py in
    3 from six.moves.urllib.parse import urlencode, urlparse
    4
    ----> 5 import quandl.model.dataset
    6 from quandl.api_config import ApiConfig
    7 from quandl.connection import Connection

    D:\Anaconda3\lib\site-packages\quandl\model\dataset.py in
    3 from quandl.util import Util
    4 from .model_base import ModelBase
    ----> 5 from .data import Data
    6 from .data_list import DataList
    7 import quandl.model.database

    D:\Anaconda3\lib\site-packages\quandl\model\data.py in
    ----> 1 from quandl.operations.data_list import DataListOperation
    2 from quandl.util import Util
    3 from .model_base import ModelBase
    4 from .data_mixin import DataMixin
    5

    D:\Anaconda3\lib\site-packages\quandl\operations\data_list.py in
    ----> 1 from quandl.model.data_list import DataList
    2 from .list import ListOperation
    3 from quandl.errors.quandl_error import (InvalidDataError, ColumnNotFound)
    4 from quandl.message import Message
    5

    D:\Anaconda3\lib\site-packages\quandl\model\data_list.py in
    1 from .model_list import ModelList
    ----> 2 from .data_mixin import DataMixin
    3
    4
    5 class DataList(DataMixin, ModelList):

    D:\Anaconda3\lib\site-packages\quandl\model\data_mixin.py in
    ----> 1 import pandas as pd
    2 from quandl.errors.quandl_error import ColumnNotFound
    3
    4
    5 class DataMixin(object):

    D:\Anaconda3\lib\site-packages\pandas\__init__.py in
    49 from pandas.io.api import *
    50 from pandas.util._tester import test
    ---> 51 import pandas.testing
    52 import pandas.arrays
    53

    D:\Anaconda3\lib\site-packages\pandas\testing.py in
    5 """
    6
    ----> 7 from pandas.util.testing import (
    8 assert_frame_equal, assert_index_equal, assert_series_equal)

    D:\Anaconda3\lib\site-packages\pandas\util\testing.py in
    18 from numpy.random import rand, randn
    19
    ---> 20 from pandas._libs import testing as _testing
    21 import pandas.compat as compat
    22 from pandas.compat import (

    pandas/_libs/testing.pyx in init pandas._libs.testing()

    ImportError: cannot import name compat

    請問版大這個錯誤怎麼解決QQ 我爬文爬不到相關的辦法

    回覆刪除
    回覆
    1. 裝好之後依序出現跟上面兩位同樣的問題,覆蓋完雲端下載stocker.py狀況依舊

      刪除
    2. 我找到解法了!

      1.pip install quandl
      2.conda install pystan
      3.conda install -c conda-forge fbprophet

      這樣就可以成功安裝並且正確執行

      刪除
    3. 恭喜,大部分第一次使用的人都是因為缺少這些套件

      刪除

  7. ERROR:fbprophet:Importing plotly failed. Interactive plots will not work.
    ---------------------------------------------------------------------------
    ModuleNotFoundError Traceback (most recent call last)
    in
    ----> 1 from stocker import Stocker

    ~\Desktop\Stocker-master\stocker\stocker.py in
    5 import numpy as np
    6 import fbprophet
    ----> 7 import pytrends
    8 from pytrends.request import TrendReq
    9 from matplotlib import pyplot as plt

    ModuleNotFoundError: No module named 'pytrends'
    pytrends我有安裝

    回覆刪除
    回覆
    1. 1.pip install quandl
      2.conda install pystan
      3.conda install -c conda-forge fbprophet

      刪除
  8. 作者您好~ 想請教這個套件執行預測時根據的方法,感恩

    回覆刪除
    回覆
    1. 詳細的理論可參考本篇論文
      https://peerj.com/preprints/3190/

      刪除
  9. ModuleNotFoundError Traceback (most recent call last)
    in
    ----> 1 from stocker import Stocker
    2
    3
    4 esun = Stocker(price)

    ~\Desktop\Data-Analysis-master\Data-Analysis-master\stocker\stocker.py in
    6 import fbprophet
    7 import pytrends
    ----> 8 from pytrends.request import TrendReq
    9
    10 # matplotlib pyplot for plotting

    C:\ProgramData\Anaconda3\lib\site-packages\pytrends\request.py in
    9 import requests
    10
    ---> 11 from pandas.io.json._normalize import nested_to_record
    12 from requests.adapters import HTTPAdapter
    13 from requests.packages.urllib3.util.retry import Retry

    ModuleNotFoundError: No module named 'pandas.io.json._normalize'

    回覆刪除
  10. 您好!如何在VS code 上安裝 stocker 模組呢?
    pip install stocker 是無法安裝的...

    回覆刪除
  11. 作者已經移除這則留言。

    回覆刪除
  12. ---------------------------------------------------------------------------
    AttributeError Traceback (most recent call last)
    in
    1 from stocker import Stocker
    ----> 2 esun = Stocker(price)

    ~/Desktop/Stocker-master/stocker.py in __init__(self, price)
    44
    45 # The starting price (starting with the opening price)
    ---> 46 self.starting_price = float(self.stock.ix[0, 'Adj. Open'])
    47
    48 # The most recent price

    ~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in __getattr__(self, name)
    5272 if self._info_axis._can_hold_identifiers_and_holds_name(name):
    5273 return self[name]
    -> 5274 return object.__getattribute__(self, name)
    5275
    5276 def __setattr__(self, name: str, value) -> None:

    AttributeError: 'DataFrame' object has no attribute 'ix'

    請問版大這個錯誤怎麼解決><

    回覆刪除
    回覆
    1. 我也一樣的bug,嘗試把stocker.py裡面的ix都直接替換成iloc,也無法排除這個error。

      刪除
  13. 請問能把預測出來的資料再轉回excecl嗎?

    回覆刪除
    回覆
    1. 我試過了很多變數,這是其中一個,可是都一直失敗esun.evaluate_prediction.to_excel('prediction.xlsx')

      會跑出這些error
      AttributeError Traceback (most recent call last)
      in
      ----> 1 esun.evaluate_prediction.to_excel('prediction.xlsx')

      AttributeError: 'function' object has no attribute 'to_excel'

      請問該輸出哪個變數才能成功?
      謝謝您的回覆

      刪除
    2. 我不知道該怎麼寫入,對不起...

      刪除
  14. 你好,我目前遇到下面這個問題,版本為3.6,目前能裝的套件都已經安裝,請問是什麼原因?

    ModuleNotFoundError: No module named 'ephem._libastro'

    回覆刪除
  15. 你好 會出現下列錯誤
    "TrendReq" is not defined

    回覆刪除
    回覆
    1. {
      "resource": "/d:/training/Stocker-master/stocker.py",
      "owner": "_generated_diagnostic_collection_name_#0",
      "code": {
      "value": "reportUndefinedVariable",
      "target": {
      "$mid": 1,
      "external": "https://github.com/microsoft/pylance-release/blob/main/DIAGNOSTIC_SEVERITY_RULES.md#diagnostic-severity-rules",
      "path": "/microsoft/pylance-release/blob/main/DIAGNOSTIC_SEVERITY_RULES.md",
      "scheme": "https",
      "authority": "github.com",
      "fragment": "diagnostic-severity-rules"
      }
      },
      "severity": 4,
      "message": "\"TrendReq\" is not defined",
      "source": "Pylance",
      "startLineNumber": 660,
      "startColumn": 20,
      "endLineNumber": 660,
      "endColumn": 28
      }

      刪除

經濟日報數位訂閱懶人包

  去年寫過一篇介紹文,經濟日報推出了數位訂閱產品,如果你是價值投資者,或是對產業研究及經濟數據有興趣的朋友,包含深耕國內外財經深度內容、圖像式產業資料庫、早安經濟日報聽新聞等等。   目前有「彭博新聞獨家聯名、七大外媒授權合作、專家解析深度專欄」三大內容,豐富你的關鍵投...