#[量化投资-学习笔记018]Python+TDengine从零开始搭建量化分析平台-正态分布与收益率

正态分布(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)

计算正态分布

直接使用 numpyscipy 中函数进行计算。

    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()

#[量化投资-学习笔记018]Python+TDengine从零开始搭建量化分析平台-正态分布与收益率_第1张图片

TIPs

有两个非常使用的包可以帮助规范代码: pycodestyleautopep8,前者会检查程序是否符合 PEP8 规范,
后者可以直接进行修改。

安装包

pip install pycodestyle
pip install autopep8

检查并修改程序

pycodestyle normal.py

autopep8 -in-place normal.py

#[量化投资-学习笔记018]Python+TDengine从零开始搭建量化分析平台-正态分布与收益率_第2张图片

非题外话

从上图可以明显的看出,正态曲线存在明显的偏离,这并不是坏现象。如果真是标准的正态分布图形,那就真的有问题了。

上图说明了使用 MACD 金死叉策略在所有的股票池中收益率众数和均值均在正数区间。

而且上证和创业板的表现均好于深证。

题外话

有个小段子:
几个人做电梯上楼,有人在电梯里做俯卧撑,有人在电梯里扇自己嘴巴,有人大瞌睡,有人在唱歌。

到了登楼,记者采访问这几个是怎么上楼的。

有人说靠自己不断的锻炼,有人说靠自虐,有人说靠躺平,有人说靠多才多艺。

大家都忽略了电梯。听起来很可笑,但实际情况确实如此。很多时候不错的收益率并不是因为出色的策略,还有可能是整个大盘都涨了。

你可能感兴趣的:(笔记,Python,TDengine,学习,笔记,python,AI编程,量化,tdengine)