文章目录
- 前言
- 一、k 线 图 是 什 么 ?
- 二、K 线 图 结 构
- (1) 影 线 和 实 体
- (2) 十 字 线
- 四、 双 均 线 策 略
- (一)、金叉
- (二)、死叉
- (三)、均 线 策 略 的 特 点
- 五、通 道 突 破 策 略
- (一)唐 奇 安 通 道 策 略
- (1)上阻力线、中心线、下支撑线
- (2)唐 奇 安 通 道 买 入 策 略
- (2)唐 奇 安 通 道 卖 出 策 略
- (二)、布 林 带 策 略
- (1) 压 力 线 、 价 格 平 均 线 、 支 撑 线
- (三)、布 林 带 策 略 与 唐 奇 安 通 道 策 略 的 关 系
- 三、绘 图 步 骤
- (1)导入相关模块
- (2)处理数据
- (3)绘制k线图
- (4)代码
- (5)效果呈现
- 1)蜡烛图
- 2)均线图
- 3)布 林 带 策 略 图
- 4)唐奇德策略图
- 4)数据图汇总
前言
`利用数据绘制K线图
一、k 线 图 是 什 么 ?
K线图又称蜡烛图,起源于十八世纪德川幕府时代的米市交易市场,用来计算米价每天的涨跌走势,由开盘价、收盘价、最高价、最低价绘制而成的一条柱状的线条,它由影线和实体组成,基本用途是寻找买卖点。
K线图由股票的最高价,最低价,收盘价,开盘价组成。红色代表阳线:收盘价高于开盘价,俗称看多。绿色代表阴线:收盘价低于开盘价,俗称看空。
注意⚠️:在欧美股市则是相反的,即红色代表阴线,绿色代表阳线。
二、K 线 图 结 构
(1) 影 线 和 实 体
(2) 十 字 线
⚠️:反映买卖双方的博弈
四、 双 均 线 策 略
双均线策略,就是同时考虑短周期和长周期的趋势,它由一个短周期趋势和长周期趋势构成。长周期均线 捕捉股票行情趋势,而短周期均线起到的是择时的作用。
在考虑长周期趋势的同时,兼顾比较敏感的小周期趋势,是解决简单移动平均线滞后性弱点的一项有效方法。
(一)、金叉
(二)、死叉
(三)、均 线 策 略 的 特 点
双均线策略虽然可以弥补一些滞后性,但均线策略都是基于:“利用固定长度的价格均线作为交易趋势的判断”
均线随着时间的变化是相对连续的,即使是价格发生猛涨或者急跌也很难直接造成均线方向的变化。因此使用均线侧率作为交易信号,会有滞后性。
五、通 道 突 破 策 略
通道策略就是选定价格区间,当价格突破选定价格区间时就进行交易,因此没有滞后性。
(一)唐 奇 安 通 道 策 略
唐奇安通道策略由三条线组成,分别是上阻力线、下支撑线、中心线。一般来说,唐奇安通道的宽度越宽,市场波动就越大,而唐奇安通道越窄,市场波动性就越小。
(1)上阻力线、中心线、下支撑线
⚠️ 上阻力线: 是由过去N天的最高价的最大值组成的
⚠️ 中心线: 是由过去最高价与最低价的平均值组成的,即(最大值**+**最小值)÷2
⚠️ 下支撑线: ** 是由过去N天的最低价的最小值组成的
(2)唐 奇 安 通 道 买 入 策 略
买入:当价格跌破下支撑线,则执行买入的操作
(2)唐 奇 安 通 道 卖 出 策 略
卖出:当价格突破上阻力线,则执行卖出的操作
(二)、布 林 带 策 略
布林带策略,也是由3条轨道线组成:其中上下两条线分别可以看成是价格的压力线和支撑线,在两条线之间是一条价格平均线,一般情况价格线在上下轨道组成的带状区间游走,而且随价格的变化而自动调整轨道的位置。布林带通道宽度有4个标准差,因此95%的价格都将包含在内,可以展示大部分价格的波动情况。
(1) 压 力 线 、 价 格 平 均 线 、 支 撑 线
⚠️ 压力线: 就是20日均线加上N倍标准差,N为可调参数,一般设置为2。【压力线 = ma20 + n * std】
⚠️ 价格平均线: 就是20日均线
⚠️ 支撑线: 20日均线减去N倍标准差,N为可调参数,一般设置为2。【压力线 = ma20 - n * std】
(三)、布 林 带 策 略 与 唐 奇 安 通 道 策 略 的 关 系
联系:
外观上两个策略的线图相似
.
区别:
布林带的波动比较灵敏
唐奇安通道则相对迟缓,直上直下。
三、绘 图 步 骤
(1)导入相关模块
代 码 如 下 :
# 数据分析辅助模块
import numpy as np
# 读取数据模块
import pandas as pd
# 绘图基本模块
import matplotlib.pyplot as plt
# 日期转换模块
from matplotlib.dates import date2num
# 绘制蜡烛图模块
from mplfinance import original_flavor as mpf
print('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
(2)处理数据
1)读取交易时间、开盘价、收盘价、最高价、最低价,并把交易时间设定位字符串
2)交易时间转换时间数据形式
2)设置时间戳:在数据时间中提取
3)设置特定蜡烛图绘图数据
4)设置移动平均线数据
5)设置金叉死叉位
6)回测金叉死叉策略收益
(3)绘制k线图
1)设置文字与符号识别
2)设置画布,添加子图,并把子图x轴设为时间轴
3)绘制K线图
4)绘制5,、10、20移动平均线
5)标记金叉死叉点位
(4)代码
代 码 如 下 :
# 数据分析辅助模块
import numpy as np
# 读取数据模块
import pandas as pd
# 绘图基本模块
import matplotlib.pyplot as plt
# 日期转换模块
from matplotlib.dates import date2num
# 绘制蜡烛图模块
from mplfinance import original_flavor as mpf
print('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<')
"""======================== 设置数据 ========================"""
# # 数据处理
# 读取特定数据数据,设定交易时间为字符数按
path = r'F:\\601398.SH.xlsx'
data = pd.read_excel(path,usecols=['trade_date','open','close','high','low'],dtype={'trade_date':object})
# 数据时间处理
data['trade_date'] = pd.to_datetime(data['trade_date'])
# 设置时间戳:在数据时间中提取
data['time'] = date2num(data['trade_date'])
# 数据排序整理
data.sort_values(by = 'trade_date',ascending = True,inplace=True )
# 重置行索引
data.reset_index(inplace = True)
# 删除旧行索引
data.drop(columns = 'index',inplace = True)# # 设置蜡烛图数据
# 提取时间戳、开盘价、收盘价、最高价、最低价数据
k = data[['time','open','close','high','low']].values# # 设置移动平均线数据
# 设置5日移动平均线
data['ma5'] = data['close'].rolling(window = 5,min_periods = 5).mean()
# 设置10日移动平均线
data['ma10'] = data['close'].rolling(window = 10,min_periods = 10).mean()
# 设置20日移动平均线
data['ma20'] = data['close'].rolling(window =20,min_periods = 20).mean()
# 设置30日移动平均线
data['ma30'] = data['close'].rolling(window = 30,min_periods = 30).mean()# # 设置布林带压力线、布林带支撑线
# 设置20日收盘价标准差
data['std'] = data['close'].rolling(window = 20,min_periods = 1).std()
# 设置布林带压力线
data['up_B'] = data['ma20'] + 2 * data['std']
# 设置布林带支持线
data['down_B'] = data['ma20'] - 2 * data['std']# # 设置唐奇安通道阻力线、支撑线、中心线
# 设置唐奇安通道阻力线
data['up_T'] = data['high'].rolling(window = 15,min_periods = 15).max()
# 设置唐奇安通道中心线
data['median_T'] = (data['high'] + data['low'])/2
# 设置唐奇安通道支撑线线
data['down_T'] = data['low'].rolling(window = 15,min_periods = 15).min()"""======================== 策略买卖点 ========================"""
# # 金叉死叉(1)
# 设置买卖信号
# model = ma5['close'] > ma20['close']
# # 设置买点模块
# def get_buy_date(w):
# return w[0] == True and w[1] == False
# # 设置卖点模块
# def get_sale_date(v):
# return v[0] == False and v[1] == True
# # 标记买点
# se_buy = model.rolling(2).apply(get_buy_date).fillna(0)
# # 标记卖点
# se_sale = model.rolling(2).apply(get_sale_date).fillna(0)
# # 转变买点标记形式
# se_buy_bool = se_buy.astype(bool)
# # 转换卖点标记形式
# se_sale_bool = se_sale.astype(bool)
# # 筛选买点位置
# buy_price = df[se_buy_bool]
# # 筛选卖点位置
# sale_price = df[se_sale_bool]
# # # 利润计算
# # profit = sale_price.values - buy_price.values
# # print(profit)# # 金叉死叉(2)
# 设置金叉时间容器
golden_cross = []
# 设置死叉时间容器
death_cross =[]
# 筛选金叉死叉时间
for i in range(0,len(data)):# 设置金叉条件if (data['ma5'][i] >= data['ma30'][i]) and (data['ma5'][i-1] < data['ma30'][i-1]):golden_cross.append(data['trade_date'][i])# 设置死叉条件elif (data['ma5'][i] <= data['ma30'][i]) and (data['ma5'][i-1] > data['ma30'][i-1]):death_cross.append(data['trade_date'][i])else:continue
# 设置金叉信号
data['golden_cross'] = np.where((data['trade_date'].isin(golden_cross)),1,0)
# 设置死叉信号
data['death_cross'] = np.where((data['trade_date'].isin(death_cross)),-1,0)
# 合并金叉死叉信号
data['GD'] = data['golden_cross'] + data['death_cross']
# 设置金叉数据
golden_cross = data[data['golden_cross'] == 1]
# 设置死叉数据
death_cross = data[data['death_cross'] == -1]# # 布林带策略
# 设置布林带策略买入容器
B_buy_order = []
# 设置布林带策略卖出容器
B_sale_order =[]
# 遍历数据,筛选布林带策略买卖点
for i in range(0,len(data)):# 设置布林带策略买入时间if data['close'][i] < data['down_B'][i]:B_buy_order.append(data['trade_date'][i])# 设置布林带策略卖出时间elif data['close'][i] > data['up_B'][i]:B_sale_order.append(data['trade_date'][i])else:continue
# 标记布林带策略买入点位
data['B_buy_order'] = np.where((data['trade_date'].isin(B_buy_order)),1,0)
# 标记布林带策略卖出点位
data['B_sale_order'] = np.where((data['trade_date'].isin(B_sale_order)),-1,0)
# 合拼布林带策略买卖点位
data['B_order'] = data['B_buy_order'] + data['B_sale_order']
# 筛选布林代策略买卖信号数据
Bb = data[data['B_order'] != 0]
# 设置布林带策略买入数据
B_buy_order = Bb[Bb['B_buy_order'] == 1]
# 设置布林带策略卖出数据
B_sale_order = Bb[Bb['B_sale_order'] == -1]# # 唐奇德通道策略
# 设置唐奇德通道买入策略时间容器
T_buy_order = []
# 设置唐奇德通道卖出策略时间容器
T_sale_order = []
# 遍历数据,筛选奇德通道策略买卖点
for i in range(0,len(data)):# 设置奇德通道买入策略时间if data['close'][i] < data['down_T'][i]:T_buy_order.append(data['trade_date'][i])# 设置奇德通道卖出策略时间elif data['close'][i] > data['up_T'][i]:T_sale_order.append(data['trade_date'][i])else:continue
# 标记布林带策略买入点位
data['T_buy_order'] = np.where((data['trade_date'].isin(T_buy_order)),1,0)
# 标记布林带策略卖出点位
data['T_sale_order'] = np.where((data['trade_date'].isin(T_sale_order)),-1,0)
# 合拼布林带策略买卖点位
data['T_order'] = data['T_buy_order'] + data['T_sale_order']
# 筛选布林代策略买卖信号数据
Dc = data[data['T_order'] != 0]
# 设置布林带策略买入数据
T_buy_order = Dc[Dc['T_buy_order'] == 1]
# 设置布林带策略卖出数据
T_sale_order = Dc[Dc['B_sale_order'] == -1]"""======================== 策略画图 ========================"""data.set_index('time',inplace=True)# # 绘制k线图
# 设置汉语识别
plt.rcParams['font.sans-serif'] = ['SimHei']# 符号识别
plt.rcParams['axes.unicode_minus'] = False# 设置画布
fig = plt.figure()# 添加子图
ax = fig.add_subplot(111,facecolor='lightgrey')# 子图x轴设为时间轴
ax.xaxis_date()# 绘制蜡烛图
mpf.candlestick_ochl(ax,k,colorup = 'red', colordown = 'green')# 绘制5日移动平均线
plt.plot(data.index,data['ma5'],color = 'darkviolet',label='5日移动平均线')# 绘制10日移动平均线
plt.plot(data.index,data['ma10'],color = 'gold',label='10日移动平均线')# 绘制唐奇安通道阻力线
plt.plot(data.index,data['up_T'],color = 'mediumspringgreen',label = '唐奇安通道')# 绘制布林带压力线
plt.plot(data.index,data['up_B'],color = 'slategrey',label = '布林带通道【2倍】')# 绘制唐奇安通道中心线
plt.plot(data.index,data['median_T'],color = 'cadetblue',label = '唐奇安通道中位线')# 绘制20日移动平均线【布林带中线】
plt.plot(data.index,data['ma20'],color = 'orange',label='20日移动平均线【布林带中线】')# 绘制布林带支撑线
plt.plot(data.index,data['down_B'],color = 'slategrey',label = '布林带通道【2倍】' )# 绘制唐奇安通道支撑线
plt.plot(data.index,data['down_T'],color = 'mediumspringgreen',label = '唐奇安通道' )# 绘制30日移动平均线
plt.plot(data.index,data['ma30'],color = 'dodgerblue',label='30日移动平均线')# 绘制金叉点位
plt.scatter(golden_cross['time'],golden_cross['open'],color = 'yellow',label = '金叉点位')# 绘制死叉点位
plt.scatter(death_cross['time'],death_cross['open'],color = 'black',label = '死叉点位')# 绘制布林带策略买入点
plt.scatter(B_buy_order['time'],B_buy_order['open'],color = 'darkred',marker = '+',label = '布林带买入点')# 绘制布林带策略卖出点
plt.scatter(B_sale_order['time'],B_sale_order['open'],color = 'darkgreen',marker = 'x',label = '布林带卖出点')# 绘制唐奇德策略买入点
plt.scatter(T_buy_order['time'],T_buy_order['open'],color = 'orangered',marker = '+',label = '唐奇德买入点')# 绘制唐奇德策略卖出点
plt.scatter(T_sale_order['time'],T_sale_order['open'],color = 'lightgreen',marker = 'x',label = '唐奇德卖出点')# 设置抬头
plt.title('601398.SH(未复权)策略提醒行情图',fontsize = 25)
# 设置y轴标签
plt.ylabel('收盘价\n(元)\n\n\n\n\n\n\n\n\n\n\n',fontsize = 15,rotation = 0)
# plt.xticks(ma5.index)
plt.tight_layout()
plt.legend()
plt.show()
(5)效果呈现
1)蜡烛图
2)均线图
3)布 林 带 策 略 图
4)唐奇德策略图
⚠️ 主要用于日行情