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月28日 星期二

用 Google 試算表製做簡易股票報價表及理財表(整合版) 教學

有鑑於表格分成太多種了,為了方便許多網友使用,所以我做了一個整合版的表格






教學連結依序留在下方(請由上往下服用)
用 Google 試算表製做簡易股票報價表及理財表(更新版) 教學
用 Google 試算表製做歷史股價走勢圖(K線) 教學
用 Google 試算表進行技術分析(雙週線)(月線) 教學
用 Google 試算表抓取第三方資料教學 (以基金淨值為例)
用 Google 試算表抓取上櫃 興櫃股價資料 教學


額外小提醒:
1.抓取上櫃興櫃股票部分,無法使用內建的函式,請參照上方的教學。
2.基金或者是其他第三方資料的抓取,可以參考上方抓取第三方資料教學。
3.獲得表格使用權限後,請記得建立副本之後再編輯,不然之後的使用者會就看不到原本的表格。



不同方法的表格放在左下角不同的分頁
更方便各位網友切換



常用的屬性如下
屬性 - [選用- "price" 為預設] - 要從 Google 財經服務擷取的代號相關屬性。如果指定日期,即須使用這個項目。
  • 屬性指的是下列即時資料:
    • "price" - 即時報價,最多延遲 20 分鐘。
    • "priceopen" - 股市開盤時的價格。
    • "high" - 今天的最高價。
    • "low" - 今天的最低價。
    • "volume" - 今天的股市交易量。
    • "marketcap" - 股票的市場價值。
    • "tradetime" - 最後成交時間。
    • "datadelay" - 即時資料延遲的時間。
    • "volumeavg" - 平均每日交易量。
    • "pe" - 每股價格/每股盈餘比例。
    • "eps" - 每一股的盈餘。
    • "high52" - 52 週期間的最高價。
    • "low52" - 52 週期間的最低價。
    • "change" - 自上一個交易日收盤以來的價格變化。




整合版表格連結如下
https://docs.google.com/spreadsheets/d/1gnnrWypM-EJbC5Tz_gV-vOlQuzPkVhaa5wOs-go5AbY/edit?usp=sharing




如果需要編輯權限比較好copy的也可以到粉絲團文章下方留言你的mail我直接開權限給你,有不懂的也可以留言討論,也歡迎分享文章,讓更多人獲得實用資訊。

還沒有去粉絲團按讚追蹤的也請手刀加速,前往支持,以收到最新的實用資訊喔

如果你覺得我寫的文章不錯
可以按讚給我支持與鼓勵
https://www.facebook.com/IEPSYfinancenote/


新成立的ig歡迎追蹤:iepsyfinancenote
https://www.instagram.com/iepsyfinancenote/
 

2019年5月27日 星期一

"程式教學"R語言的流程控制(for, while, ifelse)

流程控制 代表在程式執行時,指令、子程式或求值的順序
前面我們講過邏輯判斷,沒看過的記得先去看看
https://hn28082251.blogspot.com/2019/05/r-variable-type-logical.html
接下來要講條件判斷與迴圈

迴圈
for :通常用於已知要迭代幾次的情況使用

for (條件){
    要持續執行的程式
}
以下我們用內建的month.name來操作
month.name裡面有所有月份的英文
程式如下
for(month in month.name ){
  print(month)

}
如此一來就可以把每個月份都打印出來了

while:通常不知道要迭代幾次,執行到條件終止為止
程式如下
while(條件){
       執行程式
}
一樣用剛剛的month.name來操作
在最後一行讓i持續加1後
因迴圈會反覆執行,當i變成13的時候
條件不成立,所以程式終止執行





條件判斷if else

if('條件'){
 '做A'
 }else{
 '做B' 
}

來看看下面這個例子
如果條件成立就執行上面那行
如果條件不成立就執行else那行

也可以用比較簡化的寫法一行達成
if(條件)  '做A' else '做B'

還有ifelse的寫法
ifelse('條件', '條件若成立:做A', '條件若不成立:做B')

還有if 、else if 、else多重條件判斷

if(條件一){
做A
}else if(條件二){
做B
}else{
做C
}
比如說我們來寫個依據氣溫來判斷要去哪裡運動

如果我們把氣溫改成42的話呢

這樣大家有理解流程控制的用法了嗎?

下一篇來簡單介紹一下混合使用迴圈與流程控制
還有break 與next的用法



本教學內容參考自“輕鬆學習R語言”與iT邦幫忙網站

https://ithelp.ithome.com.tw/


"花掉的錢都會自己流回來"讀後感--啟動金錢螺旋,用錢越多反而更有錢

花掉的錢都會自己流回來




花掉的錢都會自己流回來的作者是Mentalist DaiGo


原本以為這只是一本普通的理財書,但除了金錢,作者還討論了很多不同主題。例如心流體驗、六度分隔理論、互惠原理、弱連結...因為大學是心理系的,我原本就有些瞭解,但整本讀完,搭配這幾年的經歷去思考,頗有收穫


以下簡單概述一下我覺得在我們生活之中有相關的一些想法與思考方式。
將興趣收益化 

將興趣收益化,然後把賺到的錢重新投入到興趣中,這就是本書封面所指的"金錢螺旋"。作者建議將興趣收益化的第一步是要讓身邊所有人都知道"我喜歡什麼",就是說我對自己喜歡的事有多擅長,且具體來說在這件事上我能做到怎樣的成果


