《三天搞定Python基礎(chǔ)概念之第三天》中文版 (排版優(yōu)化)

第三天主要是講Pandas、Statsmodels等library,是入門的好材料,但想提高還要多加練習(xí)。



前言:
首先,非常感謝Jiang老師將其分享出來!本課件非常經(jīng)典!
經(jīng)過筆者親測,竟然確實只要三天,便可管中窺豹洞見Python及主要庫的應(yīng)用。實屬難得誠意之作!
其次,只是鑒于Jiang老師提供的原始課件用英文寫成,而我作為Python的愛好者計算機英文又不太熟練,講義看起來比較慢,為了提高自學(xué)課件的效率,故我花了點時間將其翻譯成中文,以便將來自己快速復(fù)習(xí)用。
該版僅用于個人學(xué)習(xí)之用。
再次,譯者因工作中需要用到數(shù)據(jù)分析、風(fēng)險可視化與管理,因此學(xué)習(xí)python,翻譯水平有限,請諒解。
在征得原作者Yupeng Jiang老師的同意后,現(xiàn)在我將中文版本分享給大家。

作者:Dr.Yupeng Jiang

翻譯:Murphy Wan

大綱( Outline)

  • 第1天:Python和科學(xué)編程介紹。 Python中的基礎(chǔ)知識: 數(shù)據(jù)類型、控制結(jié)構(gòu)、功能、I/O文件

  • 第2天:用Numpy,Scipy,Matplotlib和其他模塊進行計算。 用Python解決一些數(shù)學(xué)問題。

  • 第3天:時間序列:用Pandas進行統(tǒng)計和實際數(shù)據(jù)分析。 隨機和蒙特卡羅。

開啟第三天,首先感謝今天仍在努力的自己

第三天的主要內(nèi)容

  • Pandas
  • Stochastics and Monte Carlo (隨機與蒙特卡羅)
  • Statistical application (統(tǒng)計應(yīng)用)
  • Lab session (實驗部分)

01 關(guān)于Pandas

  • 開發(fā)者Wes McKinney從2008年開始專注于開發(fā)Pandas,當(dāng)時在AQR資本管理公司,處理金融數(shù)據(jù)的定量分析需要高性能和高靈活性的工具。(注釋:痛點和需求)
  • Pandas是一個開源庫,為Python提供高性能,易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具。
  • Python長期以來一直是數(shù)據(jù)管理和準(zhǔn)備的手段,但是對于數(shù)據(jù)分析和建模來說,確實不太適用。Pandas的誕生填補了這個缺口。
  • Pandas線性和面板回歸之外沒有顯著的建模功能。為此,請看Starmodels和Scikit-learn。

Pandas 基礎(chǔ)

  • Numpy通常在Pandas對象上工作。在pandas中,索引和標(biāo)簽數(shù)據(jù)由DataFrame類管理。它類似于SQL 數(shù)據(jù)表和電子表格。例如:我們可以創(chuàng)建一個DataFrame對象:
import numpy as np
import pandas as pd
df = pd.DataFrame([10, 20, 30, 40], \
                  columns = [’Numbers’], \
                  index = [’a’, ’b’, ’c’, ’d’])

  • 讓我們看下DataFrame對象。它是顯示如下:
  • 我們可以執(zhí)行以下代碼在DataFrame對象中顯示一些典型的操作。

import pandas as pd

df = pd.DataFrame([10, 20, 30, 40], \
                  columns = [’Numbers’], \
                  index = [’a’, ’b’, ’c’, ’d’])
print(df.index)     #顯示索引 show index
print(df.columns)    #顯示列名 show column names
print(df.ix[’c’])     #通過索引選擇  select via index
print(df.ix[[’a’, ’d’]])  # 多選 multi-select
print(df.ix[df.index[1:3]])  # 其他another
print(df.sum())   # 每列求和  sum per column
ts = df ** 2    # 創(chuàng)建新的DataFrame create new DataFrame
print(ts)

放大DataFrame

import pandas as pd

df = pd.DataFrame([10, 20, 30, 40], \
                  columns = [’Numbers’], \
                  index = [’a’, ’b’, ’c’, ’d’])

