量化投资常用技能——绘图篇:绘制黄金分割线
程序员文章站
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...
量化投资常用技能——绘图篇3
前言
之前的文章已经介绍了如何绘制收盘价折线图、烛状图、基于收盘价绘制移动平均线,接下来介绍如何绘制黄金分割线
大家可以关注我们的抖音号:“金融观察”(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
上一篇: 送领导两盒中华
下一篇: 幽默的二货同事和坑爹老板