因为SuperMind没有封装计算MA均线等指标的函数,所以这里调用talib库来计算股票指标的值。
下面是一个简单的量化策略,策略思路是通过MA5和MA10大小关系再结合MACD的金死叉来进行交易,注释都写得很清楚了。
策略是在同花顺的量化平台编写运行的,如果是用其他平台记得修改代码,具体去查看一下官方文档即可。
import talib
def init(context):
#A股第25名华珏矿业
g.security = '601020.SH' #输入股票代码
#设置MACD模型参数
g.Short = 12 #短周期平滑均线参数
g.Long = 26 #长周期平滑均线参数
g.M = 9 #DIFF的平滑均线参数
set_benchmark('000300.SH') #设置基准指数,默认为沪深300
#设置最大成交比例日级成交量比例50%,分钟级成交量比例50%
set_volume_limit(daily=0.5, minute=0.5)
set_commission(PerShare(type='stock',cost=0.0002))
# 设置股票交易滑点0.5%,表示买入价为实际价格乘1.005,卖出价为实际价格乘0.995
def handle_bar(context,bar_dict):
hh = 0.00
dd = 0.00
#大小周期的MA5小于MA10(白线小于黄线)都成立时,才执行买入条件
#判定买入条件:(小周期MACD金叉买进)
#获取大小周期的MA值
ma5_long,ma5_short,ma10_long,ma10_short = get_mean_N(g.security)
# 快线小于慢线 AND 慢线大于O AND 最近个MACD值大于前一个"三个条件进行选股
if ma5_long < ma10_long and ma5_short < ma10_short and ma5_long>0:
macd = get_macd(g.security)
if macd[-1] > macd[-2]:
#小周期MACD金叉判断,小周期MACD金叉买进
if macd[-1]>0 and macd[-2]<0 and len(list(context.portfolio.stock_account.positions.keys())) == 0:
order_value(g.security,context.portfolio.available_cash)
log.info("买入 %s" % (g.security))
#获取购买日的最高价和最低价
high_price = history(g.security, ['high'], 1, '1d', False, 'pre', is_panel=1)
low_price = history(g.security, ['low'], 1, '1d', False, 'pre', is_panel=1)
high_price_l = high_price['high'].max()
low_price_l = low_price['low'].min()
hh = high_price_l
dd = low_price_l
print(hh,dd)
# # 记录买入价格
# g.buy_price = context.current_data[g.security].close
low_prices = history(g.security, ['low'], 2, '1d', False, 'pre', is_panel=1)
# 获取过去两天中的最低价
min_low_price = low_prices['low'].min()
# 获取当前股票的最新价格
current_price = bar_dict[g.security].close
#判定卖出条件
#判定止盈条件,执行止盈:大于等于两个hh-一个dd
for stock in context.portfolio.positions:
if context.portfolio.positions > 0:
#两个hh-一个dd
if current_price >= hh*2 - dd*1:
# 记录这次卖出
log.info(">=2hh-1dd, 卖出 %s" % (stock))
# 调整stock的持仓为0,即卖出
order_target(stock, 0)
print("!!!大于等于2hh-1dd,执行止盈!!!")
#止损
if current_price <= dd:
log.info("止损, 卖出 %s" % (stock))
# 调整stock的持仓为0,即卖出
order_target(stock, 0)
print("!!!执行止损!!!")
#计算MACD值的函数
def get_macd(stock):
price = history(stock, ['close'], 500, '1d', True, 'pre', is_panel=1)['close']
DIFF, DEA, MACD = talib.MACD(price.values,
fastperiod = g.Short, slowperiod = g.Long, signalperiod = g.M)
return MACD
# #计算MA均线的值
def get_mean_N(stock):
#大周期ma值(30min)
close_data = history(stock, ['close'], 500, '30m', False, 'pre', is_panel=1)
ma5_long= close_data['close'][-5:-1].mean()
ma10_long= close_data['close'][-10:-1].mean()
#小周期ma值(10min)
close_data_1 = history(stock, ['close'], 500, '10m', False, 'pre', is_panel=1)
ma5_short= close_data_1['close'][-5:-1].mean()
ma10_short= close_data_1['close'][-10:-1].mean()
return ma5_long,ma10_long,ma5_short,ma5_long
上述只是模拟回测的策略代码,请勿用于实盘交易,仅供学习!