#add a new column called ’floats’ directly
df[’floats’] = (1.5, 2.5, 3.5, 4.5)

#add a new column called ’names’ by index
df[’names’] = pd.DataFrame([’Dan’, \
                            ’Cox’, ’Ale’, ’Bob’], \
                            index = [’d’, ’c’, ’a’, ’b’])
# add a new object to df
df = df.append(pd.DataFrame({ \
               ’Numbers’:66, ’floats’:5.5, \
               ’names’:’Yor’}, index=[’y’,]))

處理缺失的數(shù)據(jù)

  • 我們通過"join"函數(shù)添加一個名為\squares的新列。
  df = df.join(pd.DataFrame([1,4,9,16,25], \
               index=[’a’, ’b’, ’c’, ’d’, ’x’], \
               columns=[’squares’,]),how=’outer’)  #<--squares
  • 我們注意到?jīng)]有由“\x”索引的行,且由“\y”索引的行在新列中沒有被分配值。這里,我們使用
  how=’outer’
  • 用來顯示所有的潛在數(shù)據(jù)。
    (注釋:沒太搞清楚這幾段話的意思。不過,看代碼倒是很清楚,即通過外鏈outer方式j(luò)oin兩張表,會顯示所有數(shù)據(jù),缺失數(shù)據(jù)的地方會顯示nan。)

處理金融數(shù)據(jù)

  • Pandas內(nèi)置函數(shù)DataReader從以下網(wǎng)站檢索數(shù)據(jù):
    • Yahoo! Finance (Yahoo)
    • Google Finance (Google)
    • St. Louis FED (Fred)
    • Kenneth French’s data library (Famafrench)
    • World Band (via pandas.io.wb)
  • 要使用DataReader函數(shù),我們需要
    import pandas.io.data as web

富時100數(shù)據(jù)(FTSE 100 data)

import pandas as pd
import pandas.io.data as web

FT = web.DataReader(name = ’^FTSE’, \
data_source = ’yahoo’, \
start = ’2000-1-1’)
print(FT.info()) # show information
print(FT.tail()) # show last 5 rows
# plot the FTSE 100 graph
FT[’Close’].plot(figsize = (8, 6), \
grid = True)


計算每日回報 (Calculate the daily return)

import pandas as pd
import pandas.io.data as web
import numpy as np

FT = web.DataReader(name = ’^FTSE’, \
data_source = ’yahoo’, \
start = ’2000-1-1’)
FT[’Return’] = np.log(FT[’Close’] \
/ FT[’Close’].shift(1))
FT[’Return’].plot(figsize = (8, 6), \
grid = True)

顯示數(shù)據(jù)并同時返回(Show data and return simultaneously)

import pandas as pd
import pandas.io.data as web
import numpy as np
FT = web.DataReader(name = ’^FTSE’, \
data_source = ’yahoo’, \
start = ’2000-1-1’)
![Uploading datasub_463200.png . . .]
FT[’Return’] = np.log(FT[’Close’] \
/ FT[’Close’].shift(1))
FT[[’Close’, ’Return’]].plot( \
subplots = True, style = ’b’, \
figsize = (8, 6), grid = True)

算術(shù)交易:移動平均(Algorithmic trading: Moving average)

import pandas as pd
import pandas.io.data as web
import numpy as np

FT = web.DataReader(name = ’^FTSE’, \
data_source = ’yahoo’, \
start = ’2000-1-1’)
FT[’MA42D’] = pd.rolling_mean(FT[’Close’], \
window = 42)
FT[’MA252D’] = pd.rolling_mean(FT[’Close’], \
window = 252)
FT[[’Close’, ’MA42D’, ’MA252D’]].plot( \
figsize = (8, 6), grid = True)

波動率:年化日志回報標(biāo)準(zhǔn)差?(Volatility: Annualised log return StD)

import pandas as pd
import pandas.io.data as web
import numpy as np

