コード例 #1
0
    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)
コード例 #2
0
ファイル: CCI_test.py プロジェクト: ruinwCN/quantitative
@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'])
コード例 #3
0
@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)
コード例 #4
0
@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])
コード例 #5
0
@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))
コード例 #6
0
@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])
コード例 #7
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 = []
コード例 #8
0
@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轴不为时间轴,需要改进
コード例 #9
0
ファイル: test.py プロジェクト: ruinwCN/quantitative
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))
コード例 #10
0
@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]
コード例 #11
0
@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)
コード例 #12
0
ファイル: k_line.py プロジェクト: xiangzz159/quantitative
'''

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))
コード例 #13
0
    # 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]