文章数据集下载: https://pan.baidu.com/s/1c17mSNm
本次示例展示如何在一个开放的比特币数据集下模拟一种十分有名的交易策略。这种类模拟可能会出现的一些缺陷值。这个策略源于Richard Dennis和他的“海龟”交易员团队,你可以从《海龟交易法则》一书中掌握更多细节。
我强烈建议你不要在实际中这样操作,这纯粹是一个简单的例子,目的在于突出数据处理中的技巧和缺陷。本文并非聚焦于交易和金融方面的建议。比特币是一个异常波动的市场,它有一些特殊的挑战。如果你对金融交易算法感兴趣,最好不要从我这里开始。
海龟交易法则希望用固定的规则来进行投资,降低人为操作中各种因素的干扰。
import numpy as np
import pandas as pd
import datetime
import os
#定义转换函数将日期转换为原生日期格式
def dateparse (time_in_secs):
return datetime.datetime.fromtimestamp(float(time_in_secs))
print('Data listing...')
# 读取数据并采用转换函数
print('Using bitstampUSD_1-min_data...')
data = pd.read_csv('btceUSD_1-min_data_2012-01-01_to_2017-05-31.csv', parse_dates=True, date_parser=dateparse, index_col=[0])
print('Total null open prices: %s' % data['Open'].isnull().sum())
输出:
Data listing...
Using bitstampUSD_1-min_data...
Total null open prices: 881023
下面开始填补一些缺陷值,我们将交易量和加权价格这些简单项直接用0来填补。
而应对开盘价、结束价、最高价、最低价这些时序数据时,用前一个非缺失值去填充该缺失值。
data['Volume_(BTC)'].fillna(value=0, inplace=True)
data['Volume_(Currency)'].fillna(value=0, inplace=True)
data['Weighted_Price'].fillna(value=0, inplace=True)
data['Open'].fillna(method='ffill', inplace=True)
data['High'].fillna(method='ffill', inplace=True)
data['Low'].fillna(method='ffill', inplace=True)
data['Close'].fillna(method='ffill', inplace=True)
# 现在来检查一下数据,看上去十分干净漂亮
print(data)
image.png
海龟交易的具体规则是:
当今天的收盘价,大于过去60个交易日中的最高价时,以收盘价买入;
买入后,当收盘价小于过去60个交易日中的最低价时,以收盘价卖出。
# 首先我们需要交易信号. 海龟策略是基于日常数据,
#他们通常在22-60天这个大体范围来决定突破行为(可能高位价格会越来越高或者低位价格越来越低)。
#如果我们按分钟价格条来操作,即便看到一个22分钟的新高也不应该感到激动。
#不妨调整至60天,试着像他们那样只关注收盘价。
signal_lookback = 60 * 24 * 60 #天数 * 小时 * 分钟
# 这里是我们的交易信号列
data['Buy'] = np.zeros(len(data))
data['Sell'] = np.zeros(len(data))
# 下面开始实践。
data['RollingMax'] = data['Close'].shift(1).rolling(signal_lookback, min_periods=signal_lookback).max()
data['RollingMin'] = data['Close'].shift(1).rolling(signal_lookback, min_periods=signal_lookback).min()
data.loc[data['RollingMax'] < data['Close'], 'Buy'] = 1
data.loc[data['RollingMin'] > data['Close'], 'Sell'] = -1
# 现在实现数据可视化
import matplotlib
import matplotlib.pyplot as plt
fig,ax1 = plt.subplots(1,1)
ax1.plot(data['Close'])
y = ax1.get_ylim()
ax1.set_ylim(y[0] - (y[1]-y[0])*0.4, y[1])
ax2 = ax1.twinx()
ax2.set_position(matplotlib.transforms.Bbox([[0.125,0.1],[0.9,0.32]]))
ax2.plot(data['Buy'], color='#77dd77')
ax2.plot(data['Sell'], color='#dd4444')
plt.show()
image.png
海龟交易法则实际上是一个还凑合的方法。其本质上面向趋势的交易策略是一样的,在实际运用中和反向测试中,海龟交易法则的弱势是面对较大波谷的市场,当然有时候也因为这个特点在波峰较大的时段也容易获益。
网友评论