Python for Finance Chapter1~3

Python for Finance Chapter1~3

这本书介绍了Python在金融领域的基本应用,非常适合入门。为了保证学习效果,我决定好好记笔记。下面是这本书的下载链接,欢迎一起学习:
Python_for_Finance.pdf

Chapter1: Python的安装与介绍

Python是大小写敏感的

查看帮助文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
help()

👇结果
help> keywords
Here is a list of the Python keywords. Enter any keyword to get more help.
False def if raise
None del import return
True elif in try
and else is while
as except lambda with
assert finally nonlocal yield
break for not
class from or
continue global pass

在PyCharm中,选中某行代码然后Shift+Alt+E即可逐行运行代码。

查看和调用Python的版本

1
2
3
4
import sys
sys.version
👇结果
Out[2]: '3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]'

Chapter2: 把Python当成普通计算器使用

变量定义不需要事先声明

1
2
pv = 22
pv+2

##使用dir()查看已有的变量和函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
dir()
👇结果
Out[4]:
['In',
'Out',
'_',
'_2',
'_3',
'__',
'___',
'__builtin__',
'__builtins__',
'__doc__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_dh',
'_i',
'_i1',
'_i2',
'_i3',
'_i4',
'_ih',
'_ii',
'_iii',
'_oh',
'exit',
'get_ipython',
'pv',
'quit',
'sys']

删除一个变量

1
del pv

幂运算

1
2
3
2**3
👇结果
Out[6]: 8

真正的幂函数

1
2
3
pow(2, 3)
👇结果
Out[7]: 8

关于局部变量和全局变量的LEGB规则

更多内容参考这篇博客:
Python中的LEGB规则

Items meanings
L Local refers to names assigned in any way within a function (def) and not declared global in that function.
E Enclosing refers to enclosing function locals, such as names, in the local scope of any and all enclosing function (def).
G Global refers to names such as assigned at the top level of a module or declared as global variable within a function defined by def.
B Build-in refers to names pre-assigned in the build-in-modules, such as open, range, and SyntaxError.

用中文来说就是:

Items meanings
Local 可能是在一个函数或者类方法内部。
Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部。
Global 代表的是执行脚本自身的最高层次。
Built-in 是Python为自身保留的特殊名称。

pow()函数和**的区别

1
2
3
4
5
6
7
8
help(pow)
👇结果
Help on built-in function pow in module builtins:
pow(x, y, z=None, /)
Equivalent to x**y (with two arguments) or x**y % z (with three arguments)

Some types, such as ints, are able to use a more efficient algorithm when
invoked using the three argument form.

也就是说pow()函数里面可以使用三个参数,如果使用三个参数:
$$
pow(x, y, z) = mod(x^y, z)
$$

选择精确度

1
2
3
4
5
6
7
8
9
print(7/3)
payment = 7/3
payment1 = round(payment, 2)
print(payment)
print(payment1)
👇结果
2.3333333333333335
2.3333333333333335
2.33

不过需要注意的是,这里的round()函数会事实上改变精确度,因此需要谨慎使用。如果round()没有指定精确度,默认返回一个整数。

import mathvs. from math import *

使用第一种方式后,后面引用该包中的函数仍然需要加上前缀math.,而使用第二种方式之后不再需要。

判断一个变量的类型——type()

1
2
3
type(payment)
👇结果
Out[13]: float

使用下划线表示上一个表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
x = 1.56
y = 5.77
x+y
👇结果
Out[21]: 7.33

9+_
👇结果
Out[22]: 16.33

round(_, 1)
👇结果
Out[23]: 16.3

大写函数:upper()

1
2
3
4
x = 'This is a sentence'
x.upper()
👇结果
Out[24]: 'THIS IS A SENTENCE'

列示所有的字符串函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
dir('')
Out[25]:
👇结果
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__getnewargs__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__len__',
'__lt__',
'__mod__',
'__mul__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__rmod__',
'__rmul__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'capitalize',
'casefold',
'center',
'count',
'encode',
'endswith',
'expandtabs',
'find',
'format',
'format_map',
'index',
'isalnum',
'isalpha',
'isdecimal',
'isdigit',
'isidentifier',
'islower',
'isnumeric',
'isprintable',
'isspace',
'istitle',
'isupper',
'join',
'ljust',
'lower',
'lstrip',
'maketrans',
'partition',
'replace',
'rfind',
'rindex',
'rjust',
'rpartition',
'rsplit',
'rstrip',
'split',
'splitlines',
'startswith',
'strip',
'swapcase',
'title',
'translate',
'upper',
'zfill']

# 例如首字母大写函数的帮助文件
help(''.capitalize)
👇结果
Help on built-in function capitalize:
capitalize(...) method of builtins.str instance
S.capitalize() -> str

Return a capitalized version of S, i.e. make the first character
have upper case and the rest lower case.

元组——tuple

元组是一个常量,其中的数值不可修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
x = ('czx', 21)
len(x)
👇结果
Out[30]: 2
x[0]
👇结果
Out[31]: 'czx'
type(x[1])
👇结果
Out[32]: int
z = ()
type(z)
👇结果
Out[34]: tuple
y = (1, )
type(y)
👇结果
Out[36]: tuple
x = (1) ===>这个是作为int的
type(x)
👇结果
Out[38]: int

元组的格式化输出

1
2
3
x = ('czx', 21)
print('我的名字是 %s, 年龄 %d 岁。' % x)
我的名字是 czx, 年龄 21 岁。

把Python作为一个金融计算器来使用

