量化交易中利用指标来判断时机可以达到很好的效果。
MACD发明了过半世纪,是可以明确反应出买入卖出点时机的有力指标。
初接触量化的朋友除了通过接口实现自动化交易外,不妨尝试各种指标为自己的策略优化
下面是指标回测的示例。
start = '2021-08-01' # 起始时间
end = '2022-08-01' # 结束时间
universe = DynamicUniverse('HS300') # 证券池,支持股票、基金、期货、指数
benchmark = 'HS300' # 参考标准
freq = 'd' # 'd'表示日间策略使用日线回测,'m'表示日内策略使用
refresh_rate = 1
max_history_window = (50, 300)
# 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
# 配置账户信息,支持多账户
accounts = {
'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)
}
def initialize(context):
pass
# 每个单位时间调用一次
def handle_data(context):
hist = context.history(symbol='all', time_range=34, attribute='closePrice', req='d',style='ast')['closePrice']
current_universe = context.get_universe(exclude_halt=True)
MA_12 = hist[-12:].mean()
MA_26 = hist[-26:].mean()
DIF = MA_12-MA_26
DIF_1 = hist[-13:-1].mean()-hist[-27:-1].mean()
DIF_2 = hist[-14:-2].mean()-hist[-28:-2].mean()
DIF_3 = hist[-15:-3].mean()-hist[-29:-3].mean()
DIF_4 = hist[-16:-4].mean()-hist[-30:-4].mean()
DIF_5 = hist[-17:-5].mean()-hist[-31:-5].mean()
DIF_6 = hist[-18:-6].mean()-hist[-32:-6].mean()
DIF_7 = hist[-19:-7].mean()-hist[-33:-7].mean()
DIF_8 = hist[-20:-8].mean()-hist[-34:-8].mean()
DEA = (DIF+ DIF_1 + DIF_2 + DIF_3 + DIF_4 + DIF_5 + DIF_6 + DIF_7 + DIF_8 )/9
MACD = (DIF-DEA)*2
buylist = []
selllist=[]
for stk in current_universe:
if MACD[stk]>0:
buylist.append(stk)
elif MACD[stk]<0:
selllist.append(stk)
# 获取账户信息
account = context.get_account('fantasy_account')
current_position = account.get_positions(exclude_halt=True)
for stock in current_position:
if stock in selllist:
account.order_to(stock, 0)
# 根据目标持仓权重,逐一委托下单
for stock in current_position:
if stock in buylist:
price = context.current_price(stk)
amount = account.cash/len(buylist)/price
account.order(stock, amount)
MACD四要素:零轴、红绿柱、两条线的交叉、顶底背离
MACD顶底背离:股价上涨,创新高, MACD没创新高,顶背离
总体来说MACD的含义与双均线的含义基本相同,即用快慢均线的分散和聚集来表示当前的多空状态和股价可能的发展趋势,但用起来更方便。当MACD由负转正时,为买入信号。当MACD由正转负时,为卖出信号。当MACD大角度变化时,意味着快均线与慢均线之间的差距正在迅速扩大,代表了市场总体趋势的变化。