量化投资常用技能——绘图篇3

  • 前言
  • 黄金分割线
    • 视觉上的0.382和视觉上的0.618
    • 统计上的0.382和统计上的0.618
    • 划定黄金分割线分割的范围
    • 绘制黄金分割线
  • 欢迎大家关注我们
    • 我们的抖音号:金融观察(JRGC8888)

前言

之前的文章已经介绍了如何绘制收盘价折线图、烛状图、基于收盘价绘制移动平均线,接下来介绍如何绘制黄金分割线

大家可以关注我们的抖音号:“金融观察”(JRGC8888)了解更多

黄金分割线

黄金分割线也就是我们熟知的 0.382,0.618 分割线

视觉上的0.382和视觉上的0.618

计算方法如下:

sp382 = (max - min) * 0.382 + min
sp618 = (max - min) * 0.618 + min

统计上的0.382和统计上的0.618

我们需要使用scipy库下的stats类的scoreatpercentile()方法,使用pip即可安装scipy
pip install scipy

使用方法如下

  • stats.scoreatpercentile(arr, per)
    • arr为输入的数据,可以为列表或者DataFrame
    • per需要得到的百分比,参与计算的值为per/100,故0.628应该输入per=62.8
sp382_stats = stats.scoreatpercentile(data, 38.2)
sp618_stats = stats.scoreatpercentile(data, 61.8)

划定黄金分割线分割的范围

黄金分割线划定的范围是两条0.382分割线和两条0.618之间的范围,因此我们采用下面函数计算范围

above618 = np.maximum(sp618, sp618_stats)  # 从视觉0.618和统计0.618中筛选更大的值
below618 = np.minimum(sp618, sp618_stats)  # 从视觉0.618和统计0.618中筛选更小的值
above382 = np.maximum(sp382, sp382_stats)  # 从视觉0.382和统计0.382中筛选更大的值
below382 = np.minimum(sp382, sp382_stats)  # 从视觉0.382和统计0.382中筛选更小的值

绘制黄金分割线

我们使用的数据为通过abupy库导入的tsla的历史数据,结合之前介绍的绘制烛状图的方法,绘制黄金分割线代码如下

import abupy
import numpy as np
import matplotlib.pyplot as plt
import mpl_finance as mpf
from scipy import stats
from matplotlib.dates import date2num
from abupy import ABuSymbolPd, pd_rolling_mean, nd

# ———————————————————— #
# ———— 默认参数设置 ———— #
# ———————————————————— #
__colorup__ = "red"
__colordown__ = "green"

abupy.env.enable_example_env_ipython()  # 使用沙盒数据,目的是和书中一样的数据环境,不使用会报错

tsla_df = ABuSymbolPd.make_kl_df('usTSLA', n_folds=2)  # 固定导入tsla的行情数据
tsla_df = tsla_df[:50]  # 选取前50个,数据过多不易观察

print(tsla_df[:10])

# ———————————————————— #


def plot_ochl(data_df=tsla_df, axs=None, show=False):
    ''' 绘制烛状图 :param data_df: 输入的数据,默认采用tsla的历史行情数据,输入的数据类型目前只支持DataFrame类型 :param axs: 是否在子图上绘制 :param show: 是否显示图像 :return: '''

    drawer = plt if axs is None else axs
    fig, ax = drawer.subplots(figsize=(14, 7))

    qutotes = []

    for index, (d, o, c, h, l) in enumerate(
            zip(data_df.index, data_df.open, data_df.close,
                data_df.high, data_df.low)):
        d = date2num(d)  # 蜡烛图的日期要使用matplotlib.finance.date2num进行转换为特有的数字值
        val = (d, o, c, h, l)  # 日期,开盘,收盘,最高,最低组成tuple对象val
        qutotes.append(val)  # 加val加入qutotes

    # 使用mpf.candlestick_ochl进行蜡烛绘制,ochl代表:open,close,high,low
    mpf.candlestick_ochl(ax, qutotes, width=0.6, colorup=__colorup__, colordown=__colordown__)
    ax.autoscale_view()
    ax.xaxis_date()

    if show:
        plt.show()


def plot_goldline(data_df=tsla_df, axs=None, show=False):
    ''' 绘制黄金分割线 :param data_df: 输入的数据,默认采用tsla的历史行情数据,输入的数据类型目前只支持DataFrame类型 :param axs: 是否在子图上绘制 :param show: 是否显示图像 :return: '''
    cs_max = data_df.close.max()  # 收盘价格序列中的最大值
    cs_min = data_df.close.min()  # 收盘价格序列中的最小值

    # 视觉上的0.382和视觉上的0.618
    sp382 = (cs_max - cs_min) * 0.382 + cs_min
    sp618 = (cs_max - cs_min) * 0.618 + cs_min

    # 统计上的0.382和统计上的0.618
    sp382_stats = stats.scoreatpercentile(data_df.close, 38.2)
    sp618_stats = stats.scoreatpercentile(data_df.close, 61.8)

    above618 = np.maximum(sp618, sp618_stats)  # 从视觉0.618和统计0.618中筛选更大的值
    below618 = np.minimum(sp618, sp618_stats)  # 从视觉0.618和统计0.618中筛选更小的值
    above382 = np.maximum(sp382, sp382_stats)  # 从视觉0.382和统计0.382中筛选更大的值
    below382 = np.minimum(sp382, sp382_stats)  # 从视觉0.382和统计0.382中筛选更小的值

    plt.axhline(sp382, c='r')  # 水平线视觉0.382
    plt.axhline(sp382_stats, c='m')  # 水平线统计0.382
    plt.axhline(sp618, c='g')  # 水平线视觉0.618
    plt.axhline(sp618_stats, c='k')  # 水平线统计0.618

    plt.fill_between(data_df.index, above618, below618, alpha=0.5, color="r")  # 填充0.618 red
    plt.fill_between(data_df.index, above382, below382, alpha=0.5, color="g")  # 填充0.382 green
    plt.legend(['close', 'sp382', 'sp382_stats', 'sp618', 'sp618_stats'], loc='best')  # 根据绘制顺序标注名称

    if show:
        plt.show()


if __name__ == '__main__':
    plot_ochl()  # 绘制烛状图,会新建画布
    plot_goldline(show=True)  # 绘制黄金分割线

输出图像如下:

欢迎大家关注我们

我们的抖音号:金融观察(JRGC8888)

本文地址:https://blog.csdn.net/weixin_41782172/article/details/110421345