FT = web.DataReader(name = ’^FTSE’, \
data_source = ’yahoo’, \
start = ’2000-1-1’)
FT[’Return’] = np.log(FT[’Close’] \
/ FT[’Close’].shift(1))
FT[’Vol’] = np.sqrt(252) * \
pd.rolling_std(FT[’Return’],\
window = 252)
FT[’Vol’].plot(figsize = (8, 6), \
grid = True)

相關(guān)和線性回歸

  • 我們實現(xiàn)一個符合以下目標(biāo)的代碼

    • 捕獲富時100指數(shù)和英國石油BP(倫敦)的歷史價格。

    • 評估這兩種資產(chǎn)的歷史回報。

    • 對兩個回報做線性回歸,并獲得其回歸函數(shù)。

(代碼在datacorr.py里)


應(yīng)用實例:配對交易 (pair trading)

圖:
左:從2011-01-01開始,殼牌(B)和BP(倫敦)的歷史股價。
右:殼牌和BP的相對性能。

自學(xué)Pandas

  • Pandas的官方文件可以在這里找到:http://pandas.pydata.org/pandas-docs/stable/

  • 官方文檔為初學(xué)者提供了詳細的結(jié)構(gòu)化材料。

  • 與其他軟件包類似,只要遇到錯誤,請檢查第一個錯誤消息。 如果您無法解決問題,請先嘗試Google。 大量的人在互聯(lián)網(wǎng)上問同樣的問題。


02隨機與蒙特卡羅


用Python產(chǎn)生隨機數(shù)

  • 隨機數(shù)可以通過numpy.random生成。
import numpy.random as npr
import matplotlib.pyplot as plt
import numpy as np

X = npr.standard_normal((5000))
Y = npr.normal(1, 1, (5000))
Z = npr.uniform(-3, 3, (5000))
W = npr.lognormal(0, 1, (5000))

  • 我們可以繪制直方圖來檢查分布。

![Uploading FThist_677874.png . . .]

  • 圖:在前一張幻燈片中生成的隨機數(shù)的直方圖。

蒙特卡洛

  • 蒙特卡羅是摩納哥的一個地區(qū)和賭場......

蒙特卡羅方法

  • 第一次人們開始研究蒙特卡羅方法是要評估π。

  • 通過概率論,蒙特卡羅可以用作數(shù)值積分法。 例如,

  • 其中p(x)是U(0;1)的概率密度函數(shù)。

  • 實踐中,蒙特卡羅廣泛應(yīng)用于統(tǒng)計力學(xué),量子物理學(xué),金融衍生產(chǎn)品定價和風(fēng)險管理。

一個MC示例:期權(quán)定價

  • 蒙特卡洛通常用于評估期權(quán)價格。

  • 我們不會涉及任何理論推論。 對于歐式看漲期權(quán),其價格可以通過公式給出

  • 其中S為當(dāng)前基本股票價格,σ為股票波動率,r為利率,T為期權(quán)期權(quán),K為行使價,Φ為標(biāo)準(zhǔn)正態(tài)隨機變量。

  • 對于這個例子。 讓我們假設(shè)S = 100,K = 100,
    σ= 50%,T = 1,r = 0.05。

通過Python實現(xiàn)MC (MC by Python)

import numpy as np
import numpy.random as npr
from scipy.stats import norm

S = 100; K = 100; T = 1
r = 0.05; vol = 0.5
I = 10000 # MC paths
Z = npr.standard_normal(I)
ST = S * np.exp((r - 0.5 * vol**2) \
* T + vol * np.sqrt(T) * Z)
V = np.mean(np.exp(-r * T) \
* np.maximum(ST - K, 0))
print(V)

蒙特卡羅路徑圖

圖:一幅蒙特卡羅模擬股票的圖。

MC的準(zhǔn)確度如何?

  • 您運行的所有MC都應(yīng)同時輸出方差或標(biāo)準(zhǔn)偏差。 對于最后一張幻燈片中的代碼,我們有結(jié)果

    • V ≈ 21.54 , std ≈ 0.40
  • 實際上,我們有一個封閉式的歐式看漲期權(quán)方案

當(dāng)


(看到公式不要慌,先冷靜哈!慢慢來。)

