欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

量化投资常用技能——绘图篇:绘制黄金分割线

程序员文章站 2022-06-22 16:35:21
量化投资常用技能——绘图篇3前言黄金分割线视觉上的0.382和视觉上的0.618统计上的0.382和统计上的0.618划定黄金分割线分割的范围绘制黄金分割线欢迎大家关注我们我们的抖音号:金融观察(JRGC8888)前言之前的文章已经介绍了如何绘制收盘价折线图、烛状图、基于收盘价绘制移动平均线,接下来介绍如何绘制黄金分割线大家可以关注我们的抖音号:“金融观察”(JRGC8888)了解更多黄金分割线黄金分割线也就是我们熟知的 0.382,0.618 分割线视觉上的0.382和视觉上的0.618...


前言

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


大家可以关注我们的抖音号:“金融观察”(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