顯示具有 技術分析 標籤的文章。 顯示所有文章
顯示具有 技術分析 標籤的文章。 顯示所有文章

2019年5月30日 星期四

"程式教學"簡單入門python預測股價-使用stocker套件(更新版教學下)

上一篇教學簡單介紹了如何讀取資料以及快速建立模型,並使用Changepoint Prior,來進行模型調整
https://hn28082251.blogspot.com/2019/05/python-stocker-new-session1.html

如果沒有看過的一定要先去看看

evaluate_prediction這個函式,目的是來模擬我們跟著程式預測去下單的結果,也就是說我們將使用模型預測給出的策略,與我們在整個期間純粹買進並持有股票的策略進行一個對比。

接下來輸入這行程式碼並且執行
esun.evaluate_prediction(nshares=1000)
nshares=1000代表我們用1000股去做模擬
評估時間為2018-05-28 00:00:00 to 2019-05-28


本函式的原理如下
The strategy from the model states that for a given day, we buy a stock if the model predicts it will increase. If the model predicts a decrease, we do not play the market on that day. Our earnings, if we bought the stock, will be the change in the price of the stock over that day multiplied by the number of shares. Therefore, if we predict the stock will go up and the price does go up, we will make the change in price times the number of shares. If the price goes down, we lose the change in price times the number of shares.

 1、當模型預測股價會上漲的那一天,會買入,並在一天結束時賣出。當模型預測股價下跌時,我們就不買入任何股票;
The strategy from the model states that for a given day, we buy a stock if the model predicts it will increase. If the model predicts a decrease, we do not play the market on that day. 
 2、如果購買股票價格在當天上漲,那麼我們就把股票上漲的幅度乘以我們購買的股票的數量; if we predict the stock will go up and the price does go up, we will make the change in price times the number of shares. 
3、如果購買的股票價格下跌,我們就把下跌的幅度乘以股票的數量,計作我們的損失。If the price goes down, we lose the change in price times the number of shares.





執行後Stocker就會以數字和圖表顯示的方式告訴我們這個策略是如何進行的



從上方的模型預測可看到
The total profit using the Prophet model = $6150.00.
The Buy and Hold strategy profit =         $4850.00.


有點出乎我意料的,在這個資料集,模型的預測竟然跑贏了買進並且持有的狀況,我在測試的時候有用台積電股價做測試,結果買進並且持有的獲利勝過頻繁進出。

不過在台股大家要知道買進賣出光是手續費跟稅就會讓人自己扣血了,這個程式並沒有把這些算進去,如果要直接拿來應用在台股上,我只能說要三思阿XD




最後我們有了一個優化後的模型,然後就可以使用predict_future()函數來對股票未來價格的進行預測。

關於這個函數的詳細說明如下
Makes a prediction for the specified number of days in the future using a prophet model trained on the assigned number of years of data. Printed output is the days on which the stock is expected to increase and the days when it is expected to decrease. A graph also shows these results with confidence intervals for the prediction. ​



然後我們輸入下方這個程式碼
esun.predict_future(days=10)

esun.predict_future(days=100)
分別預測10天後與100天後的股價
輸入之後按下執行

會跑出兩張圖







現在你已經學會用Stocker預測股價了,事實上,如果我們想使用這個模型策略進行交易(我基本上是不建議啦),最好每天都更新資料,然後訓練新的模型,然後預測三天內的價格就好,這套系統的用法有點類似讓電腦去看懂趨勢,並且做預測,總結來說,我覺得這個模型的意義,在於讓大家能夠開心的玩轉python程式,而非拿來賺錢。

這系列文終於更新完了,雖然我們可能沒有辦法用Stocker賺大錢,但是我覺得重點在於coding的過程而不是有沒有賺錢的結果!就算最終失敗,也好過從不嘗試!

You can't connect the dots looking forward; you can only connect them looking backwards.--Steve Jobs

"你無法預先把點點滴滴串連起來;只有在未來回顧時,你才會明白那些點點滴滴是如何串在一起的"--賈伯斯

就像在國中時,我第一次接觸到程式,第一次用c++寫出了一台計算機的時候,我像在沙灘上撿到貝殼的孩子那樣的開心了一整天,我也從來沒想過,過去的那些嘗試與失敗,會讓現在的我走到這麼遠。


我也還在學習的路上,幸運的是身邊有許多大神不吝指導我,距離成功目標的路還很長,但只要開始走就不會遠,祝大家在coding and debug的路上不孤單~


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

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



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