03統(tǒng)計應(yīng)用 (Statistical application)

直方圖 (Histogram plot)


import pandas as pd
import pandas.io.data as web
import numpy as np

FT = web.DataReader(name = ’^FTSE’,\
data_source = ’yahoo’,\
start = ’2000-1-1’)
FT[’Return’] = np.log(FT[’Adj Close’] \
/ FT[’Adj Close’].shift(1))
FT[’Return’].hist(bins = 100, \
figsize = (8,6))

正態(tài)檢驗:QQ圖

  • 我們通常使用分位數(shù)分布圖(QQ圖)來驗證該分布是否正常。

  • 為了實現(xiàn)QQ圖,我們需要一個名為statsmodels的庫。 我們導(dǎo)入相應(yīng)的庫

    • import statsmodel.api as sm
  • statsmodels 是一個非常有用的統(tǒng)計分析庫,但我們不會給出太多的介紹。

  • 另一個有用的庫被稱為scikit-learning,它是一個統(tǒng)計和機器學(xué)習(xí)庫。


QQ-plot

import pandas as pd
import pandas.io.data as web
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

FT = web.DataReader(name = ’^FTSE’,\
data_source = ’yahoo’,\
start = ’2000-1-1’)
FT[’Return’] = np.log(FT[’Adj Close’] \
/ FT[’Adj Close’].shift(1))
sm.qqplot(FT[’Return’].dropna(),line=’s’)
plt.grid(True)
plt.xlabel(’Theoretical quantiles’)
plt.ylabel(’Sample quantiles’)

QQ-plot


Skew and kurtosis (斜度與峰值?)


import pandas.io.data as web
import numpy as np
import scipy.stats as scs

FT = web.DataReader(name = ’^FTSE’,\
data_source = ’yahoo’,\
start = ’2000-1-1’)
FT[’Return’] = np.log(FT[’Adj Close’] \
/ FT[’Adj Close’].shift(1))
data = FT[’Return’].dropna() # 將缺失值丟掉 leave nan


print(’Skew is %f’ %scs.skew(data))
print(’Skew test p-value is %f’ \
%scs.skewtest(data)[1])
print(’Kurt is %f’ %scs.kurtosis(data))
print(’Kurt test p-value is %f’ \
%scs.kurtosistest(data)[1])
print(’Normal test p-value is %f’ \
%scs.normaltest(data)[1])
  • 較小的p值意味著否決數(shù)據(jù)是正態(tài)分布的假設(shè)。

04 實驗部分 (Lab session)


目標(biāo)1:蒙特卡羅模擬

  • 我有一個隨機過程

  • 其中Φ?N(0,1)(標(biāo)準(zhǔn)正態(tài)分布),t是自變量,表示時間(x軸),參數(shù)為

    • x0 = 1,θ = 1, μ = 1, σ = 0.5
  • 嘗試為 t = 10 生成10000個Monte Carlo路徑。然后評估您的MC路徑的平均值,用解析平均(analytical mean)進行檢查


目標(biāo)2:P&L分析

  • 去雅虎網(wǎng)站,試圖用Pandas獲取以下股票調(diào)整后的收盤價
['RDSB.L','BP.L','AAPL','MSFT']
  • 然后繪制股票價格。
  • 讓我們假設(shè)兩個靜態(tài)交易策略:

    • 原油策略:買1'RDSB.L',賣5'BP.L'
    • 科技策略:買3'AAPL', 賣4'MSFT'
  • 嘗試獲得兩個Pandas series,存儲的價值兩個不同策略的組合。(Try to obtain two pandas series, which stored the value two portfolios of di erent strategies.)

  • 嘗試評估兩種策略的每日損益(P&L)。 每日P&L由以下公式定義:
  • 分析兩個投資組合的日常損益,分別采用不同的正態(tài)檢驗。 繪制直方圖和QQ圖。

三天全部結(jié)束,辛苦了!想必你也獲得了不少收獲!繼續(xù)加油,讓我們做的更好!

傳送門-->回到第二天(Day1)
傳送門-->回到第一天(Day2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容