提示:文章内买卖点不构成交易依据,请根据情况自行决策。
快速绘制一张属于自己的量化交易图,是研判指标和交易策略的有效工具。下图是个人将MT5的鳄鱼指标移植到python代码里,并通过绘图函数进行了绘制。其中红色箭头为买入标志,绿色箭头为卖出标志。当然如果要进行实盘,还需要再增加条件进行细化。这里只是抛砖引玉,故有兴趣的朋友可自行实践,也欢迎在评论区留言交流。
提示:以下是本篇文章正文内容,下面案例仅供参考
有人说,交易软件这么发达,也可以自己写指标,还要用Python自己写代码,是不是疯了。多此一举!
事实是,要对量化策略买卖点进行研判,以修改和再评估,绘图这种直观的方式必不可少。有多少人,只能在策略的黑匣子里琢磨,改来改去却又不知道为何修改,怎么修改?于是越改越晕…
下面咱们就来尝试自己撸代码,搞个私人定制的绘图工具。
安装matplotlib,mplfinance模块
pip install matplotlib
pip install mplfinance
为了方便,这里我们使用 Ashare包,小巧方便,只一个文件。下载Ashare.py并将其也和测试代码放在同一目录即可。
计算指标,先得有数据,采集数据可考文章《一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)》
https://blog.csdn.net/popboy29/article/details/125815775
访问https://github.com/mpquant/MyTT,下载MyTT文件放到运行Python的目录即可,下面会用到,需要提前准备好。了解更多指标计算可参考下文:
【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)_IT里的交易员的博客-CSDN博客_python股票指标计算库
https://blog.csdn.net/popboy29/article/details/125826838
下面是分段解释,熟悉的朋友可以跳过,看不懂完整代码的再回过来看也不迟。由于这里需要引用的东西比较多,所以还是逐个给大家解释下,免得后面晕菜。
将6为数字代码,如“600000”转化为“sh.600000”,方便Ashare调用。
def code2symbol(code,kind="sh.code"):
'''根据code代码开头数字转为为标准的symbol'''
if len(code) == 6 and kind == "sh.code":
if code[0] == "6" or code[0] == "9": #上证股票
return "sh"+code
if code[0] == "0" or code[0] == "3" or code[0] == "2": #深证股票
return "sz"+code
if code[0] == "4" or code[0] == "8": #北证股票
return "bj"+code
很多人使用print输出pandas的dataframe,打印中少行少列,数据还对不齐,确实对数据分析不方便,这里咱们增加一个小工具(也是我博客的常见菜),需要对代码稍稍加工下,整段函数复制即可。
为了方便数据展示,需要调用prettytable包,请测试前提前安装,以免报错。安装语句如下:
pip install -U prettytable
格式化输出函数代码如下:
def df_table(df,index):
import prettytable as pt
#利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
tb = pt.PrettyTable()
df = df.reset_index(drop = True)
tb.add_column(index,df.index)
for col in df.columns.values:#df.columns.values的意思是获取列的名称
tb.add_column(col, df[col])
print(tb)
MT5是啥?问度娘。
鳄鱼指标?鳄鱼指标有蓝、红、绿三条。蓝线,是鳄鱼的颚。红线,是鳄鱼的牙齿。绿线,是鳄鱼的上唇。基本上,无论实时价格往任何方向移动,鳄鱼线扮演着使我们的交易保持正当方向的罗盘角色。
def Alligator(CLOSE, HIGH, LOW, FAST=5, MID=8, SLOW=13):
''' 鳄鱼指标 '''
MP = (HIGH + LOW)/2 # 中间价
# MP = (CLOSE + HIGH + LOW)/3 # 中间价
LIPS = SMA(MP,FAST) #鳄鱼的嘴唇
TEETH = SMA(MP,MID) #鳄鱼的牙齿
JAW = SMA(MP,SLOW) #鳄鱼的下巴
return LIPS,TEETH,JAW
顾比均线又叫顾比移动复合平均线,由澳大利亚的投资家戴若-顾比先生发明。顾比均线由短期线束:3、5、8、10、12、15均线,和 长期线束:30、35、40、45、50、60组成。用短期线束和长期线束来判断短长线的趋势,很好的过滤了单一的均线产生的骗线的问题。
def Guby(CLOSE, SHORT_MA = [3,5,8,10,12,15], LONG_MA = [30,35,40,45,50,60] ):
'''顾比均线'''
# 短期线束
SHORT0 = EMA(CLOSE,SHORT_MA[0]);
SHORT1 = EMA(CLOSE,SHORT_MA[1]);
SHORT2 = EMA(CLOSE,SHORT_MA[2]);
SHORT3 = EMA(CLOSE,SHORT_MA[3]);
SHORT4 = EMA(CLOSE,SHORT_MA[4]);
SHORT5 = EMA(CLOSE,SHORT_MA[5]);
# 长期线束
LONG0 = EMA(CLOSE,LONG_MA[0]);
LONG1 = EMA(CLOSE,LONG_MA[1]);
LONG2 = EMA(CLOSE,LONG_MA[2]);
LONG3 = EMA(CLOSE,LONG_MA[3]);
LONG4 = EMA(CLOSE,LONG_MA[4]);
LONG5 = EMA(CLOSE,LONG_MA[5]);
return SHORT0,SHORT1,SHORT2,SHORT3,SHORT4,SHORT5,LONG0,LONG1,LONG2,LONG3,LONG4,LONG5
这里以鳄鱼指标进行演示,顾比均线大家有兴趣自己修改玩。有问题可在评论区留言。
传入参数df为dataframe格式数据,必须包含open,high,low,close,volume,需要在主图添加指标的,将指标也作为一列即可。如鳄鱼指标的’LIPS’,‘TEETH’,‘JAW’。
这里对每一行进行了注释,就是方便大家修改代码,实现自己的需要。不过代码坑比较多,建议直接使用。笔者在这里折腾的时间比做指标还要长几倍!
def draw_kline(df):
# 调用make_marketcolors函数,定义K线颜色,'i'表示根据K线颜色
mc = mpf.make_marketcolors(
up="red", # 上涨K线的颜色
down="green", # 下跌K线的颜色
edge='i', # 蜡烛图箱体的颜色,'i'表示跟随K线颜色
volume='i', # 成交量柱子的颜色,'i'表示跟随K线颜色
wick='i', # 蜡烛图影线的颜色,'i'表示跟随K线颜色
)
# 调用make_mpf_style函数,自定义图表样式 ,函数返回一个字典,查看字典包含的数据,按照需求和规范调整参数
style = mpf.make_mpf_style(base_mpl_style="ggplot", marketcolors=mc,rc={'font.family': 'SimHei', 'axes.unicode_minus': 'False'})
# 添加单个指标示例
# add_plot=[
# mpf.make_addplot(df.LIPS),
# mpf.make_addplot(df.TEETH),
# mpf.make_addplot(df.JAW)]
# 鳄鱼指标(后两行为多空标记)
add_plot=[
mpf.make_addplot(df[['LIPS','TEETH','JAW']]),
mpf.make_addplot(df['duo'].values, scatter=True, markersize=20, marker='^', color='r'),
mpf.make_addplot(df['kong'].values, scatter=True, markersize=20, marker='v', color='g'),
]
# # 顾比均线
# add_plot=[mpf.make_addplot(df[['SHORT0','SHORT1','SHORT2','SHORT3','SHORT4','SHORT5','LONG0','LONG1','LONG2','LONG3','LONG4','LONG5']])]
# 开始绘图
mpf.plot(data=df,
type="candle",
title="K线图",
addplot=add_plot,
ylabel="价格",
style=style,
volume=True,
figratio=(20,14),
figscale=1)
绘制带有鳄鱼指标及多空方向K线图(下方是成交量)完整代码。具体多空点没有进行细化研究,故不要作为买卖依据,实盘请再细化。
import time
from Ashare import *
# 加载指标计算库
from MyTT import *
import matplotlib.pyplot as plt
import mplfinance as mpf
# ===============表格美化输出===============
def df_table(df,index):
import prettytable as pt
#利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
tb = pt.PrettyTable()
df = df.reset_index(drop = True)
tb.add_column(index,df.index)
for col in df.columns.values:#df.columns.values的意思是获取列的名称
tb.add_column(col, df[col])
print(tb)
def code2symbol(code,kind="sh.code"):
'''根据code代码开头数字转为为标准的symbol'''
if len(code) == 6 and kind == "sh.code":
if code[0] == "6" or code[0] == "9": #上证股票
return "sh."+code
if code[0] == "0" or code[0] == "3" or code[0] == "2": #深证股票
return "sz"+code
if code[0] == "4" or code[0] == "8": #北证股票
return "bj"+code
def Alligator(CLOSE, HIGH, LOW, FAST=5, MID=8, SLOW=13):
''' 鳄鱼指标 '''
MP = (HIGH + LOW)/2 # 中间价
# MP = (CLOSE + HIGH + LOW)/3 # 中间价
LIPS = SMA(MP,FAST) #鳄鱼的嘴唇
TEETH = SMA(MP,MID) #鳄鱼的牙齿
JAW = SMA(MP,SLOW) #鳄鱼的下巴
return LIPS,TEETH,JAW
def Guby(CLOSE, SHORT_MA = [3,5,8,10,12,15], LONG_MA = [30,35,40,45,50,60] ):
'''顾比均线'''
# 短期线束
SHORT0 = EMA(CLOSE,SHORT_MA[0]);
SHORT1 = EMA(CLOSE,SHORT_MA[1]);
SHORT2 = EMA(CLOSE,SHORT_MA[2]);
SHORT3 = EMA(CLOSE,SHORT_MA[3]);
SHORT4 = EMA(CLOSE,SHORT_MA[4]);
SHORT5 = EMA(CLOSE,SHORT_MA[5]);
# 长期线束
LONG0 = EMA(CLOSE,LONG_MA[0]);
LONG1 = EMA(CLOSE,LONG_MA[1]);
LONG2 = EMA(CLOSE,LONG_MA[2]);
LONG3 = EMA(CLOSE,LONG_MA[3]);
LONG4 = EMA(CLOSE,LONG_MA[4]);
LONG5 = EMA(CLOSE,LONG_MA[5]);
return SHORT0,SHORT1,SHORT2,SHORT3,SHORT4,SHORT5,LONG0,LONG1,LONG2,LONG3,LONG4,LONG5
def draw_kline(df):
# 调用make_marketcolors函数,定义K线颜色,'i'表示根据K线颜色
mc = mpf.make_marketcolors(
up="red", # 上涨K线的颜色
down="green", # 下跌K线的颜色
edge='i', # 蜡烛图箱体的颜色
volume='i', # 成交量柱子的颜色
wick='i', # 蜡烛图影线的颜色
)
# 调用make_mpf_style函数,自定义图表样式 ,函数返回一个字典,查看字典包含的数据,按照需求和规范调整参数
style = mpf.make_mpf_style(base_mpl_style="ggplot", marketcolors=mc,rc={'font.family': 'SimHei', 'axes.unicode_minus': 'False'})
# 添加单个指标示例
# add_plot=[
# mpf.make_addplot(df.LIPS),
# mpf.make_addplot(df.TEETH),
# mpf.make_addplot(df.JAW)]
# 鳄鱼指标(后两行为多空标记)
add_plot=[
mpf.make_addplot(df[['LIPS','TEETH','JAW']]),
mpf.make_addplot(df['duo'].values, scatter=True, markersize=20, marker='^', color='r'),
mpf.make_addplot(df['kong'].values, scatter=True, markersize=20, marker='v', color='g'),
]
# # 顾比均线
# add_plot=[mpf.make_addplot(df[['SHORT0','SHORT1','SHORT2','SHORT3','SHORT4','SHORT5','LONG0','LONG1','LONG2','LONG3','LONG4','LONG5']])]
# 开始绘图
mpf.plot(data=df,
type="candle",
title="K线图",
addplot=add_plot,
ylabel="价格",
style=style,
volume=True,
figratio=(20,14),
figscale=1)
if __name__ == "__main__":
# 1.过Ashare获取数据
print('开始提取K线数据')
name = code = '300450'
period = '1d'
from Ashare import *
df = get_price(code2symbol(code),frequency=period,count=500) #frequency='1d' 表是获取日K,count=1000,表示获取1000根K线
# print('Ashare行情获取\n',df)
# df_table(df.tail(20),'df')
# 2. 测试计时开始,测试哪个就把if 后面的0改为1即可,其它改成0。
time1 = time.time()
print('开始计算指标')
if 0:
# 计算顾比均线
df['SHORT0'],df['SHORT1'],df['SHORT2'],df['SHORT3'],df['SHORT4'],df['SHORT5'],df['LONG0'],df['LONG1'],df['LONG2'],df['LONG3'],df['LONG4'],df['LONG5'] = Guby(df['close'])
df_table(df.tail(5),'df')
if 1:
# 计算鳄鱼指标
df['LIPS'],df['TEETH'],df['JAW'] = Alligator(df['close'], df['high'], df['low'], FAST=5, MID=8, SLOW=13)
df_table(df.tail(5),'df')
if 1:
df['duo'] = CROSS(df['LIPS'].values,df['JAW'].values)
df['kong'] = CROSS(df['JAW'].values,df['LIPS'].values)
df['duo']= df['duo'].apply(lambda x: 1 if x==True else None)
df['kong'] = df['kong'].apply(lambda x: -1 if x==True else None)
df_table(df.tail(20),'df')
draw_kline(df.tail(120))
time2 = time.time()
print("计算指标并绘图耗时:",time2-time1,'秒')
写到这里已是深夜2点。不知道为什么,写文章,深夜效率很高,不过这么熬夜,也确实对身体不好。今天先写到这里。代码均调测无误,拿来就可以用。创作不易,欢迎评论收藏!
明天还有很多工作,抓紧睡觉去。