顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2020年4月24日 星期五

"程式教學"R語言混合使用迴圈與流程控制

接下來要談談,寫程式中非常重要的環節,混合應用迴圈與流程控制,其實任何我們看到的應用程式,基本上都是用無數的迴圈跟條件判斷(流程控制)堆疊出來的,也就是說只要熟悉以上的使用方式,基本上就能夠寫出簡易的小程式了。

先來複習一下條件判斷(流程控制)
R語言裡面主要是使用if、else if、與else來做判斷
如果只有一個條件
那就是if跟else組成
我們先來看程式碼

if條件一成立
執行程式一
如果條件一沒有成立的話
則執行程式二



舉實例來說
指定a為2
b為3
然後做兩者的大小判斷



不過可以發現,以上這個條件沒有考慮到如果兩者相等怎麼辦

所以如果有兩個條件以上的話
就會使用if、else if、與else

以上面那個例子來說
就是這樣寫

接著我們來複習一下迴圈for跟while

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

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

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

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


接下來就是混合使用了

這裡還要介紹兩個東西
break與next

break是在迴圈執行過程中,離開當前的迴圈

next則是滿足某條件時,略過該次執行的程式

我們先來講break

一樣是用內建的month.name

可以看到,在程式執行到April的時候,就會離開迴圈
所以只會輸出April以前的月份


接下來使用next

則可以發現April被跳過了沒有輸出

以上就是迴圈混合條件判斷與next及break的一些用法

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



2019年9月16日 星期一

One-Hot Encoding簡介與keras中用法

One-Hot Encoding又稱為一位有效編碼
在keras中可用以下程式碼進行
from keras.utils import np_utils
y_train_label_OneHot=np_utils.to_categorical(y_train_label)
y_test_label_OneHot=np_utils.to_categorical(y_test_label)
從下圖可看到
把原本的y_train_label原本是0~9不等的數字
轉換後存入y_train_label_OneHot
原本是[6]就變成[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.]
[9]就變成[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]
轉換後有兩個優點
1.能夠處理非連續型的分類變量。
2.在一定程度上也擴充了特徵,讓特徵之間更稀疏。


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月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/


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/

2019年5月25日 星期六

"程式教學"R語言的變數類型(variable type)邏輯值(logical)與判斷條件

前一篇文章我們講了一些變數的類型,如果沒有看過的記得先去看。
https://hn28082251.blogspot.com/2019/05/r-variable-type.html


接下來要講講邏輯值(logical),當我們要進行判斷條件的時候就會使用到邏輯值,邏輯值只有兩個TRUE跟FALSE,也可以用T跟F代替,我們一樣用左下角命令列(Console)逐一輸入這些程式,來詢問括弧中的變數為何






要記得,R語言是對大小寫很敏感的,所以如果你把FALSE寫成False就不會被識別成邏輯值。



接下來我們講講判斷條件
來看看常見的判斷運算子,大致上跟其他語言很像
==      等於
>        大於
<        小於
>=      大於等於
<=      小於等於
!=       不等於
%in% 包含



除了直接輸入邏輯值,也可以用判斷條件來得到邏輯值。

%in%  這個之後會再來講
關於邏輯值(logical)與判斷條件大致上就是這樣,接下來會講講其他變數類型,文字,日期,時間。




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

2019年5月24日 星期五

"程式教學"R語言的變數類型(variable type)

前幾篇的基礎完成了開發環境安裝之後

我們來講講R語言的變數類型(type)

字元(character): 文字字串,用雙引號包起來。 
數值(numeric): 雙倍精準度數值,簡單的形容就是double。 
整數(integer): 沒有小數位的數值,以數字結尾加上L。 
邏輯(logical): TRUE /FALSE,也可以縮寫成T/F。
日期(Date)
時間(POSIXct、POSIXt)




還有變數如何指派,有三種方式
=   (其他語言大部分用這個,但R語言比較少用)
 <- (最佳 ,最通用的方法)
-> (也有右向箭頭,但不建議)


設定變數名稱有幾個要注意的地方
變數名稱不能使用數字開頭
變數名稱不能使用保留字,可以查詢下面連結找到保留字清單
https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html
變數名稱避免使用函數/函式名稱

在RStudio中,我們可以按alt與-幫我們生成<-符號

以下我們來舉例,我們在左下角命令列(Console)逐一輸入這些程式,來詢問括弧中的變數為何,class()這個函數可以幫助我們知道變數的類型。
接下來我們來展示如何把值指派給變數


在這裡我們把2這個值賦予給my_num這個變數空間,其實除了<-之外,用=也是可以的,只是在R語言中這樣用的人比較少,所以我還是推薦使用<-。

整數這個型別比較特別
當我們輸入一個整數並加上L,R語言就會儲存為整數(integer),如果我們在整數後面加上小數點及數字,R語言就會回傳警告且忽略L儲存為數值。

以上是R語言一些變數的介紹,接下來會講講邏輯值(logical)的運用。


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


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

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