有人讓我寫一下關於數據挖掘在金融方面的應用,再加上現在金融對數據方面的要求不斷提高,準備用兩篇隨筆來做個入門總結。 首先,在看這篇隨筆以前稍微補充一點金融方面的知識,因為我不是金融專業的,以下補充知識來自互聯網與個人整理,歡迎批評指正並補充說明。 1 先來瞭解一下什麼是金融市場呢? 通常狹義的金融市 ...
有人讓我寫一下關於數據挖掘在金融方面的應用,再加上現在金融對數據方面的要求不斷提高,準備用兩篇隨筆來做個入門總結。
首先,在看這篇隨筆以前稍微補充一點金融方面的知識,因為我不是金融專業的,以下補充知識來自互聯網與個人整理,歡迎批評指正並補充說明。
1 先來瞭解一下什麼是金融市場呢?
通常狹義的金融市場特指有價證券(股票、債券)發行和流通的場所。
股票、債券是用來資本流通的金融產品,廣義上的金融市場還包含貨幣市場,其中代表性的是期貨市場等。
其實不管是資本市場,還是貨幣市場,都是可以提供給投資者投資的地方,其中貨幣市場以期貨為代表的適合短期投資,而以股票代表的證券市場適合長期投資!
常見機構:銀行、投資銀行(證券公司)、保險公司、基金等
有價證券:是虛擬資本的一種形式,它本身沒價值,但有價格。
2 狹義的金融市場劃分
2.1 按交易程式劃分
-
發行市場:又稱為處理新發行證券的金融市場,籌集資金的公司、政府或公共部門通過發行新的股票和債券來進行融資。
-
流通市場:又稱二級市場,是指已經發行的證券進行轉讓、交易的市場。
我們通過一張圖來理解一下:
關於投資的幾個類別,一般我們將天使、VC、PE三個部分統稱為私募(Private Equity),指的是沒有在證券交易所公開上市交易的資產。
1、公司規模
天使投資主要投資早期創業公司;
VC投資中期高速發展型創業公司;
PE介入即將上市或被兼併收購的成熟企業。
2、資金規模
天使投資:500萬以下 VC投資:千萬 PE:千萬級別以上
2.2 參與主體
- 證券交易所
- 買賣股票、公司債等有價證券的市場
證券公司:
- 可以承銷發行、自營買賣或自營兼代理買賣證券
2.3 關於金融產品的區別
註:政府、公司等發行股票、債券目的為了進行融資、發展等
3 什麼是股票?
股票,是股份公司簽發的證明股東所持股份的憑證,代表了股東對股份公司凈資產的所有權。
- 特點:每股股票都代表股東對企業擁有單位的所有權,所擁有的份額取決於持有的股票數量總占比。本身沒有價格,代表一種價值
3.1 股票按照股東權利的分類
- 按股東權利分類,股票可分為普通股、優先股等
普通股
普通股是指在公司的經營管理和盈利及財產的分配上享有普通權利的股份,代表滿足所有債權償付要求及優先股東的收益權與求償權要求後對企業盈利和剩餘財產的索取權。普通股構成公司資本的基礎,是股票的一種基本形式。現上海和深圳證券交易所上進行交易的股票都是普通股。
普通股股東
(1)公司決策參與權。普通股股東有權參與股東大會,並有建議權、表決權和選舉權,也可以委托他人代表其行使其股東權利。
(2)利潤分配權。普通股股東有權從公司利潤分配中得到股息。普通股的股息是不固定的,由公司贏利狀況及其分配政策決定。普通股股東必須在優先股股東取得固定股息之後才有權享受股息分配權。
(3)優先認股權。如果公司需要擴張而增發普通股股票時,現有普通股股東有權按其持股比例,以低於市價的某一特定價格優先購買一定數量的新發行股票,從而保持其對企業所有權的原有比例。
(4)剩餘資產分配權。當公司破產或清算時,若公司的資產在償還欠債後還有剩餘,其剩餘部分按先優先股股東、後普通股股東的順序進行分配。
優先股
優先股相對於普通股。優先股在利潤分紅及剩餘財產分配的權利方面優先於普通股。
(1)優先分配權。在公司分配利潤時,擁有優先股票的股東比持有普通股票的股東,分配在先,但是享受固定金額的股利,即優先股的股利是相對固定的。
(2)優先求償權。若公司清算,分配剩餘財產時,優先股在普通股之前分配。註:當公司決定連續幾年不分配股利時,優先股股東可以進入股東大會來表達他們的意見,保護他們自己的權利。
3.2 股票按照上市地區的分類
- 根據上市地區可以分為,我國上市公司的股票有A股(在上海和深圳上市)、B股(上海和深圳上市,其中上海B股以美元結算,深圳B股以港元結算),H股(香港交易所上市,在大陸運作的公司)。並且還有一些N股和S股等的劃分。這一區分主要依據股票的上市地點和所面對的投資者而定
3.3 股票按照股票業績的分類
- 根據業績也分為:ST股、垃圾股、藍籌股 等
- 藍籌股:股票市場上,那些在其所屬行業內占有重要支配性地位、業績優良,成交活躍、紅利優厚的大公司。
在進行股票投資的時候,我們會使用價值投資方式。選擇公司前景好、業績好的一些公司
知道了股票的基本分類,接下來我們去看看股票具體的一些機制。
3.4 人民幣普通股票
A股
- A股即人民幣普通股票。它是由我國境內的公司發行,供境內機構、組織或個人(不含港、澳、台投資者)以人民幣認購和交易的普通股股票。
- 特點: A股不是實物股票,以無紙化電子記帳,實行T+1交易制度
T+1制度
自1995年1月1日起,為了保證股票市場的穩定,防止過度投機,股市實行“T+1”交易制度,當日買進的股票,要到下一個交易日才能賣出。同時,對資金仍然實行“T+0”,即當日回籠的資金馬上可以使用。
T+1是一種股票交易制度,即當日買進的股票,要到下一個交易日才能賣出。
“T+1"中"T"指的是交易登記日,"T+1"指的是交易登記日的第二天。
3.5 股票的代碼、開戶、價格形成
我們可以看到這樣的符號:
3.5.1 股票代碼
股票代碼用數字表示股票的不同含義。股票代碼除了區分各種股票,也有其潛在的意義,比如600*是上交所上市的股票代碼,6006是最早上市的股票,一個公司的股票代碼跟車牌號差不多,能夠顯示出這個公司的實力以及知名度
1、滬市A股票買賣的代碼是以600、601或603打頭(在上海證券交易所上市的全是主板)
2、深市A股票買賣的代碼是以000打頭,其中中小板代碼以002打頭,創業板股票代碼以300打頭
問題:那麼經常說的股票價格是什麼?怎麼形成的?
3.5.2 股票價格
股票價格(Stock Price)又叫股票行市,是指股票在證券市場上買賣的價格。股票在流通市場上的價格,才是完全意義上的股票的市場價格
股票初始發行價格=市盈率還原值×40%+股息還原率×20%+每股凈值×20%+預計當年股息與一年期存款利率還原值×20%,影響股票價格的因素有很多,如企業因素、盈利情況、凈資產、市場、行業等
3.5.3 股票的交易時間和過程
- 股票交易時間
- 休息日:周六、周日和上證所公告的休市日不交易。(一般為五一、十一國慶節、春節、元旦、清明節、端午節、中秋節等國家法定節假日)
- 股票交易過程
(一)、集合競價階段:9:15 — 9:25
1、9:15 — 9:19可以申報和撤單;9:20 — 9:25 可以申報,不可以撤單。
2、深圳交易所14:57 — 15:00實行集合競價,可以申報,不可以撤單。
(二)、連續競價階段
1、上海交易所:9:30 — 11:30;13:00 — 15:00
2、深圳交易所:9:30 — 11:30;13:00 — 14:56:59
(三)成交原則
價格優先,時間優先
3.5.4 交易費用
1、印花稅:1‰(賣的時候才收取,此為國家稅收,全國統一)。 2、過戶費:深圳交易所無此項費用,上海交易所收費標準(按成交金額的0.02‰人民幣 [2] )。 3、交易佣金:最高收費為3‰,最低收費5元。各家劵商收費不一,開戶前可咨詢清楚。 例子: 假設你買入10000股,每股票價格為10元,以此為例,對其買入成本計算: 買入股票所用金額:10元/股×10000股=100000元; 過戶費:0.02‰×100000=2元(滬市股票計算,深市為0); 交易佣金:100000×3‰=300元(按最高標準計算,正常情況下都小於這個值); 買入總成本:100000元+300元+2元=100302元(買入10000股,每股10元,所需總資金) 多少每股賣出才不賠錢? 可按如下公式計算:(買入總成本+賣出過戶費)÷(1-印花稅率-交易佣金率)÷股票數量=(100310元+10元)÷(1-0.001-0.003)÷10000=10.07228916元 =10.07元(四捨五入)。 若以10.08每股賣出價格計算: 股票金額:10.08元/股×10000股=100800元; 印花稅:100800元×1‰=100.8元; 過戶費:0.002%×100800元≈2元; 交易佣金:100800元×3‰=302.4元; 賣出後收入:100800元-100.8元-2元-302.4元=100394.8元; 最終實際盈利為:賣出後收入-買入總成本=100394.8-100302=92.8元;
3.6 股票的層次劃分
即使在國內對於A股來說,目前總共有3000多只股票。並且數字可能隨著時間會不斷改變,如何更好的管理這些上市公司?實現怎樣的制度去區分公司的規模大小?
3.6.1 中國股票市場的層次劃分
- 主板:市場占有率高、規模較大、基礎較好、高收益、低風險的大型優秀企業。
- 中小板:主要服務於即將或已進入成熟期、盈利能力強、但規模較主板小的中小企業。
- 創業板:是以自主創新企業及其他成長型創業企業為服務對象,主要為“兩高”、“六新”企業,即高科技、高成長性、新經濟、新服務、新農業、新能源、新材料、新商業模式企業。
- 新三板:主要為創新型、創業型、成長型中小微企業發展服務。
在選擇購買股票的時候,有時候會根據劃分依據去選擇特定指數、行業、板塊下的股票!!!
3.6.2 股票的不同性質劃分
概念股概念股是與業績股相對而言的。業績股需要有良好的業績支撐。概念股則是依靠某一種題材比如資產重組概念,三通概念等支撐價格。
行業:
指數:
4 股票數據
4.1 交易數據
股票在流通市場上的價格,才是完全意義上的股票的市場價格,一般稱為股票市價或股票行市。股票市價表現為開盤價、收盤價、最高價、最低價等形式。其中收盤價最重要,是分析股市行情時採用的基本數據。
4.2 股票K線圖
K線圖這種圖表源處於日本德川幕府時代,被當時日本米市的商人用來記錄米市的行情與價格波動,後因其細膩獨到的標畫方式而被引入到股市及期貨市場。
4.2.1 K線圖基本形態
4.2.2 K線圖的計算周期
不同的時間間隔看待股票數據變化,會有不一樣的發現!
K線的計算周期可將其分為日K線,周K線,月K線,年K線
很多網站提供了日線、周K線、月K線等周期數據,但是最原始的只有日K線的數據。我們需要自己去生成計算不同頻率的數據
4.3 案例:股票K線數據重採樣
股票方面的基礎知識差不多了,接下來我們做個將日k線圖轉換成周k線圖的案例吧!
- DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None,kind=None,)
- 頻率轉換和時間序列重採樣,對象必須具有類似日期時間的索引(DatetimeIndex,PeriodIndex或TimedeltaIndex)
- 日K周K對比:
那麼日線、周線、月線等怎麼切換標準??
周K線是指以周一的開盤價,周五的收盤價,全周最高價和全周最低價來畫的K線圖
大部分周線的指標是這個日線指標在這一周最後一個交易日的值。比如周線的’close’應該等於這一周最後一天日線數據的‘close’,但是有的指標是例外,比如周線的’high’應該等於這一周所有日線‘high’中的最大值
接下來我們還是使用之前stock_day當中的某個股票的行情數據
- 將索引轉換成DatetimeIndex類型
- 對不同指標進行重採樣
stock_day = pd.read_csv("./data/stock_day/stock_day.csv") stock_day = stock_day.sort_index() # 對每日交易數據進行重採樣 (頻率轉換) stock_day.index # 1、必須將時間索引類型編程Pandas預設的類型 stock_day.index = pd.to_datetime(stock_day.index) # 2、進行頻率轉換日K---周K,首先讓所有指標都為最後一天的價格 period_week_data = stock_day.resample('W').last() # 分別對於開盤、收盤、最高價、最低價進行處理 period_week_data['open'] = stock_day['open'].resample('W').first() # 處理最高價和最低價 period_week_data['high'] = stock_day['high'].resample('W').max() # 最低價 period_week_data['low'] = stock_day['low'].resample('W').min() # 成交量 這一周的每天成交量的和 period_week_data['volume'] = stock_day['volume'].resample('W').sum()
- 對於其中存在的缺失值
period_week_data.dropna(axis=0)
我們可以將計算出來的周K和原先的日K畫圖顯示出來
- 畫出K線圖顯示
金融數據繪製需要使用mpl_finance框架, 通過pip 安裝即可
from mpl_finance import candlestick_ochl import matplotlib.pyplot as plt # 先畫日K線 fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(20, 8), dpi=80) # 準備數據, array數組 stock_day['index'] = [i for i in range(stock_day.shape[0])] day_k = stock_day[['index', 'open', 'close', 'high', 'low']] candlestick_ochl(axes, day_k.values, width=0.2, colorup='r', colordown='g') plt.show() # 周K線圖數據顯示出來 period_week_data['index'] = [i for i in range(period_week_data.shape[0])] week_k = period_week_data[['index', 'open', 'close', 'high', 'low']] candlestick_ochl(axes, week_k.values, width=0.2, colorup='r', colordown='g') plt.show()
4.4 什麼是除權數據以及復權操作?
上市公司會時不時的發生現金分紅、送股等一系列股本變動,這會造成股價的非正常變化,導致我們不能直接通過股價來計算股票的漲跌幅。這種數據我們也稱之為除權數據。
所以我們要對這種數據做處理,也稱之為復權數據。怎麼進行復權呢?
簡單的一種方式: 原始數據: 1號:100 2號:50 3號:53 4號:51 復權後: 100 / 50 = 2 比例 1號:100 2號:100 3號:106 4號:102
4.5 基本面數據
4.5.1 基本面數據的用處
主要用於基本面分析,主要側重於從股票的基本面因素,如企業經營能力,財務狀況,行業背景等對公司進行研究與分析,試圖從公司角度找出股票的“內在價值”,從而與股票市場價值進行比較,挑選出最具投資價值的股票。
量化主要就屬於這樣的一個分析方式
5 股票時間序列數據處理
5.1 什麼是時間序列?
時間序列是一組按照時間發生先後順序進行排列的數據點序列。通常一組時間序列的時間間隔為一恆定值(如1秒,5分鐘,12小時,7天,1年),因此時間序列可以作為離散時間數據進行分析處理。
例如:某監控系統的折線圖表,顯示了請求次數和響應時間隨時間的變化趨勢
5.2 Pandas的時間類型
- pd.to_datetime():轉換成pandas的時間類型 Timestamp('2018-03-02 00:00:00')
# pd將時間數據轉換成pandas時間類型 # 1、填入時間的字元串,格式有幾種, "2018-01-01" ,”01/02/2018“ pd.to_datetime("01/02/2017")
5.3 Pandas的時間序列類型
- 1、轉換時間序列類型
# 傳入時間的列表 pd.to_datetime(["2017-01-01", "2017-02-01", "2017-03-01"]) # 或者 date = [datetime(2018, 3, 1), datetime(2018, 3, 2), datetime(2018, 3, 3), datetime(2018, 3, 4), datetime(2018, 3, 5)] date = pd.to_datetime(date) # 如果其中有空值 date = [datetime(2018, 3, 1), datetime(2018, 3, 2), np.nan, datetime(2018, 3, 4), datetime(2018, 3, 5)] date = pd.to_datetime(date) # 結果會變成NaT類型 DatetimeIndex(['2018-03-01', '2018-03-02', 'NaT', '2018-03-04', '2018-03-05'], dtype='datetime64[ns]', freq=None)
- 2、Pandas的時間序列類型:DatetimeIndex
# DateTimeIndex pd.to_datetime(date) DatetimeIndex(['2018-03-01', '2018-03-02', '2018-03-03', '2018-03-04', '2018-03-05'], dtype='datetime64[ns]', freq=None) pd.to_datetime(date).values array(['2018-03-01T00:00:00.000000000', '2018-03-02T00:00:00.000000000', '2018-03-03T00:00:00.000000000', '2018-03-04T00:00:00.000000000', '2018-03-05T00:00:00.000000000'], dtype='datetime64[ns]')
我們也可以通過DatetimeIndex來轉換
- 3、通過pd.DatetimeIndex進行轉換
pd.DatetimeIndex(date)
知道了時間序列類型,所以我們可以用這個當做索引,獲取數據
5.4 Pandas的基礎時間序列結構
# 最基礎的pandas的時間序列結構,以時間為索引的,Series序列結構 # 以時間為索引的DataFrame結構 series_date = pd.Series(3.0, index=date) pd.to_datetime(series_date) pd.DatetimeIndex(series_date)
pandas時間序列series的index必須是DatetimeIndex
- DatetimeIndex的屬性
- year,month,weekday,day,hour….
time.year time.month time.weekday
5.5 Pandas生成指定頻率的時間序列
- pandas.date_range(start=None, end=None, periods=None, freq='D', tz=None, normalize=False, name=None, closed=None, **kwargs)
- Returna fixed frequency DatetimeIndex, with day (calendar) as the default frequency
- start:開始時間
- end:結束時間
- periods:產生多長的序列
- freq:頻率 D,H,Q等
- tz:時區
# 生成指定的時間序列 # 1、生成2017-01-02~2017-12-30,生成頻率為1天, 不跳過周六周日 pd.date_range("2017-01-02", "2017-12-30", freq="D") # 2、生成2017-01-02~2017-12-30,生成頻率為1天, 跳過周六周日, 能夠用在金融的數據,日線的數據 pd.date_range("2017-01-02", "2017-12-30", freq="B") # 3、只知道開始時間日期,我也知道總共天數多少,生成序列, 從"2016-01-01", 共504天,跳過周末 pd.date_range("2016-01-01", periods=504, freq="B") # 4、生成按照小時排列的時間序列數據 pd.date_range("2017-01-02", "2017-12-30", freq='H') # 5、按照3H去進行生成 pd.date_range("2017-01-02", "2017-12-30", freq='3H') # 6、按照1H30分鐘去進行生成時間序列 pd.date_range("2017-01-02", "2017-12-30", freq='1H30min') # 7、按照每月最後一天 pd.date_range("2017-01-02", "2017-12-30", freq='BM') # 8、按照每個月的第幾個星期幾 pd.date_range("2017-01-02", "2017-12-30", freq='WOM-3FRI')
5.6什麼是時間序列分析
對於時間序列類型,有特有的分析方法。同樣股票本身也是一種時間序列類型,我們就以股票的數據來進行時間序列的分析
時間序列分析( time series analysis)方法,強調的是通過對一個區域進行一定時間段內的連續觀察計算,提取相關特征,並分析其變化過程。
時間序列分析主要有確定性變化分析
- 確定性變化分析:移動平均法, 移動方差和標準差、移動相關係數
5.7 移動平均法
5.7.1 移動視窗
主要用在時間序列的數組變換, 不同作用的函數將它們統稱為移動視窗函數
5.7.2 移動平均線
那麼會有各種觀察視窗的方法,其中最常用的就是移動平均法
- 移動平均線(Moving Average)簡稱均線, 將某一段時間的收盤價之和除以該周期
5.7.3 移動平均線的分類
- 移動平均線依計算周期分為短期(5天)、中期(20天)和長期(60天、120天),移動平均線沒有固定的界限
- 移動平均線依據演算法分為算數、加權法和指數移動平均線
不同的移動平均線方法不一樣
1 簡單移動平均線
簡單移動平均線(SMA),又稱“算數移動平均線”,是指特定期間的收盤價進行平均化比如說,5日的均線SMA=(C1+ C2 + C3 + C4 + C5) / 5
例子:
- 案例:對股票數據進行移動平均計算
拿到股票數據,畫出K線圖
# 拿到股票K線數據 stock_day = pd.read_csv("./data/stock_day/stock_day.csv") stock_day = stock_day.sort_index() stock_day["index"] = [i for i in range(stock_day.shape[0])] arr = stock_day[['index', 'open', 'close', 'high', 'low']] values = arr.values[:200] # 畫出K線圖 fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(20, 8), dpi=80) candlestick_ochl(axes, values, width=0.2, colorup='r', colordown='g')
2 計算移動平均線
-
pandas.rolling_mean(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs) Moving mean.
Parameters:
- arg : Series, DataFrame
- window : 計算周期
# 直接對每天的收盤價進行求平均值, 簡單移動平局線(SMA) # 分別加上短期、中期、長期局均線 pd.rolling_mean(stock_day["close"][:200], window=5).plot() pd.rolling_mean(stock_day["close"][:200], window=10).plot() pd.rolling_mean(stock_day["close"][:200], window=20).plot() pd.rolling_mean(stock_day["close"][:200], window=30).plot() pd.rolling_mean(stock_day["close"][:200], window=60).plot() pd.rolling_mean(stock_day["close"][:200], window=120).plot()
3 加權移動平均線 (WMA)
加權移動平均線 (WMA)將過去某特定時間內的價格取其平均值,它的比重以平均線的長度設定,愈近期的收市價,對市況影響愈重要。
正因加權移動平均線強調將愈近期的價格比重提升,故此當市況倒退時,加權移動平均線比起其它平均線更容易預測價格波動。但是我們還是不會輕易使用加權,應為他的比重過大!!!!
4 指數平滑移動平均線(EWMA)
是因應移動平均線被視為落後指標的缺失而發展出來的,為解決一旦價格已脫離均線差值擴大,而平均線未能立即反應,EWMA可以減少類似缺點。
pd.ewma(com=None, span=one)
- 指數平均線
- span:時間間隔
# 畫出指數平滑移動平均線 pd.ewma(stock_day['close'][:200], span=10).plot() pd.ewma(stock_day['close'][:200], span=30).plot() pd.ewma(stock_day['close'][:200], span=60).plot()
5.8 移動方差和標準差
- 方差和標準差:反應某一時期的序列的穩定性
# 求出指定視窗大小的收盤價標準差和方差 pd.rolling_var(stock_day['close'][:200], window=10).plot() pd.rolling_std(stock_day['close'][:200], window=10).plot()
5.9 各項指標數據兩兩關聯散點圖
- pd.scatter_matrix(frame, figsize=None)
- frame:DataFrame
frame = data[['open','volume', 'ma20', 'p_change', 'turnover']] pd.scatter_matrix(frame, figsize=(20, 8))
從中我們可以簡單看到成交量(volume)和換手率(turnover)有非常明顯的線性關係,因為換手率的定義就是:成交量除以發行總股數。
通過一些圖或者相關性分析可以找到強相關的一些指標,在機器學習、量化方向中會詳細介紹
相關係數:後面會介紹,目前我們只需知道他是反應兩個序列之間的關係即可
5.10 案例:移動平均線數據本地保存
ma_list = [5, 20 ,60] for ma in ma_list: data['MA' + str(ma)] = pd.rolling_mean(data.close, ma) for ma in ma_list: data['EMA' + str(ma)] = pd.ewma(data.close, span=ma) data.to_csv("EWMA.csv")
5.11 移動平均線的作用
移動平均線經常會作為技術分析的基礎理論,從中衍生出各種技術指標策略。後面將會介紹簡單的基於均線的策略。