欢迎大家订阅《教你用 Python 进阶量化交易》专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前已推出如下扩展篇:
在第一篇《管理概率==理性交易》中笔者结合一个简单的市场模型介绍了为什么在没有概率优势的前提下参与交易会亏钱,其实股票交易和玩一个游戏、做一个项目理念是相通的,需要章法、需要制定策略,否则就和抛硬币赌博一样一样的,用量化交易可以帮助我们管理好概率,更理性的去下单。
在第二篇《线性回归拟合股价沉浮》中笔者在专栏《股票交易策略开发:走势线性回归选股策略》小节的基础上对线性回归方法的策略应用做进一步的扩展介绍。由于线性回归作用于股票收盘价的整个周期,前后两段完全相反的周期会彼此作用,最终影响拟合的角度值,于是笔者设定窗口期用移动窗口的方式拟合股价的走势,寻找角度曲线的拐点以预示新一轮的反转走势,给大家提供一个衍生的策略思路。
在第三篇《最大回撤评价策略风险》中笔者在专栏《股票交易数据可视化:买卖区间下策略收益绘制》的基础上对策略的最大回撤指标做一定的扩展介绍。投资是有风险的,那么如何去衡量这个风险呢?最大回撤率就是一种直观的将风险切实量化的指标,它描述了买入股票后,在策略出现最糟糕的情况下会损失多少钱,这也直接关系到了风险策略中止损因子的设定。
在第四篇《寻找最优化策略参数》中笔者在专栏《股票交易策略开发:趋势突破择时策略》的基础上对寻找最优化策略参数的方法做一些扩展介绍。对于寻找最优化参数的方法可以选择枚举法或者蒙特卡洛法。枚举法适用于解决效率要求不高,样本规模小的问题。蒙特卡洛法得到的结果并不一定是最优的,但是在大规模样品的场合下可以更快地找到近似最优结果。
在第五篇《标记A股市场涨跌周期》中笔者在专栏《股票交易数据的自动下载》的基础上对matplotlib绘图工具的使用方法做一些扩展介绍,在A股历史走势图中标记出市场涨跌周期。
在第六篇《Tushare Pro接口介绍》中笔者在《股票交易数据的自动下载》的基础上扩展介绍使用Tushare Pro版本获取财经和股票交易数据的方法。
在第七篇《装饰器计算代码时间》中笔者在《用装饰器注册股票池》的基础上对装饰器的进行扩展介绍,通过装饰器方式实现timeit测试函数执行时间功能。
在第八篇《矢量化计算KDJ指标》中笔者在《技术分析常用指标绘制》的基础上对KDJ指标的计算进行扩展介绍,由之前for…in循环遍历方式升级为矢量化方式,并且用自制的@timeit装饰器对比两种方式的效率。
在第九篇《移植量化交易小工具》中笔者一步步介绍了如何在Python3.7版本上移植量化交易小工具
那么本次场外篇笔者结合专栏中Numpy、Matplotlib库的使用,用Python的方式来介绍下如何从统计学的角度去预测随机漫步的股价。
早在1990年,巴黎一位博士生路易斯·巴舍利耶(1887—1946)跟踪当时巴黎股市起伏,期望用数学工具来描述股价变动过程。在他的论文《投机理论》中指出,股票价格的日常变动从根本上说是不可预知的,类似于”布朗运动”那样属于随机游走,没有任何规律可循。就好比一个人购买一只股票后立即将其卖掉,那么他输赢的概率是相等的。
数学的奇妙之处就在于,我们可以把股票的不可预知性变为可预知。最经典的例子即是模拟醉汉的随机漫步:假设一名醉汉喝醉了酒,从一个路灯下开始漫无目的地行走。每一步即可能前进也可能后退也可能拐弯。那么经过一定时间之后,这名醉汉的位置在哪里呢?
我们使用numpy.random.randint(low, high=None, size=None, dtype=’l’)函数产生随机数。
- 返回随机整数,范围区间为[low,high),包含low,不包含high
- 参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int
- high没有填写时,默认生成随机数的范围是[0,low]
print("np.random.randint:\n {}".format(np.random.randint(1,size=5)))# 返回[0,1)之间的整数,所以只有0
"""
np.random.randint:
[0 0 0 0 0]
"""
print("np.random.randint:\n {}".format(np.random.randint(1,5)))# 返回1个[1,5)时间的随机整数
"""
np.random.randint:
2
"""
print("np.random.randint:\n {}".format(np.random.randint(-5,5,size=(2,2))))
"""
np.random.randint:
[[-5 -3]
[ 2 -3]]
"""
为了便于理解,我们将醉汉的移动简化为一维的移动,规定他只能在一条直线上随机前进或者后退。计算得到醉汉随机游走轨迹的代码如下所示:
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)
walk = steps.cumsum()
我们用matplotlib.pyplot.plot()函数绘制出醉汉从0轴开始随机游走2000步的模拟轨迹图形,如下所示:
由于醉汉的每一步都是完全随机的,因此他最终准确位置是不可能被算出来的,就像每天的股票价格变动一样是不可预知的。但是,从统计学的角度来看,这名醉汉最终的位置的概率分布却是可以计算出来的。接下来,我们用1000次随机漫步来看下结果,我们把随机漫步轨迹的计算封装为函数random_walk(),如下所示:
_ = [plt.plot(np.arange(2000), random_walk(nsteps=2000), c='b', alpha=0.05) for _ in np.arange(0,1000)]
模拟醉汉从0轴开始1000次随机游走2000步的模拟轨迹图形,如下所示:
图中我们直观地观察出随机游走的发展情况,每一条淡淡的蓝线就是一次模拟,横轴为行走的步数,纵轴表示离开起始点的位置。蓝色越深,就表示醉汉在对应行走了对应的步数之后,出现在此位置的概率越大,可见随着醉汉可能出现的位置的范围不断变大,但是距离起始点越远的位置概率越小。
真实的概率分布用数学公式来精确计算,这就是量化交易的精髓所在。量化交易的鼻祖级大神爱德华·索普就是利用这种随机游走模型的思想,推算出认股权证在合约兑现的那一天相对应的股票的价格的概率分布,从而计算出当前认股权证的价格是过高还是过低,然后再利用凯利公式,进行买卖。
关于完整代码可以加入专栏交流群获取。更多的量化交易内容欢迎大家订阅专栏阅读!!
热门评论
老师,随机漫步的画图代码有详细的吗