笔者金融小白一枚,有python编程基础,对金融的理解仅限于炒过一段时间股和投过的一些银行基金理财产品。在系统性地分析了自己的经济状况,交际圈,个性之后,选择了quant这条路。从现在开始记录自己的quant学习之路,能写多少算多少,不定期更新,有生之年系列。
笔者习惯拿起一本书看看目录,看看知识框架的全貌。选择了一本2017年出版的《零起点 Python大数据与量化交易》,作者何海群(字王)。全书共10章,以故事作为引子,介绍了量化交易的核心概念。先讲指标,框架,策略,再聊实战中的数据,案例,模块,系统架构,策略库与函数库。最后一章系统整合前面的内容,以及一些扩展。
先写写最近从这书里学到的。
1.1.1 案例1-1: 亿万富翁的“神奇公式”
假设有一位年轻人,每年定期存款1.4万元,享受平均5%的利率,如此持续40年,他可以积累的财富为:
1.4*(1+5%)^(40-1) = 169 (万元)
这个“神奇公式”就是所有量化分析的基础公式:复利计算公式,Excel版本的复利计算公式:
“=FV(rate, nper, pv, pmt, type)”
如果这位年轻人将每年应存的钱全部投资到股票或者房地产,并假设取得了年均20%的投资回报率,则40年后,他能积累多少财富?
1.4*(1+20%)^(40-1) = 10281 (万元)
在这个案例中涉及两种不同的策略:
保守投资测录:银行储蓄,5%的年收益
激进投资策略:股市投资,20%的年收益
两者回报相差61倍。做量化分析,任何算法模型短期收益的高低都无所谓,关键是要稳定。只要稳定了,使用复利公式,哪怕1%的增长也会呈几何裂变模式增长。
例程:k101.py,笔者稍作修改。
import numpy_financial as npy
# =======================
def sta001(k,nyear,xd):
d2=npy.fv(k,nyear,-xd,-xd);
d2=round(d2)
return d2
# =======================
d40=1.4*40 # 累计总投入
print("累计总投入: 40 x 1.4=",d40)
d=sta001(0.05,40-1,1.4);
print("01保守投资模式: %d, 投资回报率 %d 倍" % (d, round(d/d40)))
d2=sta001(0.20,40-1,1.4);
print("02激进投资模式: %d, 投资回报率 %d 倍" % (d2,round(d2/d40)))
dk=round(d2/d)
print("dk,两者差别(xx倍):",dk)
运行结果:

其中,
投资回报率=累计收益/累计投入=169/1.4*40=3
下面为以上k101.py例程加上图表,笔者稍作修改
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy_financial as npf
# =======================
mpl.style.use('seaborn-whitegrid');
def sta001(k,nyear,xd):
d2=npf.fv(k,nyear,-xd,-xd);
d2=round(d2)
return d2
# =======================
d40=1.4*40 # 累计总投入
print("累计总投入: 40 x 1.4=",d40)
d=sta001(0.05,40-1,1.4);
print("01保守投资模式: %d, 投资回报率 %d 倍" % (d, round(d/d40)))
d2=sta001(0.20,40-1,1.4);
print("02激进投资模式: %d, 投资回报率 %d 倍" % (d2,round(d2/d40)))
dx05=[sta001(0.05,x,1.4) for x in range(0,40)] #不同年利率对应的最终年总收益
dx10=[sta001(0.10,x,1.4) for x in range(0,40)]
dx15=[sta001(0.15,x,1.4) for x in range(0,40)]
dx20=[sta001(0.20,x,1.4) for x in range(0,40)]
#print(dx05)print(dx20)
df=pd.DataFrame(columns=['dx05','dx10','dx15','dx20']); # 制作图表,运用DataFrame这个数据结构
df['dx05']=dx05;df['dx10']=dx10; # 表头
df['dx15']=dx15;df['dx20']=dx20;
print("\n")
print(df.tail()) #打印最后5行
df.plot()
plt.show()
运行结果:


后面俩例程都是作者用大篇幅详细介绍如何用matplotlib中的style风格,colormap,可以看出作者(字王)还是对字库有一定的执念,笔者没这个执念,就跳过了。