利用Jupyter Notekook做初步分析,包括给行情画图,加入分析曲线,和···
发布时间:2025-05-24 17:39:13
作者:益华网络
来源:undefined
浏览量(0)
点赞(0)
摘要:最近一段时间都是Jupyter Notebook做策略的最初版本设计,就是行情导入画图一类。 之前做个dataframe做分析容易,这个算是简化版本。 新建一个DataAnalyzer 类,这个简单很多,支持从csv和mongodb导入行情数据,和从1分钟k线整合不同分
最近一段时间都是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()
扫一扫,关注我们
声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。
0