金融數據分析與挖掘具體實現方法 -1

有人讓我寫一下關於數據挖掘在金融方面的應用,再加上如今金融對數據方面的要求不斷提升,準備用兩篇隨筆來作個入門總結。

首先,在看這篇隨筆之前稍微補充一點金融方面的知識,由於我不是金融專業的,如下補充知識來自互聯網與我的整理,歡迎批評指正並補充說明。

1 先來了解一下什麼是金融市場呢?

一般狹義的金融市場特指有價證券(股票、債券)發行和流通的場所。python

股票、債券是用來資本流通的金融產品,廣義上的金融市場還包含貨幣市場,其中表明性的是期貨市場等。算法

其實無論是資本市場,仍是貨幣市場,都是能夠提供給投資者投資的地方,其中貨幣市場以期貨爲表明的適合短時間投資,而以股票表明的證券市場適合長期投資!編程

常見機構:銀行、投資銀行(證券公司)、保險公司、基金等數組

有價證券:是虛擬資本的一種形式,它自己沒價值,但有價格。框架

2 狹義的金融市場劃分

2.1 按交易程序劃分

  • 發行市場:又稱爲處理新發行證券的金融市場,籌集資金的公司、政府或公共部門經過發行新的股票和債券來進行融資。機器學習

  • 流通市場:又稱二級市場,是指已經發行的證券進行轉讓、交易的市場。函數

咱們經過一張圖來理解一下:學習

關於投資的幾個類別,通常咱們將天使、VC、PE三個部分統稱爲私募(Private Equity),指的是沒有在證券交易所公開上市交易的資產。網站

一、公司規模ui

天使投資主要投資早期創業公司;

VC投資中期高速發展型創業公司;

PE介入即將上市或被兼併收購的成熟企業。

二、資金規模

天使投資: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是最先上市的股票,一個公司的股票代碼跟車牌號差很少,可以顯示出這個公司的實力以及知名度

一、滬市A股票買賣的代碼是以600、601或603打頭(在上海證券交易所上市的全是主板)

二、深市A股票買賣的代碼是以000打頭,其中中小板代碼以002打頭,創業板股票代碼以300打頭

問題:那麼常常說的股票價格是什麼?怎麼造成的?

3.5.2 股票價格

股票價格(Stock Price)又叫股票行市,是指股票在證券市場上買賣的價格。股票在流通市場上的價格,纔是徹底意義上的股票的市場價格

股票初始發行價格=市盈率還原值×40%+股息還原率×20%+每股淨值×20%+預計當年股息與一年期存款利率還原值×20%,影響股票價格的因素有不少,如企業因素、盈利狀況、淨資產、市場、行業等

3.5.3 股票的交易時間和過程

  • 股票交易時間
    • 休息日:周6、週日和上證所公告的休市日不交易。(通常爲五1、十一國慶節、春節、元旦、清明節、端午節、中秋節等國家法定節假日)
  • 股票交易過程

(一)、集合競價階段:9:15 — 9:25

一、9:15 — 9:19能夠申報和撤單;9:20 — 9:25 能夠申報,不能夠撤單。

二、深圳交易所14:57 — 15:00實行集合競價,能夠申報,不能夠撤單。

(二)、連續競價階段

一、上海交易所:9:30 — 11:30;13:00 — 15:00

二、深圳交易所:9:30 — 11:30;13:00 — 14:56:59

(三)成交原則

價格優先,時間優先

3.5.4 交易費用

一、印花稅:1‰(賣的時候才收取,此爲國家稅收,全國統一)。
二、過戶費:深圳交易所無此項費用,上海交易所收費標準(按成交金額的0.02‰人民幣 [2]  )。
三、交易佣金:最高收費爲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


# 一、必須將時間索引類型編程Pandas默認的類型
stock_day.index = pd.to_datetime(stock_day.index)

# 二、進行頻率轉換日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時間類型
# 一、填入時間的字符串,格式有幾種, "2018-01-01" ,」01/02/2018「
pd.to_datetime("01/02/2017")

5.3 Pandas的時間序列類型

  • 一、轉換時間序列類型
# 傳入時間的列表
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)
  • 二、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來轉換

  • 三、經過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:時區

# 生成指定的時間序列
# 一、生成2017-01-02~2017-12-30,生成頻率爲1天, 不跳過週六週日
pd.date_range("2017-01-02", "2017-12-30", freq="D")

# 二、生成2017-01-02~2017-12-30,生成頻率爲1天, 跳過週六週日, 可以用在金融的數據,日線的數據
pd.date_range("2017-01-02", "2017-12-30", freq="B")

# 三、只知道開始時間日期,我也知道總共天數多少,生成序列, 從"2016-01-01", 共504天,跳過週末
pd.date_range("2016-01-01", periods=504, freq="B")

# 四、生成按照小時排列的時間序列數據
pd.date_range("2017-01-02", "2017-12-30", freq='H')

# 五、按照3H去進行生成
pd.date_range("2017-01-02", "2017-12-30", freq='3H')

# 六、按照1H30分鐘去進行生成時間序列
pd.date_range("2017-01-02", "2017-12-30", freq='1H30min')

# 七、按照每個月最後一天
pd.date_range("2017-01-02", "2017-12-30", freq='BM')

# 八、按照每月的第幾個星期幾
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 移動平均線的做用

移動平均線常常會做爲技術分析的基礎理論,從中衍生出各類技術指標策略。後面將會介紹簡單的基於均線的策略。

相關文章
相關標籤/搜索