其實這種宣傳在某種程度上也是“積極展現主動性”的一種,把自己當成一間公司的話,該如何宣傳才能夠拓展這間公司的業務。興趣可以讓我們在一個領域內前進一段時間,但在這個過程中,也必須有一些財務上的回饋當作推力(比如說額外的收入),才能走得更穩更遠,啟動你的金錢螺旋。


建立金錢螺旋的四個步驟
1.找到自己真正興趣
2.徹底投入於自己的興趣之中
3.想方設法將興趣和收入作連結
4.從興趣中得到收入,再投資



將興趣收益化進行投資的七個原則 
這邊作者進一步討論賺來的錢要進行再投資的時候,可以注意以下七點
1.買經驗比買東西重要,經驗可以在未來變成你賺錢的知識,但是東西大部分都會折舊,在未來變的無價值。
2.買價值大於價格的東西 ,比如說我買了一台五萬塊的電腦,這台電腦在未來可以幫我創造出超過五萬的價值,那就值得買。
3.把錢花在買書上 ,買書是最好的投資,好的書濃縮了作者的知識與經驗,我們只要花幾百塊就可以買到這些充滿價值的知識。
4.把錢用在別人身上 ,捨得花些錢讓朋友不吃虧,在未來人生中的許多時刻需要這些朋友幫助時,不會孤單。
5.把錢拿來打造一個值得信賴的團隊 ,好的團隊會在未來幫助你迎接許多挑戰,而且跟不同類型的人深交,你的路會越走越寬。
6.為了減少麻煩事,花錢買時間 ,比如說花錢買個記帳程式,可能會好過你自己寫一個記帳的表格,而且效果更好,該花錢讓專業的人處理的事情,就要捨得花錢。
7.把錢投入到能讓力量最大化的組合 ,前面都滿足了之後,切記要再投資,持續提升自己的能力,讓自己獨一無二,才能夠掌握議價的權力。


最後,清楚的知道自己喜歡的是什麼,才有可能抓住偶然找上門的機會,並努力地朝著成功的目標邁進。

如果你什麼都沒準備,那機會來臨之時,你也只能夠望著他如時間流逝

2019年5月26日 星期日

"程式教學"R語言的變數類型,文字(character),日期(Date),時間(POSIXct、POSIXt)

前面講了R語言的變數類型(type),還有一些邏輯判斷
沒有讀過的記得先去看看
https://hn28082251.blogspot.com/2019/05/r-variable-type-logical.html


接下來要講講文字,日期,時間這三種類型

文字(character)
在R語言中我可以使用單引號(')或者雙引號(")來建立文字(character),我在比較習慣用雙引號,以下來做個範例
把我的名字放進my_name這個變數
my_name <- "salam"



日期(Date)
在R語言中,日期(Date)看起來跟文字很像,但我們把它放進class()之中檢驗,就可以發現它的不同了。
以下示範用sys.Date(),這個函數是可以取得電腦系統的日期。



日期可以被轉換成整數,原因是系統日期轉換的依據,是以1970年1月1日當作0,在這一天以後的每一天就+1,前一天則-1,有很多系統都是以這樣來做為依據。
所以日期其實可以進行四則運算。


時間(POSIXct、POSIXt)
在R語言中,和日期類似,感覺起來和文字也沒有甚麼差別,但一樣放進class()之中檢驗,就可以發現它的不同了。
以下示範用Sys.time(),這個函數是可以取得電腦系統的時間



與日期類似可以被轉換成整數,原因是系統時間轉換的依據,是以1970年1月1日格林威治標準時間0時0分0秒當作0,在這一瞬間的以後每一秒就+1,前一秒則-1,有很多系統都是以這樣來做為依據。

ps.如果跟我一樣在台灣的話,系統的時區是中原標準時間,則基準時間會是1970年1月1日08時0分0秒。

講到這裡變數大部分都介紹完了,接下來要講講變數的判斷與轉換。



本教學內容參考自“輕鬆學習R語言”與iT邦幫忙網站
https://ithelp.ithome.com.tw/

美食嚐鮮--『捷運市政府站』福州乾拌麵

台北市忠孝東路四段553巷2弄9號 (捷運市政府站) 

週六的時候跟高中同學逛完展,去覓食的路上,發現在市政府捷運站後面,有間平價的小吃店


看起來就像一般的巷口麵店


整體來說價格在台北算是非常平價的(沒有那種吃起來每一口都是房租的感覺)
菜單




同行的老鄂點了紅油炒手麵,還有一份燙高麗菜,高麗菜我覺得很推薦,拌的佐料跟紅蔥頭很香



旁邊貼了福州乾拌麵食用三部曲

福州乾拌麵食用三部曲



1.麵+醋=福州乾拌麵的吃法
2.麵+醋+辣渣=吃起來有點辣又不會太辣
3.麵+醋+辣渣+辣油=吃起來可以讓你噴火


看到這裡

我還不加爆!!!

下面的是原本的麵

接下來是加好加滿的樣子(辣油加下去都流到下面去了所以看不太出來)


結論,真的很香很辣又很爽,辣渣香又不會太辣,辣油辣得很徹底,吃完隔天應該會有其他的地方噴火......


總之是一間還滿推薦的店,平價又可以吃得飽,適合肥宅不知道要吃啥又不想吃速食的比較健康選擇。




經濟日報數位訂閱懶人包

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