Python 股票分析入門
初入資料分析大門,感覺需要補的知識太多太多。不太建議系統補齊各種知識,因為大概率會倒在半路上。
以專案為導向,梳理大概流程,對流程中所需的知識點進行大致學習,以後遇到知識盲點再回來補。
接下來我以股票分析為例來了解資料分析流程。
個人認為股票分析無非就分為獲取資料
、資料處理
、資料視覺化
三個部分,依賴 Python 強大的第三方開源庫,上手難度變得非常低。
所需知識
- 基礎
- Python
- 環境
- anaconda
- 資料獲取
- pandas_datareader
- 資料處理
- numpy
- pandas
- 資料視覺化
- matplotlib seaborn
目的
- 分析股票走勢
- 多隻股票的關係
Python 基本語法
推薦去看廖雪峰的 Python 教程,淺顯易懂,上手很快。
安裝 anaconda
Anaconda是一個包含180+的科學包及其依賴項的開源Python發行版本。
安裝 anaconda,直接去anaconda 官網下載安裝即可。
anaconda 安裝成功後,會自帶安裝 Jupyter,jupyter 主要用於我們程式碼的編寫和執行。
建立一個新資料夾 stock-market-analysis
# 啟動 jupyter
conda notebook
複製程式碼
啟動成功,在瀏覽器中開啟 http://localhost:8888/tree)
,單擊 new
,建立一個新的 notebook 就可以開始愉快的玩耍了!
numpy
numpy 是一個用於科學計算的 Python 庫。
基本用法
# 引入 numpy
import numpy as np
複製程式碼
# 建立一個長度為15,3乘5的二維陣列
a = np.arange(15).reshape(3, 5)
# 列印a
a
複製程式碼
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
複製程式碼
# 建立一個長度為15,間隔10,3乘5的二維陣列
b = np.arange( 1, 150, 10 ).reshape(3, 5)
# 列印b
b
複製程式碼
array([[ 1, 11, 21, 31, 41],
[ 51, 61, 71, 81, 91],
[101, 111, 121, 131, 141]])
複製程式碼
# 兩個二維陣列相加
a + b
複製程式碼
array([[ 1, 12, 23, 34, 45],
[ 56, 67, 78, 89, 100],
[111, 122, 133, 144, 155]])
複製程式碼
pandas
pandas 是一個基於 numpy 強大的 Python 資料分析包,它提供了很高階的資料結構和大量處理資料的方法。最終目的是為了我們更好的理解和處理資料。
基本用法
pandas 提供了兩種資料結構,Series 和 DataFrame。
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
複製程式碼
Series
Series 類似於字典,可以根據索引查詢對應值
# 建立一個長度為4,1到10的隨機整數
Series(np.random.randint(1,10,4))
複製程式碼
0 4
1 2
2 3
3 1
dtype: int64
複製程式碼
# 指定index
s = Series(np.random.randint(1,10,4), index=['a','b','c','d'])
s
複製程式碼
a 4
b 5
c 5
d 8
dtype: int64
複製程式碼
# 根據 index 查詢
s['a']
複製程式碼
4
複製程式碼
DataFrame
DataFrame 是二維的資料結構,可以用行列的方式表示,可以把它想象成一個 Excel 表。
# 生成值為時間的陣列
dates = pd.date_range('20130101', periods=6)
dates
複製程式碼
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
複製程式碼
# 生成 index 為日期,列名為 ABCD 的 DataFrame
df = DataFrame(np.random.randint(1,10,24).reshape(6,4), index=dates, columns=list('ABCD'))
df
複製程式碼
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | 4 | 3 | 5 | 3 |
2013-01-02 | 3 | 1 | 1 | 8 |
2013-01-03 | 6 | 1 | 8 | 6 |
2013-01-04 | 8 | 8 | 9 | 2 |
2013-01-05 | 1 | 5 | 1 | 8 |
2013-01-06 | 2 | 4 | 9 | 5 |
matplotlib seaborn
matplotlib 是 Python 非常重要的資料視覺化庫,而 seaborn 是基於 matplotlib 開發的視覺化庫,更為強大易用。
基本用法
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
複製程式碼
# 建立一個 Series,1000個從1到100間隔均勻的陣列
s = Series(np.linspace(1, 100, 1000))
複製程式碼
s.plot()
複製程式碼
<matplotlib.axes._subplots.AxesSubplot at 0x1a226a23c8>
複製程式碼
# 建立一個 DataFrame,1到10的隨機整數,10乘4的二維陣列,列名為 a,b,c,d
df = DataFrame(np.random.randint(1,10,40).reshape(10,4),columns=list("abcd"))
複製程式碼
df
複製程式碼
a | b | c | d | |
---|---|---|---|---|
0 | 3 | 6 | 8 | 9 |
1 | 2 | 6 | 9 | 9 |
2 | 8 | 9 | 2 | 9 |
3 | 7 | 4 | 5 | 4 |
4 | 7 | 9 | 5 | 8 |
5 | 9 | 9 | 3 | 3 |
6 | 5 | 2 | 3 | 1 |
7 | 1 | 8 | 3 | 7 |
8 | 3 | 1 | 7 | 2 |
9 | 2 | 1 | 9 | 7 |
# matpoltlib 畫圖
df.plot()
複製程式碼
<matplotlib.axes._subplots.AxesSubplot at 0x11fe2ab38>
複製程式碼
# 對每列進行求和
df_sum = df.sum()
# 指定柱狀圖
df_sum.plot(kind='bar')
複製程式碼
<matplotlib.axes._subplots.AxesSubplot at 0x1a22821668>
複製程式碼
# seaborn 畫圖
index = df_sum.index
values = df_sum.values
sns.barplot(index, values)
複製程式碼
<matplotlib.axes._subplots.AxesSubplot at 0x1a229041d0>
複製程式碼
有了以上的一些基本知識就可開始分析股票了。
股票分析
股票分析的步驟:
- 獲取資料
- 處理資料
- 資料視覺化
- 分析資料
# basic
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
# get data
import pandas_datareader as pdr
# visual
import matplotlib.pyplot as plt
import seaborn as sns
# time
from datetime import datetime
複製程式碼
# pandas_datareader 這個庫提供 API 來獲取股票資料
# get_data_yahoo 代表資料來源來自 yahoo,'BABA' 是阿里巴巴的股票程式碼
df = pdr.get_data_yahoo('BABA')
# 由於資料較多,我們只取頭部的五條資料來看
# high 表示最高價,low 表示最低價,open 表示開盤價,close 表示收盤價,volume 表示交易量
df.head()
複製程式碼
High | Low | Open | Close | Volume | Adj Close | |
---|---|---|---|---|---|---|
Date | ||||||
2014-09-19 | 99.699997 | 89.949997 | 92.699997 | 93.889999 | 271879400 | 93.889999 |
2014-09-22 | 92.949997 | 89.500000 | 92.699997 | 89.889999 | 66657800 | 89.889999 |
2014-09-23 | 90.480003 | 86.620003 | 88.940002 | 87.169998 | 39009800 | 87.169998 |
2014-09-24 | 90.570000 | 87.220001 | 88.470001 | 90.570000 | 32088000 | 90.570000 |
2014-09-25 | 91.500000 | 88.500000 | 91.089996 | 88.919998 | 28598000 | 88.919998 |
# 我們取五家從2015年1月1號至今的股票資料進行分析
# 'MSFT':微軟, 'AAPL':蘋果, 'AMZN':亞馬遜, 'FB':臉書, 'GOOG':谷歌
start = datetime(2015,1,1)
company = ['MSFT', 'AAPL', 'AMZN', 'FB', 'GOOG']
top_df = pdr.get_data_yahoo(company, start=start)
複製程式碼
# 得到一個數據集合,這個資料集合是 pandas.core 資料結構
type(top_df)
複製程式碼
pandas.core.frame.DataFrame
複製程式碼
# 看一下他們最近幾日的收盤價
top_df['Close'].tail()
複製程式碼
Symbols | AAPL | AMZN | FB | GOOG | MSFT |
---|---|---|---|---|---|
Date | |||||
2018-10-30 | 213.300003 | 1530.420044 | 146.220001 | 1036.209961 | 103.730003 |
2018-10-31 | 218.860001 | 1598.010010 | 151.789993 | 1076.770020 | 106.809998 |
2018-11-01 | 222.220001 | 1665.530029 | 151.750000 | 1070.000000 | 105.919998 |
2018-11-02 | 207.479996 | 1665.530029 | 150.350006 | 1057.790039 | 106.160004 |
2018-11-05 | 201.589996 | 1627.800049 | 148.679993 | 1040.089966 | 107.510002 |
# 直接用 matplotlib 畫它們的股價走勢
top_df['Close'].plot()
複製程式碼
<matplotlib.axes._subplots.AxesSubplot at 0x1a1741f748>
複製程式碼
# 根據他們的股價走勢,畫出股價波動
top_df_dr = top_df['Close'].pct_change()
top_df_dr.plot()
複製程式碼
<matplotlib.axes._subplots.AxesSubplot at 0x1a173004a8>
複製程式碼
# 上面的估計波動圖太密集,不容易開出問題,我們選亞馬遜和谷歌的進行對比
# 利用 seaborn 畫出亞馬遜和谷歌的散點圖
# 每個點對應的橫座標和縱座標,分別對應谷歌和亞馬遜當日的漲跌情況,如果都為負數說明當日股價均為下跌
sns.jointplot('AMZN', 'GOOG', top_df_dr)
複製程式碼
<seaborn.axisgrid.JointGrid at 0x1a172d8048>
複製程式碼
# 我們還可以利用強大的 seaborn 對五家公司進行相互對比
sns.pairplot(top_df_dr.dropna())
複製程式碼
<seaborn.axisgrid.PairGrid at 0x1a1786ada0>
複製程式碼