之前的文章已经介绍了如何绘制收盘价折线图、烛状图、基于收盘价绘制移动平均线,接下来介绍如何绘制黄金分割线
大家可以关注我们的抖音号:“金融观察”(JRGC8888)了解更多
黄金分割线也就是我们熟知的 0.382,0.618 分割线
计算方法如下:
sp382 = (max - min) * 0.382 + min
sp618 = (max - min) * 0.618 + min
我们需要使用scipy库下的stats类的scoreatpercentile()方法,使用pip即可安装scipy
pip install scipy
使用方法如下
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) # 绘制黄金分割线