"程式教學"簡單入門python預測股價-使用stocker套件(更新版教學上)

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

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

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

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


本文的示範資料集與程式碼我把他打包好放在雲端了
使用方式與雲端連結請點下方
https://hn28082251.blogspot.com/2019/05/python-stocker-data-code.html








本次環境使用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/2018",TODAY(),"daily" ) ,"Select Col1",1),"offset 1",0))},"YYYY-MM-DD")),query(googlefinance("2884","ALL","1/1/2018",TODAY(),"daily" ) ,"Select Col4,Col2,Col5,Col3",1)}
以上是從2018年開始抓
詳細的抓取步驟可以參照下方這篇
https://hn28082251.blogspot.com/2019/04/python-stocker.html





再來說說我們要用的stocker套件

如果大家有照著下方的教學打開程式碼後
https://hn28082251.blogspot.com/2019/05/python-stocker-data-code.html


可以開始按上方run那個鍵


導入Stocker:

 from stocker import Stocker


這部分可能有些第一次使用的人會出現很多錯誤
通常是因為缺少相關套件
所需套件如下
quandl==3.3.0
matplotlib==2.1.1
numpy==1.14.0
fbprophet==0.2.1
pystan==2.17.0.0
pandas==0.22.0

pytrends==4.3.0

通常anaconda會預載matplotlib、numpy、pandas、pytrends

所以缺少的套件quandl、pystan、fbprophet就需要手動安裝

mac的使用者直接進終端機,然後依序輸入下方程式並執行
pip install quandl
pip install pystan
pip install fbprophet

windows的使用者則去開始功能表打開anaconda資料夾
找到裡面一個長得像命令提示字元,名稱叫做Anaconda Prompt的程式執行,然後依序輸入下方程式並執行

pip install quandl
conda install pystan
conda install -c conda-forge fbprophet


如果以上執行成功代表我們有抓到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代表要預測幾天後的股價




由此可見這裡預測的十天後(6/7)玉山金的股價為26.62

是不是很簡單呢?


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




教的是如何使用Changepoint Prior,來進行模型調整
官方說明如後
Changepoints represent where a time series goes from increasing to decreasing or from increasing slowly to increasingly rapidly (or vice versa). They occur at the places with the greatest change in the rate of the time series. The changepoint prior scale represents the amount of emphasis given to the changepoints in the model. This is used to control overfitting vs. underfitting (also known as the bias vs. variance tradeoff).

簡單的來說就是控制overfitting(過擬和) 跟 underfitting(欠擬和)

overfitting(過擬和)是指,使用過多參數,以致太適應資料,太適應資料可能會在未來預測的時候失準
underfitting(欠擬和)是使用太少參數,以致於不適應資料



在上方教學中,我們已經學會如何快速建模,不過我們要來評估模型的預測效果如何,就用下方的程式碼來用過去資料來看看三個月前開始預測效果如何


esun.evaluate_prediction(start_date='2019-02-04', end_date='2019-05-28')

執行後如下

紅線之前代表訓練集的數據,紅線後代表開始預測,可以看得出來,並不是很理想!!!
但不要因此放棄,因為一開始全部都使用默認的參數,所以我們要開始去調整我們的模型,


趨勢變化過度擬合(靈活性太大)或不足(靈活性不夠),我們可以使用輸入參數調整稀疏之前的強度changepoint_prior_scale。默認情況下,此參數預設為0.05。增加它將使趨勢更加靈活

我們輸入下方這行程式碼並且執行

esun.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2]) 

可以得到下方這張圖


可以看到在不同的changepoint_priors下,擬合的狀況也不太相同


接下來我們在更詳細的比較不同的changepoint_priors下,一些其他的參考值
程式碼如下
esun.changepoint_prior_validation(start_date='2018-01-04', end_date='2019-01-03', changepoint_priors=[0.001, 0.05, 0.1,0.15, 0.2, 0.25,0.4, 0.5, 0.6])





基於不同changepoint_priors下,訓練和測試準確性曲線和不確定性曲線


大致上可以看得出來,在changepoint_priors=0.1的時候效果較好


於是我們就把changepoint_prior_scale設成0.1吧!請加入下方的程式碼並執行

esun.changepoint_prior_scale = 0.1

然後再去看我們的模型

一樣用下方的程式碼
esun.evaluate_prediction(start_date='2019-02-04', end_date='2019-05-28')


