Skip to content

Commit eb665ff

Browse files
authored
Update D3_of_3Day_DoneWithPython.md
1 parent 73be7d2 commit eb665ff

File tree

1 file changed

+213
-0
lines changed

1 file changed

+213
-0
lines changed

D3_of_3Day_DoneWithPython.md

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,216 @@
4242

4343
```python
4444
```
45+
46+
47+
48+
49+
50+
51+
52+
> 第三天主要是讲Pandas、Statsmodels等library,是入门的好材料,但想提高还要多加练习。
53+
---
54+
![](http://upload-images.jianshu.io/upload_images/5522220-6d4a45bc2b3130f1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
55+
--->![](http://upload-images.jianshu.io/upload_images/5522220-6df558ad4d662c99.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
56+
```
57+
前言:首先,非常感谢Jiang老师将其分享出来!本课件非常经典!经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用。实属难得诚意之作!其次,只是鉴于Jiang老师提供的原始课件用英文写成,而我作为Python的爱好者计算机英文又不太熟练,讲义看起来比较慢,为了提高自学课件的效率,故我花了点时间将其翻译成中文,以便将来自己快速复习用。该版仅用于个人学习之用。再次,译者因工作中需要用到数据分析、风险可视化与管理,因此学习python,翻译水平有限,请谅解。在征得原作者Yupeng Jiang老师的同意后,现在我将中文版本分享给大家。
58+
```
59+
## 作者:Dr.Yupeng Jiang* 伦敦大学学院 数学系  (全球顶尖大学,世界排名第7 [《2018QS世界大学排名》](https://www.topuniversities.com/university-rankings/world-university-rankings/2018),英国排名第3)* 2016年6月5日* [课件来自] https://zhuanlan.zhihu.com/p/21332075## 翻译:Murphy Wan
60+
>## 大纲( Outline)
61+
* 第1天:Python和科学编程介绍。 Python中的基础知识: 数据类型、控制结构、功能、I/O文件
62+
* 第2天:用Numpy,Scipy,Matplotlib和其他模块进行计算。 用Python解决一些数学问题。
63+
* 第3天:时间序列:用Pandas进行统计和实际数据分析。 随机和蒙特卡罗。
64+
65+
>## 开启第三天,首先感谢今天仍在努力的自己
66+
![](http://upload-images.jianshu.io/upload_images/5522220-3219f4dd70517dd8.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
67+
68+
>## 第三天的主要内容
69+
 -  Pandas  - Stochastics and Monte Carlo (随机与蒙特卡罗) - Statistical application (统计应用) -  Lab session (实验部分)
70+
71+
72+
>## 01 关于Pandas
73+
* 开发者Wes McKinney从2008年开始专注于开发Pandas,当时在AQR资本管理公司,处理金融数据的定量分析需要高性能和高灵活性的工具。(注释:痛点和需求)* Pandas是一个开源库,为Python提供高性能,易于使用的数据结构和数据分析工具。* Python长期以来一直是数据管理和准备的手段,但是对于数据分析和建模来说,确实不太适用。Pandas的诞生填补了这个缺口。* Pandas线性和面板回归之外没有显著的建模功能。为此,请看Starmodels和Scikit-learn。
74+
75+
76+
> ## Pandas 基础
77+
* Numpy通常在Pandas对象上工作。在pandas中,索引和标签数据由DataFrame类管理。它类似于SQL 数据表和电子表格。例如:我们可以创建一个DataFrame对象:
78+
```pythonimport numpy as npimport pandas as pddf = pd.DataFrame([10, 20, 30, 40], \                  columns = [’Numbers’], \                  index = [’a’, ’b’, ’c’, ’d’])```
79+
---
80+
* 让我们看下DataFrame对象。它是由给出
81+
![](http://upload-images.jianshu.io/upload_images/5522220-7e2c72c2cbffa88e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
82+
* 我们可以执行以下代码在DataFrame对象中显示一些典型的操作。
83+
---
84+
```pythonimport pandas as pd
85+
df = pd.DataFrame([10, 20, 30, 40], \                  columns = [’Numbers’], \                  index = [’a’, ’b’, ’c’, ’d’])print(df.index)     #显示索引 show indexprint(df.columns)    #显示列名 show column namesprint(df.ix[’c’])     #通过索引选择  select via indexprint(df.ix[[’a’, ’d’]])  # 多选 multi-selectprint(df.ix[df.index[1:3]])  # 其他anotherprint(df.sum())   # 每列求和  sum per columnts = df ** 2    # 创建新的DataFrame create new DataFrameprint(ts)```
86+
87+
>## 放大DataFrame
88+
```pythonimport pandas as pd
89+
df = pd.DataFrame([10, 20, 30, 40], \                  columns = [’Numbers’], \                  index = [’a’, ’b’, ’c’, ’d’])
90+
#add a new column called ’floats’ directlydf[’floats’] = (1.5, 2.5, 3.5, 4.5)
91+
#add a new column called ’names’ by indexdf[’names’] = pd.DataFrame([’Dan’, \                            ’Cox’, ’Ale’, ’Bob’], \                            index = [’d’, ’c’, ’a’, ’b’])# add a new object to dfdf = df.append(pd.DataFrame({ \               ’Numbers’:66, ’floats’:5.5, \               ’names’:’Yor’}, index=[’y’,]))```
92+
93+
94+
>## 处理缺失的数据
95+
* 我们通过"join"函数添加一个名为\squares的新列。
96+
```pyhon  df = df.join(pd.DataFrame([1,4,9,16,25], \               index=[’a’, ’b’, ’c’, ’d’, ’x’], \               columns=[’squares’,]),how=’outer’)  #<--squares```
97+
* 我们注意到没有由“\x”索引的行,且由“\y”索引的行在新列中没有被分配值。这里,我们使用```python  how=’outer’```
98+
* 用来显示所有的潜在数据。(注释:没太搞清楚这几段话的意思。不过,看代码倒是很清楚,即通过外链outer方式join两张表,会显示所有数据,缺失数据的地方会显示nan。)
99+
100+
---
101+
102+
>![](http://upload-images.jianshu.io/upload_images/5522220-b4ed8fb72b2d9ab9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
103+
104+
>## 处理金融数据
105+
* Pandas内置函数DataReader从以下网站检索数据:  - Yahoo! Finance (Yahoo)  - Google Finance (Google)  - St. Louis FED (Fred)  - Kenneth French’s data library (Famafrench)  - World Band (via pandas.io.wb)* 要使用DataReader函数,我们需要```python    import pandas.io.data as web```
106+
107+
108+
--->## 富时100数据(FTSE 100 data)
109+
```pythonimport pandas as pdimport pandas.io.data as web
110+
FT = web.DataReader(name = ’^FTSE’, \data_source = ’yahoo’, \start = ’2000-1-1’)print(FT.info()) # show informationprint(FT.tail()) # show last 5 rows# plot the FTSE 100 graphFT[’Close’].plot(figsize = (8, 6), \grid = True)```
111+
---
112+
113+
>![](http://upload-images.jianshu.io/upload_images/5522220-886d2aff04c07418.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
114+
115+
116+
---
117+
>## 计算每日回报 (Calculate the daily return)
118+
```pythonimport pandas as pdimport pandas.io.data as webimport numpy as np
119+
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)```
120+
121+
---
122+
123+
![](http://upload-images.jianshu.io/upload_images/5522220-186cb8f9915fd219.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
124+
125+
126+
127+
> ##显示数据并同时返回(Show data and return simultaneously)
128+
```pythonimport pandas as pdimport pandas.io.data as webimport numpy as npFT = 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)```---
129+
130+
![](http://upload-images.jianshu.io/upload_images/5522220-7e472fc3c6708456.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
131+
132+
>## 算术交易:移动平均(Algorithmic trading: Moving average)
133+
```pythonimport pandas as pdimport pandas.io.data as webimport numpy as np
134+
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)```
135+
---
136+
![](http://upload-images.jianshu.io/upload_images/5522220-a94931276cb586bf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
137+
>## 波动率:年化日志回报标准差?(Volatility: Annualised log return StD)
138+
```pythonimport pandas as pdimport pandas.io.data as webimport numpy as np
139+
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)```
140+
![](http://upload-images.jianshu.io/upload_images/5522220-9fda18ebbd854888.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
141+
142+
>## 相关和线性回归
143+
- 我们实现一个符合以下目标的代码
144+
  - 捕获富时100指数和英国石油BP(伦敦)的历史价格。
145+
  - 评估这两种资产的历史回报。
146+
  - 对两个回报做线性回归,并获得其回归函数。
147+
(代码在datacorr.py里)
148+
---
149+
![](http://upload-images.jianshu.io/upload_images/5522220-3a1364af62324367.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
150+
151+
> ##应用实例:配对交易 (pair trading)
152+
![](http://upload-images.jianshu.io/upload_images/5522220-2bcde7453a841382.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
153+
图:左:从2011-01-01开始,壳牌(B)和BP(伦敦)的历史股价。 右:壳牌和BP的相对性能。
154+
>## 自学Pandas
155+
- Pandas的官方文件可以在这里找到:http://pandas.pydata.org/pandas-docs/stable/
156+
- 官方文档为初学者提供了详细的结构化材料。
157+
- 与其他软件包类似,只要遇到错误,请检查第一个错误消息。 如果您无法解决问题,请先尝试Google。 大量的人在互联网上问同样的问题。
158+
159+
```pyhon
160+
```
161+
>## 02随机与蒙特卡罗>>![](http://upload-images.jianshu.io/upload_images/5522220-11077c8e043523f4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
162+
163+
--->## 用Python产生随机数
164+
- 随机数可以通过numpy.random生成。
165+
```pythonimport numpy.random as nprimport matplotlib.pyplot as pltimport numpy as np
166+
X = npr.standard_normal((5000))Y = npr.normal(1, 1, (5000))Z = npr.uniform(-3, 3, (5000))W = npr.lognormal(0, 1, (5000))```
167+
---- 我们可以绘制直方图来检查分布。
168+
![](http://upload-images.jianshu.io/upload_images/5522220-821b5e6992ea246b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
169+
![Uploading FThist_677874.png . . .]- 图:在前一张幻灯片中生成的随机数的直方图。
170+
>## 蒙特卡洛- 蒙特卡罗是摩纳哥的一个地区和赌场......
171+
![](http://upload-images.jianshu.io/upload_images/5522220-9bafbb380d222801.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
172+
---
173+
> ###蒙特卡罗方法
174+
 - 第一次人们开始研究蒙特卡罗方法是要评估π。
175+
 - 通过概率论,蒙特卡罗可以用作数值积分法。 例如,
176+
    ![](http://upload-images.jianshu.io/upload_images/5522220-285aa7b6be2ca0a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
177+
 -  其中p(x)是U(0;1)的概率密度函数。
178+
 - 实践中,蒙特卡罗广泛应用于统计力学,量子物理学,金融衍生产品定价和风险管理。
179+
180+
> ##一个MC示例:期权定价
181+
- 蒙特卡洛通常用于评估期权价格。
182+
 - 我们不会涉及任何理论推论。 对于欧式看涨期权,其价格可以通过公式给出   
183+
![](http://upload-images.jianshu.io/upload_images/5522220-cf0fb5c452e0c95c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
184+
  -  其中S为当前基本股票价格,σ为股票波动率,r为利率,T为期权期权,K为行使价,Φ为标准正态随机变量。
185+
 - 对于这个例子。 让我们假设S = 100,K = 100,   σ= 50%,T = 1,r = 0.05。
186+
187+
>## 通过Python实现MC (MC by Python)
188+
```pythonimport numpy as npimport numpy.random as nprfrom scipy.stats import norm
189+
S = 100; K = 100; T = 1r = 0.05; vol = 0.5I = 10000 # MC pathsZ = 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)
190+
```
191+
> ## 蒙特卡罗路径图
192+
193+
![](http://upload-images.jianshu.io/upload_images/5522220-dab58ad5678a2e28.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
194+
图:一幅蒙特卡罗模拟股票的图。
195+
196+
197+
> ## MC的准确度如何?
198+
 - 您运行的所有MC都应同时输出方差或标准偏差。 对于最后一张幻灯片中的代码,我们有结果
199+
   - V ≈ 21.54 , std ≈ 0.40
200+
201+
- 实际上,我们有一个封闭式的欧式看涨期权方案
202+
>![](http://upload-images.jianshu.io/upload_images/5522220-a09b071d25940f90.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![](http://upload-images.jianshu.io/upload_images/5522220-544d5ffb239e306f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![](http://upload-images.jianshu.io/upload_images/5522220-52c2a0686d226ed0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)(看到公式不要慌,先冷静哈!慢慢来。)
203+
204+
>## 03统计应用 (Statistical application)
205+
206+
>## 直方图 (Histogram plot)
207+
```python
208+
import pandas as pdimport pandas.io.data as webimport numpy as np
209+
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))```
210+
![](http://upload-images.jianshu.io/upload_images/5522220-14165cfe91012067.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
211+
---
212+
213+
>## 正态检验:QQ图
214+
 - 我们通常使用分位数分布图(QQ图)来验证该分布是否正常。
215+
 - 为了实现QQ图,我们需要一个名为statsmodels的库。 我们导入相应的库
216+
    -  import statsmodel.api as sm
217+
 - statsmodels 是一个非常有用的统计分析库,但我们不会给出太多的介绍。
218+
 - 另一个有用的库被称为scikit-learning,它是一个统计和机器学习库。
219+
---
220+
221+
>## QQ-plot
222+
```pythonimport pandas as pdimport pandas.io.data as webimport numpy as npimport statsmodels.api as smimport matplotlib.pyplot as plt
223+
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’)```
224+
>## QQ-plot>![](http://upload-images.jianshu.io/upload_images/5522220-0bca0cfa38910caa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
225+
---
226+
>## Skew and kurtosis (斜度与峰值?)
227+
```python
228+
import pandas.io.data as webimport numpy as npimport scipy.stats as scs
229+
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
230+
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])```
231+
- 较小的p值意味着否决数据是正态分布的假设。
232+
---
233+
>## 04 实验部分 (Lab session)
234+
---
235+
>##目标1:蒙特卡罗模拟
236+
 - 我有一个随机过程
237+
    - ![](http://upload-images.jianshu.io/upload_images/5522220-6d6ca64be2dc1e5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
238+
- 其中Φ〜N(0,1)(标准正态分布),t是自变量,表示时间(x轴),参数为
239+
  - x0 = 1,θ  = 1, μ = 1, σ = 0.5
240+
- 尝试为 t = 10 生成10000个Monte Carlo路径。然后评估您的MC路径的平均值,用解析平均(analytical mean)进行检查  - ![](http://upload-images.jianshu.io/upload_images/5522220-226b8162b13158a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
241+
---
242+
243+
>## 目标2:P&L分析
244+
- 去雅虎网站,试图用Pandas获取以下股票调整后的收盘价
245+
```python['RDSB.L''BP.L''AAPL''MSFT']```
246+
 -  然后绘制股票价格。
247+
 - 让我们假设两个静态交易策略:   - 原油策略:买1'RDSB.L',卖5'BP.L'   - 科技策略:买3'AAPL', 卖4'MSFT'
248+
- 尝试获得两个Pandas series,存储的价值两个不同策略的组合。(Try to obtain two pandas series, which stored the value two portfolios of di erent strategies.)
249+
250+
- 尝试评估两种策略的每日损益(P&L)。 每日P&L由以下公式定义:
251+
![](http://upload-images.jianshu.io/upload_images/5522220-a988effdd1283799.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
252+
- 分析两个投资组合的日常损益,分别采用不同的正态检验。 绘制直方图和QQ图。
253+
254+
255+
>##三天全部结束,辛苦了!想必你也获得了不少收获!继续加油,让我们做的更好!
256+
![](http://upload-images.jianshu.io/upload_images/5522220-331d4b1bc8135d55.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
257+

0 commit comments

Comments
 (0)