GitHub:https://github.com/enigmampc/catalyst
官方文档:https://enigma.co/catalyst/index.html
参考视频:网易云课堂《从零搭建数字货币量化交易系统》
系统环境:macOS High Sierra 10.13.6
这篇我们在Catalyst的官方示例dual_moving_average.py的基础上研究双均线策略。
一. 策略要点
1. 短期移动均线上穿长期移动均线,买入
2. 短期移动均线下穿长期移动均线,卖出
如图所示(注意:绿涨红跌,这是国际惯例):
3. 买入和卖出的时机(交易逻辑)
如图所示:第一根K线的短周期均线在长周期均线下方,第二根K线的短周期均线上穿长周期均线,当且仅当第二根K线结束我们才能确认这个买点形成,在catalyst中,我们可以在第二根K线结束时买入。
二. 代码详解
1. 常数设置和程序初始化
这里我们用bitfinex
交易所的BCH/USD交易对,注意:BCH在bitfinex
交易所的名称是BAB,所以symbol是bab_usd
NAMESPACE = 'dual_moving_average'
log = Logger(NAMESPACE)
SIGNAL_BUY = 'buy' # 买入信号
SIGNAL_SELL = 'sell' # 卖出信号
SIGNAL_INIT = '' # 观望信号
SHORT_WIN = 5 # 短周期窗口
LONG_WIN = 20 # 长周期窗口
def initialize(context):
"""
初始化
"""
context.i = 0 # 经历过的交易周期
context.asset = symbol('bab_usd') # 交易对
context.base_price = None # 初始价格
context.signal = SIGNAL_INIT # 交易信号
2. 策略实现
def handle_data(context, data):
# 经历过的交易周期大于长周期均线窗口才开始计算
context.i += 1
if context.i < LONG_WIN + 1:
return
# 获取历史数据,返回series
history_data = data.history(context.asset,
'close',
bar_count=LONG_WIN + 1,
frequency="1D",
)
# 获取当前持仓数量
pos_amount = context.portfolio.positions[context.asset].amount
# 计算双均线
"""
pandas.Series.mean: Return the mean of the values for the requested axis.
scalar or Series (if level specified)
pandas.Rolling.mean: Calculate the rolling mean of the values.
Returned object type is determined by the caller of the rolling calculation.
"""
short_avgs = history_data.rolling(window