可以發現預測的走勢比較貼近我們的現實數據了,這顯示了模型優化​​的重要性。使用默認值可以初步預測,但是我們需要調整模型的設定,來讓模型效果更好。

下一篇會講講比較參考模型進行買進賣出或者是單純持有之間的差異,以及用修正後的模型進行預測


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


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


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



2019年5月29日 星期三

"程式教學"簡單入門python預測股價-使用stocker套件(程式碼與資料集)


這篇文章整理了使用stocker套件的程式碼與資料集
點擊下方連結
https://drive.google.com/file/d/1eDw1lvRb8W4fo29Q4ngJsNoMVup9xSus/view?usp=sharing




打開之後會像下面這樣
可以用excel開啟的csv檔是資料集

打開anaconda後開啟jupyter後進到下載來的資料夾把stocker.ipynb開啟,確定可以執行就可以了。












2019年5月15日 星期三

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

沒有看過基礎概念的請先看下方連結
http://hn28082251.blogspot.com/2019/04/python-stocker.html


最近實在忙爆,本來想好好寫完整的教學,現在看來還是先慢慢寫片段,找時間再整合成一篇。
這次來講講evaluate_prediction這個函式,目的式來模擬我們跟著程式預測去下單的結果,也就是說我們將使用模型預測給出的策略,與我們在整個期間純粹買進並持有股票的策略進行一個對比。




本次資料以VTI(Vanguard Total Stock Market ETF)為例,這是我在美股的持股之一,資料集幫大家整理好了,請點選下方連結下載
https://drive.google.com/file/d/1gNPEnttLHBrbfUoiPU41ZMZmJsFy_Z8u/view?usp=sharing


前半段程式都一樣,就是把資料讀進來

相關除錯經驗可參考下方文章留言
https://www.dcard.tw/f/money/p/231112780-%E7%B0%A1%E5%96%AE%E5%85%A5%E9%96%80python%E9%A0%90%E6%B8%AC%E8%82%A1%E5%83%B9-%E4%BD%BF%E7%94%A8stocker%E5%A5%97%E4%BB%B6%EF%BC%88%E4%B8%8A%EF%BC%89

接下來輸入這行程式碼並且執行
vti.evaluate_prediction(nshares=1000)
nshares=1000代表我們用1000股去做模擬
評估時間為2018-05-14 00:00:00 to 2019-05-14






本函式的原理如下
The strategy from the model states that for a given day, we buy a stock if the model predicts it will increase. If the model predicts a decrease, we do not play the market on that day. Our earnings, if we bought the stock, will be the change in the price of the stock over that day multiplied by the number of shares. Therefore, if we predict the stock will go up and the price does go up, we will make the change in price times the number of shares. If the price goes down, we lose the change in price times the number of shares.

 1、當模型預測股價會上漲的那一天,會買入,並在一天結束時賣出。當模型預測股價下跌時,我們就不買入任何股票;
The strategy from the model states that for a given day, we buy a stock if the model predicts it will increase. If the model predicts a decrease, we do not play the market on that day. 
 2、如果購買股票價格在當天上漲,那麼我們就把股票上漲的幅度乘以我們購買的股票的數量; if we predict the stock will go up and the price does go up, we will make the change in price times the number of shares. 
3、如果購買的股票價格下跌,我們就把下跌的幅度乘以股票的數量,計作我們的損失。If the price goes down, we lose the change in price times the number of shares.





執行後Stocker就會以數字和圖表顯示的方式告訴我們這個策略是如何進行的

從上方的模型預測可看到
The total profit using the Prophet model = $23360.00.
The Buy and Hold strategy profit =         $6890.00.

有點出乎我意料的,在這個資料集,模型的預測竟然跑贏了買進並且持有的狀況,我在測試的時候有用台積電股價做測試,結果買進並且持有的獲利勝過頻繁進出。


不過在台股大家要知道買進賣出光是手續費跟稅就會讓人自己扣血了,這個程式並沒有把這些算進去,如果要直接拿來應用在台股上,我只能說要三思阿XD



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

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

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






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)

將探吉帶去日本系列-1(赫曼陸龜Testudo hermanni)

 因為接下來要去日本唸書 所以也要把探吉帶去日本 赫曼陸龜(學名:Testudo hermanni) 目前把北部能查的到的代辦寵物移民的問了一圈 得到的回覆是都沒有代辦陸龜 所以得開始研究自己辦理了 (或者有大大知道台灣誰有代辦陸龜出國的可以私訊我,感恩) 孟恭帶邱口去歐洲那間我...