首先需要编写一个含各种算式的脚本:
fin101.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
def pv_f(fv, r , n):
"""
现值函数。
:param fv: 终值
:param r: 贴现率
:param n: 期数
:return: 现值
"""
return fv/((1+r)**n)

def dir2(path = '/Users/mr.cheng/Desktop/Python_for_Finance'):
"""
列示某个路径上的所有文件:
:param path: 路径,默认为'/Users/mr.cheng/Desktop/Python_for_Finance'
:return: 指定路径上的所有文件名的一个列表
"""
from os import listdir
print(listdir(path))
return listdir(path)

def pv_perpetuity(c, r):
"""
计算永续现金流的现值
:param c: 每期现金流
:param r: 贴现率
:return: 现值
"""
return c/r

def pv_growing_perpetuity(c, r, g):
"""
计算增长现金流的现值。
:param c: 第一笔现金流
:param r: 贴现率
:param g: 年金每期增长率
:return: 增长现金流的现值
"""
if(r < g):
print("r < g !!!")
else:
return (c/(r - g))

def pv_annuity(c, r, n):
"""
计算普通年金(期初支付)的现值
:param c: 每期支付
:param r: 贴现率
:param n: 期数
:return: 年金现值
"""
return (c/r)(1-1/((1+r)**n))

def pv_annuity_due(c, r, n):
"""
计算应付年金(期末支付)现值
:param c: 每期支付
:param r: 贴现率
:param n: 期数
:return: 年金现值
"""
return (c/r)(1-1/((1+r)**n))(1+r)

def fv_annuity(c, r, n):
"""
计算普通年金终值
:param c: 每期支付
:param r: 贴现率
:param n: 期数
:return: 年金终值
"""
return (c/r)((1+r)**n - 1)

def fv_annuity_due(c, r, n):
"""
计算应付年金终值
:param c: 每期支付
:param r: 贴现率
:param n: 期数
:return: 年金终值
"""
return (c/r)((1+r)**n - 1)(1+r)

def pv_growing_annuity(c, n, r, g):
"""
计算增长型年金现值
:param c: 每期支付
:param r: 贴现率
:param n: 期数
:param g: 年金增长率
:return: 年金现值
"""
return (c/r)(1-((1+g)/(1+r))**n)

def fv_growing_annuity(c, n, r, g):
"""
计算增长型年金终值
:param c: 每期支付
:param r: 贴现率
:param n: 期数
:param g: 年金增长率
:return: 年金终值
"""
return (c/r)((1+r)**n - (1+g)**n)

def EAR(APR, m):
"""
年化百分率转换成有效年利率
:param APR: 年化百分率
:param m: 计息频率
:return: EAR
"""
return (1 + APR/m)**m - 1

def continuously_compounded_interest_rate(APR, m):
"""
APR => 连续负利率。
exp(R_c) = (1+APR/m)^m ==> R_c = ln[(1+APR/m)^m]
:param APR: 年化百分率
:param m: 计息频率
:return: 连续EAR
"""
from math import log
return log((1+APR/m)^m)

def npv_f(rate, cashflows):
"""
计算给定现金流的净现值
:param rate: 贴现率
:param cashflows: 现金流列表
:return: NPV
"""
total = 0.0
## 下面的这种用法非常重要:
for i, cashflow in enumerate(cashflows):
total += cashflow/(1+rate)**i
return total

def payback_period(cashflows):
"""
计算回收期
:param cashflows:
:return:
"""
total = 0
for i, cashflow in enumerate(cashflows):
total += cashflow
if (total < 0):
continue
else:
total_temp = 0.0
# 注意range()函数不包括右边界
for j in range(0, i):
total_temp += cashflows[j]
total_temp = abs(total_temp)
return i-1+total_temp/cashflows[i]

def IRR_f(cashflows, interations = 1000):
"""
计算内部收益率
:param cashflows: 现金流列表
:param interations: 迭代次数,默认为1000
:return:
"""
rate = 1.0
investment = cashflows[0]
for i in range(1, interations+1):
rate *= (1-npv_f(rate, cashflows)/investment)
return rate

def fin101():
"""
基本函数:
1. pv_f(fv, r , n)
2. dir2(path = '/Users/mr.cheng/Desktop/Python_for_Finance')
3. pv_perpetuity(c, r)
4. pv_growing_perpetuity(c, r, g)
5. pv_annuity(c, r, n)
6. pv_annuity_due(c, r, n)
7. fv_annuity(c, r, n)
8. fv_annuity_due(c, r, n)
9. pv_growing_annuity(c, n, r, g)
10. fv_growing_annuity(c, n, r, g)
11. EAR(APR, m)
12. continuously_compounded_interest_rate(APR, m)
13. npv_f(rate, cashflows)
14. payback_period(cashflows)
15. IRR_f(cashflows, interations = 1000)
查看帮助文件:
例如pv_f: >>> help(pv_f)
"""

上面的脚本中的回收期计算函数是我自己设计的!下面是这个脚本的使用方法:

1
2
from fin101 import *
help(fin101)

把我们的项目添加到系统路径中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
myFolder = '/Users/mr.cheng/Desktop/Python_for_Finance'
if myFolder not in sys.path:
sys.path.append(myFolder)
for path in sys.path:
print(path)
👇结果
/Applications/PyCharm.app/Contents/helpers/pydev
/Applications/PyCharm.app/Contents/helpers/pydev
/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/IPython/extensions
/Users/mr.cheng/Desktop/Python_for_Finance
# Python

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了607.9k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×