如题,自己备份用。
import datetime
import numpy as np
import scipy.stats as st
import baostock as bs
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
import pandas as pd
import mplfinance as mpf
# 获取某支股票过去xx天的数据 dataframe格式 stockCode格式'000001.SZ'
def get_stockData(stockCode, dayRange=50):
# 登录系统
lg = bs.login()
# 显示登录返回信息
print(lg.error_code)
print(lg.error_msg)
# 平安银行股票代码
bs_code = stockCode # '000001.SZ'
# 过去x days的数据
days = dayRange
end_date = datetime.date.today().strftime('%Y-%m-%d')
start_date = (datetime.date.today() - datetime.timedelta(days=days)).strftime('%Y-%m-%d')
rs = bs.query_history_k_data(code=bs_code,
fields='code,date,open,high,low,close,peTTM,pbMRQ,volume', # 代码 日期 etc volume成交量
start_date=start_date, end_date=end_date, frequency="d", adjustflag="3")
# 获取具体的股价信息
stock_list = []
while (rs.error_code == '0') & rs.next():
# 分页查询,将每页信息合并在一起
stock_list.append(rs.get_row_data())
stock_data = pd.DataFrame(stock_list, columns=rs.fields)
# 如果写入文档可以启用下边这行
# stock_data.to_csv("stock_temp.csv", index=False)
# 获取原始数据中的部分数据,注意一定用loc,不要用iloc
show_data = stock_data.loc[:, ['date', 'open', 'high', 'low', 'close', 'volume']]
# 原数据集中的日期强制修改为日期格式
show_data['date'] = pd.to_datetime(show_data['date'])
# 选取所有行的股票代码 开收盘价 以及最高低价,并转化为float类型(默认为string)
show_data.loc[:, ['open', 'high', 'low', 'close', 'volume']] = show_data[
['open', 'high', 'low', 'close', 'volume']].astype(float)
# 将日期设定为index主键
show_data = show_data.set_index(['date'], drop=True)
# 如果上文用到写入文档,这里就可以读取文档了 读取文档就不用上边这一堆罗里吧嗦的转换了
# show_data2 = pd.read_csv('stock_temp.csv', index_col=0, parse_dates=True, usecols=[1, 2, 3, 4, 5])
bs.logout()
return show_data
# 计算过去5的股票最高值与最低值之间的黄金分割点数值 返回数组
def get_fibonaciwithDays(stockData, days=5):
stockdata = stockData
ave_days = days
len_data = len(stockdata)
fibo_points = []
for i in range(0, len_data):
if i < ave_days:
fibo_points.append(np.NaN)
else:
high_point = 0
low_point = 99999999
for j in range(0, ave_days):
if stockdata.iloc[i - (ave_days - j)]['high'] > high_point:
high_point = stockdata.iloc[i - (ave_days - j)]['high']
if stockdata.iloc[i - (ave_days - j)]['low'] < low_point:
low_point = stockdata.iloc[i - (ave_days - j)]['low']
fibo_point_value = low_point + (high_point - low_point) * 0.618
fibo_points.append(fibo_point_value)
# print(fibo_points)
return fibo_points
# 计算两个数组的交叉点,返回上穿和下穿两个数组 data1为快线 date2为慢线
def get_crossPoint(stockdata1, stockdata2):
if len(stockdata1) != len(stockdata2):
print("两个数组长度不一致,请检查数组")
return
upCross = [] #上穿数组
downCross = [] # 下穿数组
data1isbig = True
start_flag = True
for i in range(0, len(stockdata1)):
if (not np.isnan(stockdata1[i])) and (not np.isnan(stockdata2[i])):
# if (stockdata1[i] != np.NaN) and (stockdata2[i] != np.NaN): 这个是错误语法
if start_flag:
# 刚开始计算 初始化数值
if stockdata1[i] < stockdata2[i]:
data1isbig = False
else:
data1isbig = True
start_flag = False
if stockdata1[i] < stockdata2[i] and data1isbig:
# 下穿
data1isbig = False
upCross.append(np.NaN)
downCross.append(stockdata1[i])
continue
elif stockdata1[i] > stockdata2[i] and (not data1isbig):
# 上穿
data1isbig = True
upCross.append(stockdata2[i])
downCross.append(np.NaN)
continue
else:
upCross.append(np.NaN)
downCross.append(np.NaN)
continue
else:
upCross.append(np.NaN)
downCross.append(np.NaN)
continue
return upCross, downCross
stock_data = get_stockData('000001.SZ', 200)
# 根据过去5日线和10日线的黄金分割点 判定买入卖出机会
fibo_points_data_5 = get_fibonaciwithDays(stock_data, 5)
fibo_points_data_10 = get_fibonaciwithDays(stock_data, 10)
upScatter, downScatter = get_crossPoint(fibo_points_data_5, fibo_points_data_10)
add_plot = [
mpf.make_addplot(upScatter, type='scatter', markersize=50, marker='^', color='purple'),
mpf.make_addplot(downScatter, type='scatter', markersize=50, marker='v', color='b'),
mpf.make_addplot(fibo_points_data_5, type='line', markersize=100, marker='^', color='orangered'),
mpf.make_addplot(fibo_points_data_10, type='line', markersize=100, marker='^', color='aqua'),
]
# 画K线图
mpf.plot(stock_data, type='candle', style='yahoo', addplot=add_plot, volume=True) # mav=(5, 10)
plt.show()