df['long_stop_price'] = df['close'] - df['atr'] * _stop_atr df['short_stop_price'] = df['close'] + df['atr'] * _stop_atr return df.iloc[-1] def analysis(kline): best_individual = get_params(kline) last_row = get_signal(kline, best_individual) return last_row, best_individual # filename = 'BitMEX-ETH-180803-190817-4H' filename = 'BitMEX-170901-191107-4H' # filename='BitMEX-170901-190606-4H' df = data2df.csv2df(filename + '.csv') df = df.astype(float) datas = df.values backtest = BmBackTest({'asset': 1}) level = 1 for i in range(370, len(df)): test_df = datas[i - 370:i] row, best_individual = analysis(test_df) if row['signal'] in ['long', 'short']: amount = int(backtest.asset * row['close'] * level) backtest.create_order(row['signal'], "market", row['close'], amount)
@desc: CCI 策略回测 ''' import pandas as pd import numpy as np from tools.stockstats import StockDataFrame import time import matplotlib.ticker as ticker from tools import data2df import matplotlib.pyplot as plt # 本金 principal = 10000.0 title = 'BTC2017-09-01-now-1D' df = data2df.csv2df(title + '.csv') df = df.astype(float) df['Timestamp'] = df['Timestamp'].astype(int) stock = StockDataFrame.retype(df) df['date'] = df['timestamp'].apply( lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x))) df['date'] = pd.to_datetime(df['date']) stock['cci'] # 去掉前几个cci指标不准数据 df = df[5:] df['regime'] = np.where((df['cci'] >= 100) & (df['cci'].shift(1) < 100), 1, 0) df['regime'] = np.where((df['cci'] <= 100) & (df['cci'].shift(1) > 100), -1, df['regime'])
@contact: [email protected] @time: 2018/9/16 10:12 @desc: ''' from tools import data2df, wave_guess import pandas as pd import time import numpy as np from tools.stockstats import StockDataFrame df = data2df.csv2df('BTC2017-09-01-now-4H.csv') df = df.astype(float) df['Timestamp'] = df['Timestamp'].astype(int) stock = StockDataFrame.retype(df) df['date'] = df['timestamp'].apply( lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x))) df['date'] = pd.to_datetime(df['date']) stock['cci'] stock['stoch_rsi'] # 去掉前几个cci指标不准数据 df = df[5:] df['ma5'] = np.round(df['close'].rolling(window=5, center=False).mean(), 2) df['v_ma5'] = np.round(df['volume'].rolling(window=5, center=False).mean(), 2)
@contact: [email protected] @time: 2018/12/25 21:33 @desc: https://mp.weixin.qq.com/s?__biz=MzAxNTc0Mjg0Mg==&mid=2653289820&idx=1&sn=d3fee74ba1daab837433e4ef6b0ab4d9&chksm=802e3f49b759b65f422d20515942d5813aead73231da7d78e9f235bdb42386cf656079e69b8b&scene=0&xtrack=1#rd ''' import datetime as dt import matplotlib.pyplot as plt import numpy as np import pandas as pd from tools import data2df stock = data2df.csv2df('BTC2017-09-01-now-1D.csv') stock = stock.astype(float) cutoff = len(stock) // 2 prices = pd.Series(stock.Close) log_prices = np.log(prices) deltas = pd.Series(np.diff(prices), index=stock.index[1:]) log_deltas = pd.Series(np.diff(log_prices), index=stock.index[1:]) latest_prices = stock.Close[cutoff:] latest_log_prices = np.log(latest_prices) latest_log_deltas = deltas[cutoff:] prior_log_deltas = log_deltas[:cutoff] prior_log_mean = np.mean(prior_log_deltas) prior_log_std = np.std(prior_log_deltas) # f, axes = plt.subplots(ncols=2, figsize=(15,5)) # prices.plot(ax=axes[0]) # deltas.hist(bins=50, ax=axes[1])
@contact: [email protected] @time: 2018/9/16 11:07 @desc: ''' from tools import data2df import time import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.ticker as ticker import math df = data2df.csv2df('BTC2016-now-1D.csv') df['Date'] = df['Timestamp'].apply( lambda x: time.strftime("%Y--%m--%d", time.localtime(int(x)))) # 转换datetime格式 df['Date'] = pd.to_datetime(df['Date']) df['Close'] = df['Close'].astype(float) df['5d'] = np.round(df['Close'].rolling(window=5, center=False).mean(), 2) df['10d'] = np.round(df['Close'].rolling(window=10, center=False).mean(), 2) df['30d'] = np.round(df['Close'].rolling(window=30, center=False).mean(), 2) df['60d'] = np.round(df['Close'].rolling(window=60, center=False).mean(), 2) # ax = df[['5d', '10d', '30d', '60d']].plot(figsize=(40, 20), grid=True, xticks=df.index, rot=90) # 计算收益价格 df['return'] = np.log(df['Close'] / df['Close'].shift(1))
@time: 2018/11/28 11:10 @desc: ''' import pandas as pd import numpy as np import time import matplotlib.pyplot as plt from tools import data2df from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import Dense, LSTM, Dropout df = data2df.csv2df("BTC2017-09-01-now-4H.csv") df = df.astype(float) df['Timestamp'] = df['Timestamp'].astype(int) df['Date'] = df['Timestamp'].apply( lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x))) df['Date'] = pd.to_datetime(df['Date']) training_set = df.iloc[:, 4:5].values sc = MinMaxScaler(feature_range=(0, 1)) training_set_scaled = sc.fit_transform(training_set) x_train = [] y_train = [] for i in range(60, len(training_set_scaled)): x_train.append(training_set_scaled[i - 60:i, 0])
@time: 2018/11/27 16:11 @desc: 价格预测 ''' import numpy as np import matplotlib.pyplot as plt import pandas as pd from tools import data2df import time from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import Dense, LSTM, Dropout df = data2df.csv2df('../data/BTC2017-09-01-now-4H.csv') df = df.astype(float) df['Timestamp'] = df['Timestamp'].astype(int) df['Date'] = df['Timestamp'].apply( lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x))) df['Date'] = pd.to_datetime(df['Date']) length = len(df) dataset_train = df.iloc[:int(length * 0.95)] dataset_test = df.iloc[int(length * 0.95):] training_set = dataset_train.iloc[:, 4:5].values sc = MinMaxScaler(feature_range=(0, 1)) training_set_scaled = sc.fit_transform(training_set) x_train = []
@desc: 均线交叉策略 * 当短期均线越过长期均线时,交易金融资产。 * 当短期均线再一次越过长期均线时,结束交易 当短期均线高于长期均线时,我们应进行多头交易,当短期均线再次越过(低于)长期均线时,结束此类交易。当短期均线低于长期均线时,我们应进行空头交易,当短期均线再次越过(高于)长期均线时,结束此类交易。 也就是说,如果短期均线高于长期均线,那么这是一个牛市行情(牛市规则),如果短期均线低于长期均线,则目前为熊市行情(熊市规则) ''' import pandas as pd import numpy as np from tools import data2df import matplotlib.pyplot as plt import matplotlib.ticker as ticker import time df = data2df.csv2df('BTC2017.9.1-now-1D.csv') df['Date'] = df['Timestamp'].apply(lambda x: time.strftime("%Y-%m-%d", time.localtime(int(x)))) # 转换datetime格式 df['Date'] = pd.to_datetime(df['Date']) # print(df.dtypes) # print(df.head()) df['MA5'] = np.round(df['Close'].rolling(window=5, center=False).mean(), 2) df['MA10'] = np.round(df['Close'].rolling(window=10, center=False).mean(), 2) df['MA5-MA10'] = df['MA5'] - df['MA10'] df['Regime'] = np.where(df['MA5-MA10'] > 0, 1, 0) df['Regime'] = np.where(df['MA5-MA10'] < 0, -1, df['Regime']) # TODO x轴不为时间轴,需要改进
from tools import data2df import matplotlib.pyplot as plt def Stoch(close, high, low, smoothk, smoothd, n): lowestlow = pd.Series.rolling(low, window=n, center=False).min() highesthigh = pd.Series.rolling(high, window=n, center=False).max() rsv = 100 * (close - lowestlow) / (highesthigh - lowestlow) K = pd.Series([50] * len(rsv)) K = rsv / 3 + 2 * K.shift(1) / 3 D = pd.Series([50] * len(rsv)) D = K / 3 + 2 * D.shift(1) / 3 return K, D df = data2df.csv2df('BTC2018-09-15-now-30M.csv') df = df.astype(float) df['Timestamp'] = df['Timestamp'].astype(int) stock = StockDataFrame.retype(df) df['date'] = df['timestamp'].apply( lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x))) df['date'] = pd.to_datetime(df['date']) stock['rsi_14'] np_float_data = np.array(df['close']) myStochRSI = Stoch(df.close, df.high, df.low, 3, 3, 14) df['rsi_k'], df['rsi_d'] = myStochRSI # print(df.dtypes) print(df[['date', 'rsi_14', 'rsi_k', 'rsi_d']].tail(30))
@time: 2018/9/16 20:57 @desc: 预测价格 ''' import pandas as pd import sklearn as skl import numpy as np from sklearn import datasets, linear_model from sklearn.model_selection import train_test_split, cross_val_score import time from tools import data2df stock_X = data2df.csv2df('BTC2016-now-1D.csv') stock_X['Close'] = stock_X['Close'].astype(float) stock_y = pd.Series(stock_X['Close'].values) stock_X_test = stock_X.iloc[len(stock_X) - 1] # 使用今天的交易价格,13 个指标预测明天的价格。偏移股票数据,今天的数据,目标是明天的价格。 stock_X = stock_X.drop(stock_X.index[len(stock_X) - 1]) # 删除最后一条数据 stock_y = stock_y.drop(stock_y.index[0]) # 删除第一条数据 # 删除掉close 也就是收盘价格。 del stock_X["Close"] del stock_X_test["Close"] # 使用最后一个数据做测试。 stock_y_test = stock_y.iloc[len(stock_y) - 1]
@contact: [email protected] @time: 2018/9/16 10:12 @desc: ''' from tools import data2df, wave_guess import pandas as pd import time import numpy as np from tools.stockstats import StockDataFrame df = data2df.csv2df('BitMEX-170901-190606-4H.csv') df = df.astype(float) df['Timestamp'] = df['Timestamp'].astype(int) stock = StockDataFrame.retype(df) df['date'] = df['timestamp'].apply(lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x))) df['date'] = pd.to_datetime(df['date']) stock['cci'] stock['stoch_rsi'] # 去掉前几个cci指标不准数据 df = df[5:] df['ma5'] = np.round(df['close'].rolling(window=5, center=False).mean(), 2) df['v_ma5'] = np.round(df['volume'].rolling(window=5, center=False).mean(), 2)
''' import datetime import matplotlib from matplotlib.dates import DateFormatter, WeekdayLocator, \ DayLocator, MONDAY import matplotlib.pyplot as plt import matplotlib.ticker as ticker import pandas as pd from mpl_finance import candlestick2_ochl import time import numpy as np from tools import data2df df = data2df.csv2df('BitMEX-ETH-180803-190817-4H.csv') df = df.astype(float) df['Date'] = df['Timestamp'].apply( lambda x: time.strftime("%Y--%m--%d", time.localtime(int(x)))) df['Date'] = pd.to_datetime(df['Date']) df[['Close', 'High', 'Open', 'Low']] = df[['Close', 'High', 'Open', 'Low']].astype(float) # df['Close'] = df['Close'].astype(float) # Ma5, MA20, MA50, MA200 均线 # df['MA5'] = np.round(df['Close'].rolling(window=5, center=False).mean(), 2) # df['MA20'] = np.round(df['Close'].rolling(window=20, center=False).mean(), 2) # df['MA50'] = np.round(df['Close'].rolling(window=50, center=False).mean(), 2) # df['MA200'] = np.round(df['Close'].rolling(window=200, center=False).mean(), 2) # print(type(btc))
# df['signal'] = 'wait' # df['signal'] = np.where((df['s'] == 1) & (df['s'].shift(1) == 0), 'long', df['signal']) # df['signal'] = np.where((df['s'] == -1) & (df['s'].shift(1) == 0), 'short', df['signal']) # df['signal'] = np.where((df['s'] == 1) & (df['s'].shift(1) == -1), 'long', df['signal']) # df['signal'] = np.where((df['s'] == -1) & (df['s'].shift(1) == 1), 'short', df['signal']) # df['signal'] = np.where((df['s'] == 0) & (df['s'].shift(1) == -1), 'close_short', df['signal']) # df['signal'] = np.where((df['s'] == 0) & (df['s'].shift(1) == 1), 'close_long', df['signal']) return df filename = 'BitMEX-%s-20180803-20190920-15m' ticker1 = 'BTC' ticker2 = 'ETH' df1 = data2df.csv2df(filename % ticker1 + '.csv') df1 = df1.astype(float) df2 = data2df.csv2df(filename % ticker2 + '.csv') df2 = df2.astype(float) backtest1 = BmBackTest({'asset': 0.5}) backtest2 = BmBackTest({'asset': 0.5}) level = 1 start_idx = 500 plt_data = [] signals = {-1: 'short', 0: 'wait', 1: 'long'} for i in range(start_idx, len(df1)): test_df1 = df1[i - start_idx:i] test_df2 = df2[i - start_idx:i]