股票每天最高最低价的黄金分割线&买卖点标记

如题,自己备份用。

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()

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值