本方法以数字货币为落地标的,股市、基金以此类推。
任何资本市场都伴随着震荡和波动,类似于潮起潮落,潮起潮落后会留下能,而震荡前后可以留下利润,困难的地方在于什么时候是潮起,什么时候是潮落,真实的潮水分辨较为简单,能够看到低点和高点,但是低点和高点是相对与潮整体来说的,或者说整个潮水波浪面的中界面,如果高于这个中界面为潮起,低于这个中界面为潮落。对于数字货币来说,关键是在找到中界面。
潮向上动时会升,潮向下动时会降,我们需要在潮向上的时候买,在潮向下的时候卖。具体的思路为:每个时间整点收集比特币的价格,当当前价格超过前五个时间点的价格时,我们认为现在处于潮水向上涌阶段,进入上升通道,买;当当前价格低于前五个时间点的价格时,我们认为现在处于潮水向下泄阶段,进入下降通道,卖。
接下来开始代码学习阶段,是的,很枯燥,很无聊,我也是,但是要坚持,不然就只能拿着方法吹牛,而不能拿着方法赚钱。
PARAMS = {
"start_time": "2017-06-01 00:00:00", # 回测起始时间
"end_time": "2017-07-01 00:00:00", # 回测结束时间
"commission": 0.002, # 此处设置交易佣金
"slippage": 0.001, # 此处设置交易滑点
"account_initial": {"xxx_cny_cash": 10000,"xxx_cny_btc": 0}, #xxx平台的账户初始情况,初始人民币为10000,初始比特币为0。
}
以上为定义部分,基本上就是进行回测的起始时间、结束时间、交易佣金、滑点和账户初始情况,接下来我们需要对市场数据进行读取,具体程序如下所示:
def initialize(context): #定义初始函数
context.frequency = "30m" # 以30分频率进行回测
context.benchmark = "xxx_cny_btc" # 用于计算xxx平台上的收益
context.security = "xxx_cny_btc" # 策略指定xxx平台上的的交易品种
接下来为策略的执行函数,最关键、最难也是最枯燥的部分。
def handle_data(context):
hist = context.data.get_price(context.security, count=5, frequency=context.frequency) # context.data.get_price()为获取最近历史价格的函数,context.security为获取的对象,count为获取的数量,frequency为数据调用的频率。本句意思为获取最近5个频率周期的历史数据
ma = hist["close"].rolling(window=5).mean()[-1] # 计算最近5个收盘价的均价,这个函数可能比较难以理解,查阅半天也没有得到一个比较好的答案,hist["close"]我猜是hist得到一个数字序列,close的意思是从头读到尾,rooling_mean是计算窗口的平均值,5代表五个窗口,也就是五个数字。[-1]不知道啥意思。
current_price = context.data.get_current_price(context.security) # 获取当前价格
if current_price > ma and context.account.xxx_cny_cash >= XXX_CNY_BTC_MIN_ORDER_CASH_AMOUNT: # 当前价格大于均价时,全仓买入
context.order.buy(context.security, cash_amount=str(context.account.huobi_cny_cash))
elif current_price < ma and context.account.huobi_cny_btc >= XXX_CNY_BTC_MIN_ORDER_QUANTITY: # 当前价格小于均价时,全仓卖出
context.order.sell(context.security, quantity=str(context.account.xxx_cny_btc))
而买卖的效果如何呢,具体如下图所示:
由此可见,量化很难学,量化的效果也并不如我们想象中的那么显著,但是好在较为稳健,量化是一种较好的投资方法。