最近和朋友一直在研究 MACD
方面的策略,看到社区里很多人都在问分钟、周级别的MACD
如何写,这里我就直接把代码放出来,分享给各位有需求的朋友!今后,将会陆续推出其它指标的不同时段研究主题!
import pandas as pd
import numpy as np
import talib as tb
import datetime
import time
def get_macd(stock_list, check_date=None, unit='1d', include_now=False):
"""
MACD计算函数,返回一个嵌套字典,Key是股票代码,Value是一个字典,不包括当前时间段的值
stock_list:可以指定单只股票,也可以是股票列表
check_date: 获取MACD值的日期,注意未来数据值
unit:支持分钟 xm、天 xd、周 xw 时间段的数据
include_now: 是否包含当前时间段的bar
"""
macd_list = {}
if isinstance(check_date,str):
check_date = datetime.datetime.strptime(check_date, "%Y-%m-%d %H:%M:%S")
'''如果股票代码是个字符串而不是一个列表,进行转换'''
if isinstance(stock_list,str):
stock_list = [stock_list]
for stock in stock_list:
'''获取指定日期之前的300个收盘价信息'''
array = get_bars(security=stock,
count=500,
unit=unit,
fields=['close'],
include_now=include_now,
end_dt=check_date,
fq_ref_date=check_date)
close_list = array['close']
'''求出用300个数据推算出的dif/dea/macd集合'''
dif, dea, macd = tb.MACD(close_list,
fastperiod=12,
slowperiod=26,
signalperiod=9)
'''得到最近一个交易时间段的dif/dea/macd'''
last_dif = dif[-1]
last_dea = dea[-1]
last_macd = macd[-1]
'''字典包装,用于返回'''
macd_dic = (last_dif, last_dea, last_macd*2)
macd_list[stock] = macd_dic
return macd_list
re_value = get_macd(['002024.XSHE', '000001.XSHE'], check_date=datetime.datetime.now(),unit='1d', include_now=False)
dif, dea, macd = re_value['002024.XSHE']
print(dif, dea, macd)
-0.21268269808256157 -0.20345150043898352 -0.018462395287156097
日级别的MACD调用需要注意一下,假如check_date
的值是2018-09-04
这样的日期形式,默认会按2018-09-04 00:00:00
的时间点结算
而2018-09-04 00:00:00
还没有开盘,所得到的值是上一日收盘后的数据,所以得到MACD的值实际上是上一个交易日的
re_value = get_macd('000001.XSHE', check_date='2018-11-12 14:00:00',unit='60m', include_now=True)
dif, dea, macd = re_value['000001.XSHE']
print(dif, dea, macd)
-0.10318188495987535 -0.06846332775628344 -0.06943711440718381
include_now=False
指定包含当前分钟级别内的数据
re_value = get_macd(['002024.XSHE', '000001.XSHE'], check_date=datetime.datetime.now(),unit='1w', include_now=False)
dif, dea, macd = re_value['002024.XSHE']
print(dif, dea, macd)
-0.36459699432380077 -0.22657033635361742 -0.2760533159403667
get_bars(security, count, unit='1d',
fields=['date', 'open','high','low','close'],
include_now=False, end_dt=None, fq_ref_date=None)
获取各种时间周期的 bar 数据, bar 的分割方式与主流股票软件相同, 而且支持返回当前时刻所在 bar 的数据。
返回一个 numpy.ndarray 对象。可以通过 array['close'] 的方式直接访问列数据。
array = get_bars('000001.XSHG', 5, unit='1d',fields=['open','close'],include_now=False)
array['close']
'''平安银行'''
stocks = '000001.XSHE'
start_day = datetime.datetime.now().date() - datetime.timedelta(days=300)
date_list = [start_day datetime.timedelta(days=i) for i in range(30) if (start_day.weekday() != 5 or start_day.weekday() != 6)]
for date in date_list:
'''跳过周六周日'''
_day = date - datetime.timedelta(days=1)
if date.weekday() == 0 or date.weekday() == 1:
_day = date - datetime.timedelta(days=3)
last_day_dic = get_macd(stocks,
check_date=date,
unit='1d',
include_now=False)
action_day_dic = get_macd(stocks,
check_date=_day,
unit='1d',
include_now=False)
l_dif, l_dea, l_macd = last_day_dic[stocks]
a_dif, a_dea, a_macd = action_day_dic[stocks]
if a_dif < a_dea and l_dif > l_dea:
print(date, '的前一个交易日 金叉形成')
elif a_dif > a_dea and l_dif < l_dea:
print(date, '的前一个交易日 死叉形成')
else:
print(date, '的前一个交易日 维持不变')
2018-01-17 的前一个交易日 维持不变
2018-01-18 的前一个交易日 维持不变
2018-01-19 的前一个交易日 维持不变
2018-01-20 的前一个交易日 维持不变
2018-01-21 的前一个交易日 维持不变
2018-01-22 的前一个交易日 维持不变
2018-01-23 的前一个交易日 维持不变
2018-01-24 的前一个交易日 维持不变
2018-01-25 的前一个交易日 维持不变
2018-01-26 的前一个交易日 维持不变
2018-01-27 的前一个交易日 维持不变
2018-01-28 的前一个交易日 维持不变
2018-01-29 的前一个交易日 维持不变
2018-01-30 的前一个交易日 死叉形成
2018-01-31 的前一个交易日 维持不变
2018-02-01 的前一个交易日 维持不变
2018-02-02 的前一个交易日 维持不变
2018-02-03 的前一个交易日 维持不变
2018-02-04 的前一个交易日 维持不变
2018-02-05 的前一个交易日 维持不变
2018-02-06 的前一个交易日 维持不变
2018-02-07 的前一个交易日 维持不变
2018-02-08 的前一个交易日 维持不变
2018-02-09 的前一个交易日 维持不变
2018-02-10 的前一个交易日 维持不变
2018-02-11 的前一个交易日 维持不变
2018-02-12 的前一个交易日 维持不变
2018-02-13 的前一个交易日 维持不变
2018-02-14 的前一个交易日 维持不变
2018-02-15 的前一个交易日 维持不变
'''苏宁易购'''
stocks = '000001.XSHE'
'''定义一个开始时间'''
start_time = datetime.datetime.strptime('2018-11-12 09:30:00', "%Y-%m-%d %H:%M:%S")
for i in range(12):
now = start_time datetime.timedelta(minutes=i*5)
action_time = now - datetime.timedelta(minutes=5)
last_day_dic = get_macd(stocks,
check_date=now,
unit='5m',
include_now=True)
action_day_dic = get_macd(stocks,
check_date=action_time,
unit='5m',
include_now=False)
l_dif, l_dea, l_macd = last_day_dic[stocks]
a_dif, a_dea, a_macd = action_day_dic[stocks]
# print(action_time,a_dif, a_dea, a_macd,now,l_dif, l_dea, l_macd)
if a_dif < a_dea and l_dif > l_dea:
print(now, '金叉形成')
elif a_dif > a_dea and l_dif < l_dea:
print(now,'死叉形成')
else:
print(now, '维持不变')
2018-11-12 09:30:00 维持不变
2018-11-12 09:35:00 维持不变
2018-11-12 09:40:00 维持不变
2018-11-12 09:45:00 维持不变
2018-11-12 09:50:00 维持不变
2018-11-12 09:55:00 死叉形成
2018-11-12 10:00:00 死叉形成
2018-11-12 10:05:00 维持不变
2018-11-12 10:10:00 维持不变
2018-11-12 10:15:00 维持不变
2018-11-12 10:20:00 维持不变
2018-11-12 10:25:00 金叉形成
周、月、年级别的MACD使用方法同上,又因MACD的延迟性,在该时间使用的人较少,这里不再列出调用代码,使用者可改变参数使用。
由于在研究中使用代码,常常使用到非交易日期,如果在回测中使用,则不会出现非交易日期。
最近和朋友一直在研究 MACD
方面的策略,看到社区里很多人都在问分钟、周级别的MACD
如何写,这里我就直接把代码放出来,分享给各位有需求的朋友!今后,将会陆续推出其它指标的不同时段研究主题!
import pandas as pd
import numpy as np
import talib as tb
import datetime
import time
def get_macd(stock_list, check_date=None, unit='1d', include_now=False):
"""
MACD计算函数,返回一个嵌套字典,Key是股票代码,Value是一个字典,不包括当前时间段的值
stock_list:可以指定单只股票,也可以是股票列表
check_date: 获取MACD值的日期,注意未来数据值
unit:支持分钟 xm、天 xd、周 xw 时间段的数据
include_now: 是否包含当前时间段的bar
"""
macd_list = {}
if isinstance(check_date,str):
check_date = datetime.datetime.strptime(check_date, "%Y-%m-%d %H:%M:%S")
'''如果股票代码是个字符串而不是一个列表,进行转换'''
if isinstance(stock_list,str):
stock_list = [stock_list]
for stock in stock_list:
'''获取指定日期之前的300个收盘价信息'''
array = get_bars(security=stock,
count=500,
unit=unit,
fields=['close'],
include_now=include_now,
end_dt=check_date,
fq_ref_date=check_date)
close_list = array['close']
'''求出用300个数据推算出的dif/dea/macd集合'''
dif, dea, macd = tb.MACD(close_list,
fastperiod=12,
slowperiod=26,
signalperiod=9)
'''得到最近一个交易时间段的dif/dea/macd'''
last_dif = dif[-1]
last_dea = dea[-1]
last_macd = macd[-1]
'''字典包装,用于返回'''
macd_dic = (last_dif, last_dea, last_macd*2)
macd_list[stock] = macd_dic
return macd_list
re_value = get_macd(['002024.XSHE', '000001.XSHE'], check_date=datetime.datetime.now(),unit='1d', include_now=False)
dif, dea, macd = re_value['002024.XSHE']
print(dif, dea, macd)
-0.21268269808256157 -0.20345150043898352 -0.018462395287156097
日级别的MACD调用需要注意一下,假如check_date
的值是2018-09-04
这样的日期形式,默认会按2018-09-04 00:00:00
的时间点结算
而2018-09-04 00:00:00
还没有开盘,所得到的值是上一日收盘后的数据,所以得到MACD的值实际上是上一个交易日的
re_value = get_macd('000001.XSHE', check_date='2018-11-12 14:00:00',unit='60m', include_now=True)
dif, dea, macd = re_value['000001.XSHE']
print(dif, dea, macd)
-0.10318188495987535 -0.06846332775628344 -0.06943711440718381
include_now=False
指定包含当前分钟级别内的数据
re_value = get_macd(['002024.XSHE', '000001.XSHE'], check_date=datetime.datetime.now(),unit='1w', include_now=False)
dif, dea, macd = re_value['002024.XSHE']
print(dif, dea, macd)
-0.36459699432380077 -0.22657033635361742 -0.2760533159403667
get_bars(security, count, unit='1d',
fields=['date', 'open','high','low','close'],
include_now=False, end_dt=None, fq_ref_date=None)
获取各种时间周期的 bar 数据, bar 的分割方式与主流股票软件相同, 而且支持返回当前时刻所在 bar 的数据。
返回一个 numpy.ndarray 对象。可以通过 array['close'] 的方式直接访问列数据。
array = get_bars('000001.XSHG', 5, unit='1d',fields=['open','close'],include_now=False)
array['close']
'''平安银行'''
stocks = '000001.XSHE'
start_day = datetime.datetime.now().date() - datetime.timedelta(days=300)
date_list = [start_day + datetime.timedelta(days=i) for i in range(30) if (start_day.weekday() != 5 or start_day.weekday() != 6)]
for date in date_list:
'''跳过周六周日'''
_day = date - datetime.timedelta(days=1)
if date.weekday() == 0 or date.weekday() == 1:
_day = date - datetime.timedelta(days=3)
last_day_dic = get_macd(stocks,
check_date=date,
unit='1d',
include_now=False)
action_day_dic = get_macd(stocks,
check_date=_day,
unit='1d',
include_now=False)
l_dif, l_dea, l_macd = last_day_dic[stocks]
a_dif, a_dea, a_macd = action_day_dic[stocks]
if a_dif < a_dea and l_dif > l_dea:
print(date, '的前一个交易日 金叉形成')
elif a_dif > a_dea and l_dif < l_dea:
print(date, '的前一个交易日 死叉形成')
else:
print(date, '的前一个交易日 维持不变')
2018-01-17 的前一个交易日 维持不变 2018-01-18 的前一个交易日 维持不变 2018-01-19 的前一个交易日 维持不变 2018-01-20 的前一个交易日 维持不变 2018-01-21 的前一个交易日 维持不变 2018-01-22 的前一个交易日 维持不变 2018-01-23 的前一个交易日 维持不变 2018-01-24 的前一个交易日 维持不变 2018-01-25 的前一个交易日 维持不变 2018-01-26 的前一个交易日 维持不变 2018-01-27 的前一个交易日 维持不变 2018-01-28 的前一个交易日 维持不变 2018-01-29 的前一个交易日 维持不变 2018-01-30 的前一个交易日 死叉形成 2018-01-31 的前一个交易日 维持不变 2018-02-01 的前一个交易日 维持不变 2018-02-02 的前一个交易日 维持不变 2018-02-03 的前一个交易日 维持不变 2018-02-04 的前一个交易日 维持不变 2018-02-05 的前一个交易日 维持不变 2018-02-06 的前一个交易日 维持不变 2018-02-07 的前一个交易日 维持不变 2018-02-08 的前一个交易日 维持不变 2018-02-09 的前一个交易日 维持不变 2018-02-10 的前一个交易日 维持不变 2018-02-11 的前一个交易日 维持不变 2018-02-12 的前一个交易日 维持不变 2018-02-13 的前一个交易日 维持不变 2018-02-14 的前一个交易日 维持不变 2018-02-15 的前一个交易日 维持不变
'''苏宁易购'''
stocks = '000001.XSHE'
'''定义一个开始时间'''
start_time = datetime.datetime.strptime('2018-11-12 09:30:00', "%Y-%m-%d %H:%M:%S")
for i in range(12):
now = start_time + datetime.timedelta(minutes=i*5)
action_time = now - datetime.timedelta(minutes=5)
last_day_dic = get_macd(stocks,
check_date=now,
unit='5m',
include_now=True)
action_day_dic = get_macd(stocks,
check_date=action_time,
unit='5m',
include_now=False)
l_dif, l_dea, l_macd = last_day_dic[stocks]
a_dif, a_dea, a_macd = action_day_dic[stocks]
# print(action_time,a_dif, a_dea, a_macd,now,l_dif, l_dea, l_macd)
if a_dif < a_dea and l_dif > l_dea:
print(now, '金叉形成')
elif a_dif > a_dea and l_dif < l_dea:
print(now,'死叉形成')
else:
print(now, '维持不变')
2018-11-12 09:30:00 维持不变 2018-11-12 09:35:00 维持不变 2018-11-12 09:40:00 维持不变 2018-11-12 09:45:00 维持不变 2018-11-12 09:50:00 维持不变 2018-11-12 09:55:00 死叉形成 2018-11-12 10:00:00 死叉形成 2018-11-12 10:05:00 维持不变 2018-11-12 10:10:00 维持不变 2018-11-12 10:15:00 维持不变 2018-11-12 10:20:00 维持不变 2018-11-12 10:25:00 金叉形成
周、月、年级别的MACD使用方法同上,又因MACD的延迟性,在该时间使用的人较少,这里不再列出调用代码,使用者可改变参数使用。
由于在研究中使用代码,常常使用到非交易日期,如果在回测中使用,则不会出现非交易日期。
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程