第一部分:金融與量化投資
股票:python
- 股票是股份公司發給出資人的一種憑證,股票的持有者就是股份公司的股東。
股票的面值與市值正則表達式
上市/IPO:數據庫
股票的做用:json
- 出資證實、證實股東身份、對公司經營發表意見
- 公司分成、交易獲利
股票的分類數組
股票按業績分類:數據結構
- 藍籌股:資本雄厚、信譽優良的公司的股票
- 績優股:業績優良公司的股票
- ST股:特別處理股票,連續兩年虧損或每股淨資產低於股票面值
股票按上市地區分類:app
- A股:中國大陸上市,人民幣認購買賣(T+1,漲跌幅10%)
- B股:中國大陸上市,外幣認購買賣(T+1,T+3)
- H股:中國香港上市(T+0,漲跌幅不設限制)
- N股:美國紐約上市
- S股:新加坡上市
股票市場的構成框架
- 上市公司
- 投資者(包括機構投資者)
- 證監會、證券業協會、交易所
- 證券中介機構
交易所dom
- 上海證券交易所:只有一個主板(滬指)
- 深圳證券交易所:
- 主板:大型成熟企業(深成指)
- 中小板:經營規模較小
- 創業板:尚處於成長期的創業企業
影響股價的因素編輯器
- 公司自身因素:股票自身價值是決定股價最基本的因素,而這主要取決於發行公司的經營業績、資信水平以及連帶而來的股息紅利派發情況、發展前景、股票預期收益水平等。
- 行業因素:行業在國民經濟中地位的變動,行業的發展前景和發展潛力,新興行業引來的衝擊等,以及上市公司在行業中所處的位置,經營業績,經營情況,資金組合的改變及領導層人事變更等都會影響相關股票的價格。
- 市場因素:投資者的動向,大戶的意向和操縱,公司間的合做或相互持股,信用交易和期貨交易的增減,投機者的套利行爲,公司的增資方式和增資額度等,都可能對股價造成較大影響。
- 心理因素:情緒波動,判斷失誤,盲目追隨大戶、狂拋搶購
- 經濟因素:經濟週期,國家的財政情況,金融環境,國際收支情況,行業經濟地位的變化,國家匯率的調整等
- 政治因素
股票買賣(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?
- 量化投資第三方相關模塊
- 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[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個元素,組成新的二維數組。
- 問題2:對一個二維數組,選出其第一列和第三列,組成新的二維數組。
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是一種相似於一位數組的對象,由一組數據和一組與之相關的數據標籤(索引)組成。
- 建立方式:
- 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'])
- 獲取值數組和索引數組:
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]
- 若是索引是整數類型,則根據整數進行數據操做時老是面向標籤的。
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屬性:列名
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
- 成組處理日期: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):
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
- 其餘類型圖像:
*Matplotlib:畫布與圖
- 畫布:figure
- 圖:subplot
- ax1 = fig.add_subplot(2,2,1)
- 調節子圖間距:
- subplots_adjust(left, bottom, right, top, wspace, hspace)