正态分布(Normal Distribution)又叫高斯分布、常态分布。通常用来描述随机变量的概率分布。
自然界的数据分布通常是符合正态分布规律的,比如说人的身高、体重。但是非自然界数据就不一定了。尤其是经过人为加工过的数据。
金融领域大量使用正态分布来计算收益率和风险,虽然因为金融数据厚尾性而不断被人诟病,但是确实也没啥其他的统计方法。
在上一章节《MACD金死叉策略回测》,已经将回测的结果存入了数据库。本章节将对回测结果进行进一步分析。
目录
- 获取历史回测数据
- 计算正态分布
- 绘制图形
- 进阶
- TIPs
- 非题外话
- 题外话
获取历史回测数据
通过查询 TDengine 数据库,我们可以轻松的获取到历史回测数据。
数据结构请参考上一章节,本次不再赘述。
查询回测记录:
taos> select last(*) from records;
ts | record |
===========================================================
2023-11-12 19:17:39.339 | MACD-13_21 |
Query OK, 1 row(s) in set (0.001534s)
查询对应的回测记录
taos> select count(*) from btdata where ts='2023-11-12 19:17:39.339';
count(*) |
========================
9037 |
Query OK, 1 row(s) in set (0.010254s)
通过 Restful 查询获取数据
rt = request_post(url, sql, username, password)
ec = check_return(rt)
log_write.handler_control.setLevel('INFO')
if ec == 'error':
log_write.logger.error(rt)
else:
returns = request_get(rt)
# 计算正态分布
log_write.logger.debug(returns)
计算正态分布
直接使用 numpy
和 scipy
中函数进行计算。
mean = np.mean(returns)
log_write.logger.debug(f"均值:{mean}")
std = np.std(returns)
log_write.logger.debug(f"标准差: {std}")
x = np.linspace(min(returns), max(returns), 200)
y = norm.pdf(x, mean, std)
log_write.logger.debug(f"x={x}, y={y}")
return x, y
绘制图形
def plot_normal_distribution(x, y):
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
plt.plot(x, y)
plt.xlabel("Profit")
plt.ylabel("Probability density")
plt.title("收益率正态分布曲线")
plt.grid()
plt.show()
进阶
为了方便对比,我们可以将不同类型的股票的收益率正态分布曲线放到1个图形里面。
相关绘图功能接受见 Python知识点汇总
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
plt.plot(x1, y1)
plt.xlabel("Profit")
plt.ylabel("Probability density")
plt.title("上证")
plt.grid()
plt.subplot(3, 1, 2)
plt.plot(x2, y2)
plt.xlabel("Profit")
plt.ylabel("Probability density")
plt.title("深证")
plt.grid()
plt.subplot(3, 1, 3)
plt.plot(x3, y3)
plt.xlabel("Profit")
plt.ylabel("Probability density")
plt.title("创业")
plt.grid()
plt.tight_layout()
plt.show()
TIPs
有两个非常使用的包可以帮助规范代码: pycodestyle
和 autopep8
,前者会检查程序是否符合 PEP8 规范,
后者可以直接进行修改。
安装包
pip install pycodestyle
pip install autopep8
检查并修改程序
pycodestyle normal.py
autopep8 -in-place normal.py
非题外话
从上图可以明显的看出,正态曲线存在明显的偏离,这并不是坏现象。如果真是标准的正态分布图形,那就真的有问题了。
上图说明了使用 MACD 金死叉策略在所有的股票池中收益率众数和均值均在正数区间。
而且上证和创业板的表现均好于深证。
题外话
有个小段子:
几个人做电梯上楼,有人在电梯里做俯卧撑,有人在电梯里扇自己嘴巴,有人大瞌睡,有人在唱歌。
到了登楼,记者采访问这几个是怎么上楼的。
有人说靠自己不断的锻炼,有人说靠自虐,有人说靠躺平,有人说靠多才多艺。
大家都忽略了电梯。听起来很可笑,但实际情况确实如此。很多时候不错的收益率并不是因为出色的策略,还有可能是整个大盘都涨了。