1. 程式人生 > >day32 Python與金融量化分析(二)

day32 Python與金融量化分析(二)

fill 最小 all copy data oat 模型 主板 解析

第一部分:金融與量化投資

股票:

  • 股票是股份公司發給出資人的一種憑證,股票的持有者就是股份公司的股東。

股票的面值與市值

  • 面值表示票面金額
  • 市值表示市場價值

上市/IPO:

  • 企業通過證券交易所公開向社會增發股票以募集資金

股票的作用:

  • 出資證明、證明股東身份、對公司經營發表意見
  • 公司分紅、交易獲利

股票的分類

股票按業績分類:

  • 藍籌股:資本雄厚、信譽優良的公司的股票
  • 績優股:業績優良公司的股票
  • ST股:特別處理股票,連續兩年虧損或每股凈資產低於股票面值

股票按上市地區分類:

  • A股:中國大陸上市,人民幣認購買賣(T+1,漲跌幅10%)
  • B股:中國大陸上市,外幣認購買賣(T+1,T+3)
  • H股:中國香港上市(T+0,漲跌幅不設限制)
  • N股:美國紐約上市
  • S股:新加坡上市

股票市場的構成

  • 上市公司
  • 投資者(包括機構投資者)
  • 證監會、證券業協會、交易所
  • 證券中介機構

交易所

  • 上海證券交易所:只有一個主板(滬指)
  • 深圳證券交易所:
  1. 主板:大型成熟企業(深成指)
  2. 中小板:經營規模較小
  3. 創業板:尚處於成長期的創業企業

影響股價的因素

  • 公司自身因素:股票自身價值是決定股價最基本的因素,而這主要取決於發行公司的經營業績、資信水平以及連帶而來的股息紅利派發狀況、發展前景、股票預期收益水平等。
  • 行業因素:行業在國民經濟中地位的變更,行業的發展前景和發展潛力,新興行業引來的沖擊等,以及上市公司在行業中所處的位置,經營業績,經營狀況,資金組合的改變及領導層人事變動等都會影響相關股票的價格。
  • 市場因素:投資者的動向,大戶的意向和操縱,公司間的合作或相互持股,信用交易和期貨交易的增減,投機者的套利行為,公司的增資方式和增資額度等,均可能對股價形成較大影響。
  • 心理因素:情緒波動,判斷失誤,盲目追隨大戶、狂拋搶購
  • 經濟因素:經濟周期,國家的財政狀況,金融環境,國際收支狀況,行業經濟地位的變化,國家匯率的調整等
  • 政治因素

股票買賣(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與金融量化分析(二)