é¸è¡çæ¹å¼ä¸»è¦åæå大é¡ï¼åºæ¬é¢ãæè¡é¢ãç±ç¢¼é¢ãå
§ç·æ¶æ¯é¢ï¼å¨å¤å¹´çæå¸ç¶é©ä¸ï¼æç¼ç¾å¤§æ¦æ80%çæè³äººé½æ¯ä½¿ç¨æè¡é¢ãèæè¡é¢å°±æ¯å©ç¨è¡å¸æ¯å¤©æç¢ççäºåæ¸å¼ï¼ä¾é²è¡ä¸åçæè¡åæï¼äºåæ¸å¼åå¥çºï¼ãéç¤å¹ãæ¶ç¤å¹ãæé«é»ãæä½é»ãæ交éãï¼èæ¤ç¼å±åºKDç·ãMACDç·ãRSIææ¨...çã
許å¤åå¸å¨ä¸å®æçç¬è²èª²ç¨å¾ï¼é½èè´ååå°å°å
¬éè³è¨è§æ¸¬ç«é²è¡ç¬è²ï¼ç¶å¾åå çºå¤ªé«é »ççè«æ±è¢«ç¶²ç«æä½ï¼æè
ç¬è²æ¹å¼éå°å°é£èæ¢æ¥ï¼åä¾æ¾ææ±å©ãæå¨äºè§£å®ä»æ³è¦çè³è¨å¾ï¼ç¼ç¾ä»åªæ¯è¦ä¸è¿°çæè¡åæäºåæ¸å¼ï¼ãå
¶å¯¦ä½ è¦çè³æï¼æå¯ä»¥å¹¾ç§éæå
¨å°çè¡ç¥¨é½æä¸ä¾ãæ平淡ç說ã
æ¬æç« æä»ç´¹ç®åPythonçå½å¼åº«ä¸ï¼å¤§å®¶æ常使ç¨æ¼åå¾æè¡åæäºåæ¸å¼ãéç¤å¹ãæ¶ç¤å¹ãæé«é»ãæä½é»ãæ交éãçå¥ä»¶pandas_datareaderï¼ä»¥åéåå¥ä»¶ç使ç¨æ¹å¼èç¯ä¾ç¨å¼ç¢¼ãå¨æç« çæå¾ï¼ä¹æçºéåå¥ä»¶é²æ´é«æ§çæ¯è¼ï¼ä¸¦å å ¥ä½è å人çè¦è§£ï¼æä¾çµ¦å¨è¡æµ·ä¸æ²æµ®çæ¨ä¸ååèã å¦å¤ï¼è¡é·æ¬é²å¤§ç¨å¼ä¸ç´ä»¥ä¾å¼·èª¿çé½æ¯å¯¦ä½ï¼èæ¬ç¯æç« ä¹ä¸ä¾å¤ãå æ¤ï¼æåå¨æå¾ï¼ä¹æ使ç¨å¸å®çå¥ä»¶ï¼æé¸åºå ¨å°ç£æ¯æ¥ãçæçªç ´é·æãçè¡ç¥¨ï¼ä¹å°±æ¯ä¿ç¨±çãé»é交åãè¡ï¼æ¯æ¯å¤©å ¨å°ç£çææä¸å¸æ«è¡ç¥¨ééæä¸éåï¼
è¦åï¼æ¬æç« å §å®¹å ä½çºç¨å¼å享èç¯ä¾ï¼ä¸¦éæè³å»ºè°ï¼åºæ¼æç« ä¹ä»»ä½äº¤æææè³æ±ºå®ï¼ä½¿ç¨è é èªè² 風éªåçè§ï¼æ¬æç« èç¨å¼äº¦ä¸è² ä»»ä½è²¬ä»»
pandas_datareaderå¥ä»¶å¯ä»¥èªªæ¯è¡å¹è³è¨çé·è¼©ï¼å·²ç¶éç¼å»ºç«å¾é·ä¸æ®µæéäºï¼ä¸¦ä¸æå¸å¼äººçæ¯ï¼pandas_datareaderæ¯æ´å ¨ççè¡å¸è³è¨ï¼å æ¤è¥æ¨æ¯æè³ç¾è¡ãæ¥è¡ã港è¡ï¼ä¹é½å¯ä»¥ä½¿ç¨éåå¥ä»¶æå°ç¸éè³æã
ç±æ¼æ¬æç« éæ¯èç¦æ¼å°è¡ï¼å æ¤pandas_datareaderå¥ä»¶çè³æ庫ä¸ï¼ææ¯æ´å°è¡çï¼å°±åªæYahooè³æ庫äºãèæ³è¦ä½¿ç¨Yahooè³æ庫å¥ä»¶ï¼éå¿ é è¦å¤ä¸è¼yfinanceå¥ä»¶ï¼æè½é å©å°è·Yahooåå¾è¡å¸è³æï¼å æ¤éè¦è¼¸å ¥ä»¥ä¸ç°å¢å®è£æ令ï¼
pip install pandas_datareader
pip install yfinance
æåç¶ç¶ä¸å¯è½æææä¸å¸æ«å ¬å¸å¾ä¸å¸ä»¥ä¾çè³è¨å ¨é¨æä¸ä¾ï¼é¤äºåæä¸æ²ææ義å¤ï¼æ´æå çºè«æ±éé大被ææï¼å æ¤æåå æåå ¨å°ææè¡ç¥¨30å¤©å §çè³æå³å¯ã
import datetime
import pandas as pd
from pandas_datareader import data
# éè¦ç¨æ¤å¥å»ºè¼å
¥yahooçAPIï¼å¦åç¡æ³åå¾è³è¨
import yfinance as yf
yf.pdr_override()
# å·²ç¶æ´ç好å
¨å°ææè¡ç¥¨
all_stock = ['1101.TW', '1102.TW', '1103.TW', '1104.TW', '1108.TW', '1109.TW...太å¤äºå
¶ä»è«è¦å®æ´ç¨å¼ç¢¼']
#å
è¨å®è¦ç¬çæé
start = datetime.datetime.now() - datetime.timedelta(days=30)
end = datetime.datetime.now()
è¨å®å®æå¾ï¼å³å¯ä½¿ç¨ãget_data_yahooãæ¹æ³ï¼åå¾è¡ç¥¨è³è¨äºï¼èæ¹æ³ä¸çä¸ååæ¸ä¹ä¸é£ç解ï¼åå¥æ¯ãæ³æçè¡ç¥¨ãéå§æ¥æãçµææ¥æãï¼æä¸ä¾çè³ææ以DataFrameçæ ¼å¼åç¾ãå ¶ä¸å¼å¾ä¸æçæ¯ï¼ãæ³æçè¡ç¥¨ãéåé¨åé¤äºå¯ä»¥ä»¥é£åçæ¹å¼æå®å¤§éçè¡ç¥¨ï¼ä¹å¯ä»¥å³éåä¸²æ ¼å¼æåå®ä¸è¡ç¥¨åï¼
# åå¾å
¨å°ç£ææçè¡ç¥¨ï¼æ¯å¤©ç交æè³è¨
df_stock = data.get_data_yahoo(all_stock, start, end)
å¨æåå¤åè¡ç¥¨è³è¨æï¼ååçDataFrameææ¯ä»¥ä¸ç¶åº¦çæ¹å¼åç¾ï¼å æ¤ååè³æçé¨åä¹ææ¯è¼è¤éï¼è©³æ è«çä¸ä¸æ®µãé»é交åãåçºåèåï¼
æ¢ç¶ä½¿ç¨å°é»é交åéåé¸è¡æ¹å¼ï¼ä¹ç°¡å®ä»ç´¹ä¸ä¸ãé»é交å主è¦æ¯å¤æ·ææ¯è¡ç¥¨çæå¹³åç·å¤§æ¼é·æå¹³åç·çºè²·é»ï¼éå ¶å¯¦ä¹æ¯å¾ç°¡å®ççµ±è¨å¸æ¦å¿µï¼è¥æè¡ç¥¨10天ä¾çå¹³åè¡å¹å¨100å ï¼èé5æ¥çå¹³åè¡å¹å»æ¯150å ï¼é代表ç麼ï¼æè¿éäºå¤©è¯å®æ幾天çè¡å¹å¨100å éåå¹³åä¹ä¸ï¼æå¥è©±èªªï¼å°±æ¯éåè¡ç¥¨æè¿æ¼²å¾å ã å¨å¸å ´ä¸ãé»é交åãæ許å¤ççæ¬ï¼æ¯å人å°æ¼çæå¹³åç·èé·æå¹³åç·çå®ç¾©ä¸åï¼éåé¨åæ¯æ²æå°é¯ï¼åªå決æ¼æ¨çæè³çç¥ï¼æ¬æç« å°±ä»¥ä»¥ä¸çå®ç¾©ä¾èä¾ï¼æ¨å¯ä»¥åä¾ç §èªå·±ççç¥å»å¾®èª¿ç¨å¼ç¢¼ï¼
- çæå¹³åï¼5æ¥ã
- é·æå¹³åï¼30æ¥ã
- é¸è¡æ¢ä»¶ï¼è©²è¡ç¥¨å5天æ¶ç¤å¹çå¹³åï¼å¤§æ¼å30天æ¶ç¤å¹çå¹³åã
å çºé次æååªæç¨å°æ¶ç¤å¹çè³è¨ï¼å æ¤åªéè¦ååºæ¶ç¤å¹çè³è¨å³å¯ãå¨åé¢æä¸ææè¡ç¥¨è³ææï¼çµæè³ææ¯ä»¥ä¸ç¶åº¦çæ¹å¼åç¾ï¼å¨columnsçé¨åå äºå ©åç¶åº¦ï¼ç¬¬ä¸åç¶åº¦çæ¬ä½åå¥æ¯ãAdj CloseãCloseãHighãLowãOpenãVolumeãï¼ä¹å°æå°ã調æ´å¾æ¶ç¤å¹ãæ¶ç¤å¹ãæé«é»ãæä½é»ãéç¤å¹ã交æéããå ¶ä¸æ¨å¯è½ææ¯è¼å¥½å¥ã調æ´å¾æ¶ç¤å¹ãï¼ç±æ¼å°ç£å¨ç¼æ¾è¡å©æï¼è¡å¹æå ç¼æ¾è¡å©èåä¸èª¿æ´ï¼è¡å¹æ¸å»è¡å©ï¼ï¼å æ¤æææ調æ´æ¶ç¤å¹çåºç¾ã
df_stock['Close'].columns # å
ç°¡å®æ¥çæ¶ç¤å¹çæææ¬ä½
get_close = df_stock['Close']
å¨æ¬æ¬¡ç¯ä¾ä¸æå使ç¨ä¸è¬çæ¶ç¤å¹å³å¯ï¼å æ¤ä½¿ç¨ãCloseãæ¬ä½å³å¯ã
ç®åº5æ¥å¹³åè30æ¥å¹³åå ¶å¯¦é常簡å®ãå å¾30æ¥å¹³å說起ï¼ç±æ¼æåæ¬ä¾æä¸ä¾çè³æå°±æ¯30æ¥çè³æï¼å æ¤ç´æ¥çå°ææçè³æ使ç¨mean()æ¹æ³é²è¡å¹³åå³å¯ã5æ¥çå¹³ååæ¯è¦æåè³æçæå¾äºåï¼å çºè³ææ¯æç §æ¥æç±å°å°å¤§æåºçï¼å æ¤éè¦å 使ç¨iloc[-5:]æåºæå¾åçè³æã
get_close.mean() # ä¸å天平å
get_close.iloc[-5:].mean() # äºå¤©å¹³å
æå¾åªéè¦å°åä¸åé¨ä»½ççµæé²è¡æ¯è¼å³å¯ï¼å°äºå¤©å¹³å大æ¼ä¸å天平åççµæåæè®æ¸biggerï¼è¥æ³è¦åå¾è©³ç´°çè¡ç¥¨ä»£èï¼åªéè¦æé¸åºè®æ¸bigger裡é¢çºtrueçè³æï¼ä¸¦ä¸ååºä»çindex就好äºåï¼æå¾å¦ä¸åççµæï¼æ540æªè¡ç¥¨ç¬¦åéåæ¢ä»¶ï¼
# è¨ç®é»é交å
bigger = get_close.iloc[-5:].mean() > get_close.mean()
bigger[bigger==True].index # ååºç¬¦åæ¢ä»¶çææè¡ç¥¨
ç¶éæ¤æ¬¡ç¯ä¾ï¼åºæ¬ä¸è¥æ¨çé¸è¡éæ±æ¯ä»¥è¡å¹å¹³åç·çæ¹å¼é²è¡æé¸ï¼é£åªéè¦å°åç¯æç« çç¨å¼ç¢¼é²è¡å¾®èª¿å³å¯ï¼ä½ä»éå次æéï¼**æ¬æç« å §å®¹å ä½çºç¨å¼å享èç¯ä¾ï¼ä¸¦éæè³å»ºè°ï¼åºæ¼æç« ä¹ä»»ä½äº¤æææè³æ±ºå®ï¼ä½¿ç¨è é èªè² 風éªåçè§ï¼æ¬æç« èç¨å¼äº¦ä¸è² ä»»ä½è²¬ä»»**ã
æ´é«ä¾èªªpandas_datareaderå¥ä»¶éæ¯é常好ç¨çï¼å¯ä»¥èªªæ¯åºæ¬æè¡åæçä¸äºäººé¸ã以ä¸æ¯æ¨å°æ¼éåå¥ä»¶ä½¿ç¨éæ±ä¸ï¼å¯è½ææçåçé¨åï¼
作者:楊超霆 行銷搬進大程式 創辦人