利用Jupyter Notekook做初步分析,包括给行情画图,加入分析曲线,和买卖点

最近一段时间都是利用Jupyter Notebook做策略的最初版本设计,就是初步行情导入画图一类。

之前做个dataframe做分析容易,分析这个算是包括简化版本。

新建一个DataAnalyzer 类,情画这个简单很多,图加支持从csv和mongodb导入行情数据,服务器租用入分和从1分钟k线整合不同分钟k线

下面是析曲线和导入1分钟螺纹钢数据,整合为5分钟K线

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 from pymongo import MongoClient,买卖 ASCENDING import pandas as pd import numpy as np from datetime import datetime import talib import matplotlib.pyplot as plt import scipy.stats as st %matplotlib inline %config InlineBackend.figure_format = retina class DataAnalyzer(object): """ """ def __init__(self, exportpath="C:\Project\\", datformat=[datetime, high, low, open, close,volume]): self.mongohost = None self.mongoport = None self.db = None self.collection = None self.df = pd.DataFrame() self.exportpath = exportpath self.datformat = datformat self.startBar = 2 self.endBar = 12 self.step = 2 self.pValue = 0.015 def db2df(self, db, collection, start, end, mongohost="localhost", mongoport=27017, export2csv=False): """读取MongoDB数据库行情记录,输出到Dataframe中""" self.mongohost = mongohost self.mongoport = mongoport self.db = db self.collection = collection dbClient = MongoClient(self.mongohost,利用 self.mongoport, connectTimeoutMS=500) db = dbClient[self.db] cursor = db[self.collection].find({ datetime:{ $gte:start, $lt:end}}).sort("datetime",ASCENDING) self.df = pd.DataFrame(list(cursor)) self.df = self.df[self.datformat] self.df = self.df.reset_index(drop=True) path = self.exportpath + self.collection + ".csv" if export2csv == True: self.df.to_csv(path, index=True, header=True) return self.df def csv2df(self, csvpath, dataname="csv_data", export2csv=False): """读取csv行情数据,输入到Dataframe中""" csv_df = pd.read_csv(csvpath) self.df = csv_df[self.datformat] self.df["datetime"] = pd.to_datetime(self.df[datetime]) # self.df["high"] = self.df[high].astype(float) # self.df["low"] = self.df[low].astype(float) # self.df["open"] = self.df[open].astype(float) # self.df["close"] = self.df[close].astype(float) # self.df["volume"] = self.df[volume].astype(int) self.df = self.df.reset_index(drop=True) path = self.exportpath + dataname + ".csv" if export2csv == True: self.df.to_csv(path,初步 index=True, header=True) return self.df def df2Barmin(self, inputdf, barmins, crossmin=1, export2csv=False): """输入分钟k线dataframe数据,合并多多种数据,分析例如三分钟/5分钟等,包括如果开始时间是情画9点1分,crossmin = 0;如果是服务器托管图加9点0分,crossmin为1""" dfbarmin = pd.DataFrame() highBarMin = 0 lowBarMin = 0 openBarMin = 0 volumeBarmin = 0 datetime = 0 for i in range(0, len(inputdf) - 1): bar = inputdf.iloc[i, :].to_dict() if openBarMin == 0: openBarmin = bar["open"] if highBarMin == 0: highBarMin = bar["high"] else: highBarMin = max(bar["high"], highBarMin) if lowBarMin == 0: lowBarMin = bar["low"] else: lowBarMin = min(bar["low"], lowBarMin) closeBarMin = bar["close"] datetime = bar["datetime"] volumeBarmin += int(bar["volume"]) # X分钟已经走完 if not (bar["datetime"].minute + crossmin) % barmins:  # 可以用X整除 # 生成上一X分钟K线的时间戳 barMin = { datetime: datetime, high: highBarMin, low: lowBarMin, open: openBarmin, close: closeBarMin, volume : volumeBarmin} dfbarmin = dfbarmin.append(barMin, ignore_index=True) highBarMin = 0 lowBarMin = 0 openBarMin = 0 volumeBarmin = 0 if export2csv == True: dfbarmin.to_csv(self.exportpath + "bar" + str(barmins)+ str(self.collection) + ".csv", index=True, header=True) return dfbarmin exportpath = "C:\\Project\\" DA = DataAnalyzer(exportpath) #数据库导入 start = datetime.strptime("20190920", %Y%m%d) end = datetime.now() dfrb8888 = DA.db2df(db="VnTrader_1Min_Db", collection="rb8888", start = start, end = end,export2csv=True) dfrb5min = DA.df2Barmin(dfrb8888,5,crossmin=1, export2csv=True) dfrb5min.tail()

2. 计算5分钟K线的参照,包括标准差,rsi,5分钟均线,和40分钟均线

1 2 3 4 5 6 7 8 9 logdata = pd.DataFrame() logdata[close] =(dfrb5min[close]) # logdata[tr] = talib.ATR(np.array(dfrb8888[high]), np.array(dfrb8888[low]), np.array(dfrb8888[close]) ,1) # logdata[atr] = talib.ATR(np.array(dfrb8888[high]), np.array(dfrb8888[low]), np.array(dfrb8888[close]) ,20) logdata[std20] = talib.STDDEV( np.array(dfrb5min[close]) ,20) logdata[rsi30] = talib.RSI(np.array(dfrb5min[close]) ,30) logdata[sma5] = talib.SMA(np.array(dfrb5min[close]) ,5) logdata[sma40] = talib.SMA(np.array(dfrb5min[close]) ,40) logdata.plot(subplots=True,figsize=(18,16))

3. 使用快慢均线策略,显示买入卖出点

1 2 3 4 5 6 7 8 9 10 11 12 13 closeArray = np.array(logdata[close]) listup,listdown = [],[] for i in range(1,len(logdata[close])): if logdata.loc[i,sma5] > logdata.loc[i,sma40] and logdata.loc[i-1,sma5] < logdata.loc[i-1,sma40]: listup.append(i) elif logdata.loc[i,sma5] < logdata.loc[i,sma40] and logdata.loc[i-1,sma5] > logdata.loc[i-1,sma40]: listdown.append(i) fig=plt.figure(figsize=(18,6)) plt.plot(closeArray, color=y, lw=2.) plt.plot(closeArray, ^, markersize=5, color=r, label=UP signal, markevery=listup) plt.plot(closeArray, v, markersize=5, color=g, label=DOWN signal, markevery=listdown) plt.legend() plt.show()

域名
上一篇:3、考虑出售域名
下一篇:四、一定要仔细阅读细节