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

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

股票:python

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

股票的面值與市值正則表達式

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

上市/IPO:數據庫

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

股票的做用:json

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

股票的分類數組

股票按業績分類:數據結構

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

股票按上市地區分類:app

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

股票市場的構成框架

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

交易所dom

  • 上海證券交易所:只有一個主板(滬指)
  • 深圳證券交易所:
  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)
相關文章
相關標籤/搜索