day32 Python與金融量化分析(二)
阿新 • • 發佈:2017-09-04
fill 最小 all copy data oat 模型 主板 解析
第一部分:金融與量化投資
股票:
- 股票是股份公司發給出資人的一種憑證,股票的持有者就是股份公司的股東。
股票的面值與市值
- 面值表示票面金額
- 市值表示市場價值
上市/IPO:
- 企業通過證券交易所公開向社會增發股票以募集資金
股票的作用:
- 出資證明、證明股東身份、對公司經營發表意見
- 公司分紅、交易獲利
股票的分類
股票按業績分類:
- 藍籌股:資本雄厚、信譽優良的公司的股票
- 績優股:業績優良公司的股票
- ST股:特別處理股票,連續兩年虧損或每股凈資產低於股票面值
股票按上市地區分類:
- A股:中國大陸上市,人民幣認購買賣(T+1,漲跌幅10%)
- B股:中國大陸上市,外幣認購買賣(T+1,T+3)
- H股:中國香港上市(T+0,漲跌幅不設限制)
- N股:美國紐約上市
- S股:新加坡上市
股票市場的構成
- 上市公司
- 投資者(包括機構投資者)
- 證監會、證券業協會、交易所
- 證券中介機構
交易所
- 上海證券交易所:只有一個主板(滬指)
- 深圳證券交易所:
- 主板:大型成熟企業(深成指)
- 中小板:經營規模較小
- 創業板:尚處於成長期的創業企業
影響股價的因素
- 公司自身因素:股票自身價值是決定股價最基本的因素,而這主要取決於發行公司的經營業績、資信水平以及連帶而來的股息紅利派發狀況、發展前景、股票預期收益水平等。
- 行業因素:行業在國民經濟中地位的變更,行業的發展前景和發展潛力,新興行業引來的沖擊等,以及上市公司在行業中所處的位置,經營業績,經營狀況,資金組合的改變及領導層人事變動等都會影響相關股票的價格。
- 市場因素:投資者的動向,大戶的意向和操縱,公司間的合作或相互持股,信用交易和期貨交易的增減,投機者的套利行為,公司的增資方式和增資額度等,均可能對股價形成較大影響。
- 心理因素:情緒波動,判斷失誤,盲目追隨大戶、狂拋搶購
- 經濟因素:經濟周期,國家的財政狀況,金融環境,國際收支狀況,行業經濟地位的變化,國家匯率的調整等
- 政治因素
股票買賣(A股)
- 委托買賣股票 : 個人不能直接買賣,需要在券商開戶,進行委托購買
- 股票交易日:周一到周五(非法定節假日和交易所休市日)
- 股票交易時間:
- 9:15-9:25 開盤集合競價時間
- 9:30-11:30 前市,連續競價時間
- 13:00-15:00 後市,連續競價時間
- 14:57-15:00 深交所收盤集合競價時間
- T+1交易制度:股票買入後當天不能賣出,要在買入後的下一個交易日才能賣出
- 漲停、跌停限制
金融分析
基本面分析
- 宏觀經濟面分析:國家的財政政策、貨幣政策等
- 行業分析
- 公司分析:財務數據、業績報告等
技術面分析:各項技術指標
- K線
- MA(均線)
- KDJ(隨機指標)
- MACD(指數平滑移動平均線)
- ……
K線
金融量化投資
- 量化投資:利用計算機技術並且采用一定的數學模型去實踐投資理念,實現投資策略的過程。
- 量化投資的優勢:
- 避免主觀情緒、人性弱點和認知偏差,選擇更加客觀
- 能同時包括多角度的觀察和多層次的模型
- 及時跟蹤市場變化,不斷發現新的統計模型,尋找交易機會
- 在決定投資策略後,能通過回測驗證其效果
量化策略
- 量化策略:通過一套固定的邏輯來分析、判斷和決策,自動化地進行股票交易。
- 核心內容
- 選股
- 擇時
- 倉位管理
- 止盈止損
- 策略的周期
- 產生想法/學習知識
- 實現策略:Python
- 檢驗策略:回測/模擬交易
- 實盤交易
- 優化策略/放棄策略
第二部分:量化投資與Python
量化投資與Python
- 為什麽選擇Python?
- 其他選擇:Excel、SAS/SPSS、R
- 量化投資第三方相關模塊
- NumPy:數值計算
- pandas:數據分析
- Matplotlib:圖標繪制
- 如何使用Python進行量化投資
- 自己編寫:NumPy+pandas+Matplotlib+……
- 在線平臺:聚寬、優礦、米筐、Quantopian、……
- 開源框架:RQAlpha、QUANTAXIS、……
Ipython:交互式的Python命令行
- IPython:安裝:pip install ipython
- TAB鍵自動完成
- ?命令(內省、命名空間搜索)
- 執行系統命令(!)
- %run命令執行文件代碼
- %paste %cpaste命令執行剪貼板代碼
- 與編輯器和IDE交互
- 魔術命令:%timeit %pdb …
- 使用命令歷史
- 輸入與輸出變量(_, __, _2, _i2)
- 目錄書簽系統 %bookmark
- Ipython Notebook
Ipython常用的魔術命令
Python調試器命令
Ipython快捷鍵
NumPy:數組計算
- NumPy是高性能科學計算和數據分析的基礎包。它是pandas等其他各種工具的基礎。
- NumPy的主要功能:
- ndarray,一個多維數組結構,高效且節省空間
- 無需循環對整組數據進行快速運算的數學函數
- *讀寫磁盤數據的工具以及用於操作內存映射文件的工具
- *線性代數、隨機數生成和傅裏葉變換功能
- *用於集成C、C++等代碼的工具
- 安裝方法:pip install numpy
- 引用方式:import numpy as np
NumPy:ndarray-多維數組對象
- 創建ndarray:np.array()
- 為什麽要使用ndarray:
- 例1:已知若幹家跨國公司的市值(美元),將其換算為人民幣
- 例2:已知購物車中每件商品的價格與商品件數,求總金額
- ndarray還可以是多維數組,但元素類型必須相同
- 常用屬性:
- T 數組的轉置(對高維數組而言)
- dtype 數組元素的數據類型
- size 數組元素的個數
- ndim 數組的維數
- shape 數組的維度大小(以元組形式)
NumPy:ndarray-多維數組對象
- dtype:
- bool_, int(8,16,32,64), uint(8,16,32,64), float(16,32,64)
- 類型轉換:astype()
- 創建ndarray:
- array() 將列表轉換為數組,可選擇顯式指定dtype
- arange() range的numpy版,支持浮點數
- linspace() 類似arange(),第三個參數為數組長度
- zeros() 根據指定形狀和dtype創建全0數組
- ones() 根據指定形狀和dtype創建全1數組
- empty() 根據指定形狀和dtype創建空數組(隨機值)
- eye() 根據指定邊長和dtype創建單位矩陣
NumPy:索引和切片
- 數組和標量之間的運算
- a+1 a*3 1//a a**0.5
- 同樣大小數組之間的運算
- a+b
- a/b
- a**b
- 數組的索引
- a[5]
- a2[2][3]
- a2[2,3]
- 數組的切片
- a[5:8]
- a[:3] = 1
- a2[1:2, :4]
- a2[:,:1]
- a2[:,1]
- 與列表不同,數組切片時並不會自動復制,在切片數組上的修改會影響原數組。
- b = a[:4]
- b[-1] = 250
- 解決方法:
- copy()】 b = a[:4] b[-1] = 250
NumPy:布爾型索引
- 問題:給一個數組,選出數組中所有大於5的數。
- 答案:a[a>5]
- 原理: a>5會對a中的每一個元素進行判斷,返回一個布爾數組 布爾型索引:將同樣大小的布爾數組傳進索引,會返回一個由所有True對應位置的元素的數組
- 問題2:給一個數組,選出數組中所有大於5的偶數。
- 問題3:給一個數組,選出數組中所有大於5的數和偶數。
- 答案: a[(a>5) & (a%2==0)] a[(a>5) | (a%2==0)]
NumPy:花式索引*
- 問題1:對於一個數組,選出其第1,3,4,6,7個元素,組成新的二維數組。
- 答案:a[[1,3,4,6,7]]
- 問題2:對一個二維數組,選出其第一列和第三列,組成新的二維數組。
- 答案:a[:,[1,3]]
NumPy:通用函數
- 通用函數:能同時對數組中所有元素進行運算的函數
- 常見通用函數:
- 一元函數:abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
- 二元函數:add, substract, multiply, divide, power, mod, maximum, mininum,
NumPy:數學和統計方法
- 常用函數:
- sum 求和
- mean 求平均數
- std 求標準差 v
- ar 求方差
- min 求最小值
- max 求最大值
- argmin 求最小值索引
- argmax 求最大值索引
NumPy:隨機數生成
- 常用函數
- rand 給定形狀產生隨機數組(0到1之間的數)
- randint 給定形狀產生隨機整數
- choice 給定形狀產生隨機選擇
- shuffle 與random.shuffle相同
- uniform 給定形狀產生隨機數組
pandas:數據分析
- pandas是一個強大的Python數據分析的工具包。
- pandas是基於NumPy構建的。
- pandas的主要功能
- 具備對其功能的數據結構DataFrame、Series
- 集成時間序列功能
- 提供豐富的數學運算和操作
- 靈活處理缺失數據
- 安裝方法:pip install pandas
- 引用方法:import pandas as pd
pandas:Series
- Series是一種類似於一位數組的對象,由一組數據和一組與之相關的數據標簽(索引)組成。
- Series比較像列表(數組)和字典的結合體
- 創建方式:
- pd.Series([4,7,-5,3])
- pd.Series([4,7,-5,3],index=[‘a‘,‘b‘,‘c‘,‘d‘])
- pd.Series({‘a‘:1, ‘b‘:2})
- pd.Series(0, index=[‘a‘,‘b‘,‘c‘,‘d‘])
- 獲取值數組和索引數組:
- values屬性
- index屬性
pandas:Series特性
- Series支持NumPy模塊的特性(下標):
- 從ndarray創建Series:Series(arr)
- 與標量運算:sr*2
- 兩個Series運算:sr1+sr2
- 索引:sr[0], sr[[1,2,4]]
- 切片:sr[0:2](切片依然是視圖形式)
- 通用函數:np.abs(sr)
- 布爾值過濾:sr[sr>0]
- 統計函數:mean() sum() cumsum()
pandas:整數索引
- 整數索引的pandas對象往往會使新手抓狂。
- 例:
- sr = np.Series(np.arange(4.))
- sr[-1]
- 如果索引是整數類型,則根據整數進行數據操作時總是面向標簽的。
- loc屬性 以標簽解釋
- iloc屬性 以下標解釋
pandas:Series數據對齊
- pandas在運算時,會按索引進行對齊然後計算。如果存在不同的索引,則結果的索引是兩個操作數索引的並集。
- 例:
- sr1 = pd.Series([12,23,34], index=[‘c‘,‘a‘,‘d‘])
- sr2 = pd.Series([11,20,10], index=[‘d‘,‘c‘,‘a‘,])
- sr1+sr2
- sr3 = pd.Series([11,20,10,14], index=[‘d‘,‘c‘,‘a‘,‘b‘])
- sr1+sr3
- 如何在兩個Series對象相加時將缺失值設為0?
- sr1.add(sr2, fill_value=0)
- 靈活的算術方法:add, sub, div, mul
pandas:Series缺失數據
- 缺失數據:使用NaN(Not a Number)來表示缺失數據。其值等於np.nan。內置的None值也會被當做NaN處理。
- 處理缺失數據的相關方法:
- dropna() 過濾掉值為NaN的行
- fillna() 填充缺失數據
- isnull() 返回布爾數組,缺失值對應為True
- notnull() 返回布爾數組,缺失值對應為False
- 過濾缺失數據:
- sr.dropna()
- sr[data.notnull()]
- 填充缺失數據:fillna(0)
pandas:DataFrame
- DataFrame是一個表格型的數據結構,含有一組有序的列。
- DataFrame可以被看做是由Series組成的字典,並且共用一個索引。
- 創建方式:
- pd.DataFrame({‘one‘:[1,2,3,4],‘two‘:[4,3,2,1]})
- pd.DataFrame({‘one‘:pd.Series([1,2,3],index=[‘a‘,‘b‘,‘c‘]), ‘two‘:pd.Series([1,2,3,4],index=[‘b‘,‘a‘,‘c‘,‘d‘])})
- ……
- csv文件讀取與寫入:
- df.read_csv(‘filename.csv‘)
- df.to_csv()
pandas:DataFrame查看數據
- 查看數據常用屬性及方法:
- index 獲取索引
- T 轉置
- columns 獲取列索引
- values 獲取值數組
- describe() 獲取快速統計
- DataFrame各列name屬性:列名
- rename(columns={})
pandas:DataFrame索引和切片
- DataFrame有行索引和列索引。
- 通過標簽獲取:
- df[‘A‘]
- df[[‘A‘, ‘B‘]]
- df[‘A‘][0]
- df[0:10][[‘A‘, ‘C‘]]
- df.loc[:,[‘A‘,‘B‘]]
- df.loc[:,‘A‘:‘C‘]
- df.loc[0,‘A‘]
- df.loc[0:10,[‘A‘,‘C‘]]
- 通過位置獲取:
- df.iloc[3]
- df.iloc[3,3]
- df.iloc[0:3,4:6]
- df.iloc[1:5,:]
- df.iloc[[1,2,4],[0,3]]
- 通過布爾值過濾:
- df[df[‘A‘]>0]
- df[df[‘A‘].isin([1,3,5])]
- df[df<0] = 0
pandas:DataFrame數據對齊與缺失數據
- DataFrame對象在運算時,同樣會進行數據對其,結果的行索引與列索引分別為兩個操作數的行索引與列索引的並集。
- DataFrame處理缺失數據的方法:
- dropna(axis=0,how=‘any‘,…)
- fillna()
- isnull()
- notnull()
pandas:其他常用方法
- pandas常用方法(適用Series和DataFrame):
- mean(axis=0,skipna=False)
- sum(axis=1)
- sort_index(axis, …, ascending) 按行或列索引排序
- sort_values(by, axis, ascending) 按值排序
- NumPy的通用函數同樣適用於pandas
- apply(func, axis=0) 將自定義函數應用在各行或者各列上 ,func可返回標量或者Series
- applymap(func) 將函數應用在DataFrame各個元素上
- map(func) 將函數應用在Series各個元素上
*pandas:層次化索引
- 層次化索引是Pandas的一項重要功能,它使我們能夠在一個軸上擁有多個索引級別。
- 例:data=pd.Series(np.random.rand(9), index=[[‘a‘, ‘a‘, ‘a‘, ‘b‘, ‘b‘, ‘b‘, ‘c‘, ‘c‘, ‘c‘], [1,2,3,1,2,3,1,2,3]])
pandas:時間對象處理
- 時間序列類型:
- 時間戳:特定時刻
- 固定時期:如2017年7月
- 時間間隔:起始時間-結束時間
- Python標準庫:datetime
- date time datetime timedelta
- dt.strftime()
- strptime()
- 第三方包:dateutil
- dateutil.parser.parse()
- 成組處理日期:pandas
- pd.to_datetime([‘2001-01-01‘, ‘2002-02-02‘])
- 產生時間對象數組:date_range
- start 開始時間
- end 結束時間
- periods 時間長度
- freq 時間頻率,默認為‘D‘,可選H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),…
pandas:時間序列
- 時間序列就是以時間對象為索引的Series或DataFrame。
- datetime對象作為索引時是存儲在DatetimeIndex對象中的。
- 時間序列特殊功能:
- 傳入“年”或“年月”作為切片方式
- 傳入日期範圍作為切片方式
pandas:從文件讀取
- 讀取文件:從文件名、URL、文件對象中加載數據
- read_csv 默認分隔符為csv
- read_table 默認分隔符為\t
- read_excel 讀取excel文件
- 讀取文件函數主要參數:
- sep 指定分隔符,可用正則表達式如‘\s+‘
- header=None 指定文件無列名
- names 指定列名
- index_col 指定某列作為索引
- skip_row 指定跳過某些行
- na_values 指定某些字符串表示缺失值
- parse_dates 指定某些列是否被解析為日期,布爾值或列表
pandas:寫入到文件
- 寫入到文件: to_csv
- 寫入文件函數的主要參數:
- sep
- na_rep 指定缺失值轉換的字符串,默認為空字符串
- header=False 不輸出列名一行
- index=False 不輸出行索引一列
- cols 指定輸出的列,傳入列表
- 其他文件類型:json, XML, HTML, 數據庫
- pandas轉換為二進制文件格式(pickle):
- save
- load
Matplotlib:繪圖和可視化
- Matplotlib是一個強大的Python繪圖和數據可視化的工具包。
- 安裝方法:pip install matplotlib
- 引用方法:import matplotlib.pyplot as plt
- 繪圖函數:plt.plot()
- 顯示圖像:plt.show()
Matplotlib:plot函數
- plot函數:
- 線型linestyle(-,-.,--,..)
- 點型marker(v,^,s,*,H,+,x,D,o,…)
- 顏色color(b,g,r,y,k,w,…)
- plot函數繪制多條曲線
- 標題:title
- x軸:xlabel
- y軸:ylabel
- 其他類型圖像:
- hist 頻數直方圖
*Matplotlib:畫布與圖
- 畫布:figure
- fig = plt.figure()
- 圖:subplot
- ax1 = fig.add_subplot(2,2,1)
- 調節子圖間距:
- subplots_adjust(left, bottom, right, top, wspace, hspace)
day32 Python與金融量化分析(二)