历史股票行情API调用和下载

# encoding:utf-8
import requests
import json
import pandas as qh_pd
import time


class QH_JiuFang_Spider(object):
    def __init__(self,
                 qh_url,
                 qh_headers = "",
                 qh_params = "",
                 qh_code = "gbk",
                 ):

        self.qh_url = qh_url
        self.qh_headers = qh_headers
        self.qh_params = qh_params
        self.qh_code = qh_code

    def qh_timestamp_to_date(self,qh_timestamp, qh_format="%Y-%m-%d"):
        """
        转换时间戳为日期函数   作者:阙辉
        :param qh_timestamp:
        :param qh_format:
        :return:
        """
        qh_timestamp = qh_timestamp
        qh_format = qh_format

        # 适应秒和毫秒
        if len(str(qh_timestamp)) == 10:
            qh_timestamp = int(qh_timestamp)
        elif len(str(qh_timestamp)) == 13:
            qh_timestamp = int(qh_timestamp) / 1000

        # print(qh_timestamp)
        qh_timeArray = time.localtime(qh_timestamp)
        qh_otherStyleTime = time.strftime(qh_format, qh_timeArray)

        return qh_otherStyleTime

    def qh_jisuan(self, qh_close="", qh_zr_close="", qh_high="", qh_low="", qh_zongshou="", qh_liutong=""):
        """
        计算指标函数;作者:阙辉
        :param qh_close:
        :param qh_zr_close:
        :param qh_high:
        :param qh_low:
        :param qh_zongshou:
        :param qh_liutong:
        :return:
        """
        if qh_close!= "": qh_close = float(qh_close)  # 今日收盘价
        if qh_zr_close != "":qh_zr_close = float(qh_zr_close)  # 昨日收盘价
        if qh_high != "":qh_high = float(qh_high)  # 最高价
        if qh_low != "":qh_low = float(qh_low)  # 最低价
        if qh_zongshou != "":qh_zongshou = float(qh_zongshou)  # 总手
        if qh_liutong != "":qh_liutong = float(qh_liutong)  # 流通股/

        qh_jieguo = []
        # 涨跌额
        if qh_close != "" and qh_zr_close != "":
            qh_zdf_e = qh_close - qh_zr_close # 涨跌额  = 今日开盘价-昨日开盘价
            qh_zdf_e = round(qh_zdf_e, 6)
            qh_jieguo.append(str(qh_zdf_e))  # 涨跌幅插入列表
        # 涨跌幅
        if qh_close != "" and qh_zr_close != "":
            try:
                qh_zdf = qh_zdf_e / qh_zr_close  # 涨跌幅  = (今日开盘价-昨日开盘价)/昨日开盘价
            except:
                qh_zdf = 0
            qh_zdf = round(qh_zdf, 6)
            qh_jieguo.append(str(qh_zdf))  # 涨跌幅插入列表
        # 振幅
        if qh_high != "" and qh_low !="":
            try:
                qh_zf = (qh_high - qh_low) / qh_zr_close  # 计算振幅  = (最高价-最低价)/昨日收盘价
            except:
                qh_zf = 0
            qh_zf = round(qh_zf, 6)
            qh_jieguo.append(str(qh_zf))  # 涨跌幅插入列表
        # 换手率
        if qh_liutong != "" and qh_zongshou != "":
            try:
                qh_hsl = qh_zongshou / qh_liutong  # 换手率 = 总手/流通股数
            except:
                qh_hsl = 0
            qh_hsl = round(qh_hsl, 6)
            qh_jieguo.append(str(qh_hsl))  # 换手率插入列表
        return qh_jieguo

    def QH_Requests_Get(self,qh_url, qh_headers, qh_params, qh_code='utf-8'):
        """
        get请求函数            作者:阙辉
        :param qh_url:        url网址
        :param qh_headers:    头信息
        :param qh_params:     getURL参数
        :param qh_code:       解析格式
        :return:
        """
        qh_p = requests.get(qh_url, headers=qh_headers, params=qh_params)
        print(qh_p.url)
        qh_p.encoding = qh_code
        qh_wangyi_request = qh_p.text
        return qh_wangyi_request

    def QH_ChuShiHua(self,qh_data):
        qh_data = qh_data
        try:
            qh_data0 = json.loads(qh_data)
            qh_data0 =[qh_data0]
        except:
            qh_data0 = []
        # print(qh_data0)
        return qh_data0


    def QH_JieXi(self,qh_data):
        if len(qh_data)>0:
            qh_data = qh_data[0]
            #历史行情数据
            qh_data_list = qh_data["KlineData"]
            qh_code = qh_data["Inst"]
            qh_Market = qh_data["Market"]

            qh_data_list_colunm = ["TradingDay","Time","High","Open","Low","Close","Volume","Amount"]

            for qh_i,qh_row in enumerate(qh_data_list):
                qh_data_list[qh_i] = [qh_row[qh_row00] for qh_row00 in qh_data_list_colunm]    #解析数据
                qh_data_list[qh_i][0] = self.qh_timestamp_to_date(qh_data_list[qh_i][0])     #翻译时间戳
                if qh_i == 0:
                    qh_data_list[qh_i].insert(2, 0)                                          #插入昨日成交价
                else:
                    qh_data_list[qh_i].insert(2, qh_data_list[qh_i-1][8])                    #插入昨日成交价

                qh_close = qh_data_list[qh_i][6]
                qh_zr_close = qh_data_list[qh_i][2]
                qh_high = qh_data_list[qh_i][3]
                qh_low = qh_data_list[qh_i][5]
                qh_zongshou = qh_data_list[qh_i][7]
                # qh_liutong = qh_data_list[qh_i][0]
                qh_jisuan_list = self.qh_jisuan(qh_close,qh_zr_close,qh_high,qh_low,qh_zongshou,qh_liutong="")   #计算指标
                # print(qh_jisuan_list)

                qh_data_list[qh_i].insert(2,qh_code)                                         #插入股票代码
                qh_data_list[qh_i].insert(2,qh_Market)                                       #插入股票市场类别

                qh_data_list[qh_i] = qh_data_list[qh_i] + qh_jisuan_list
                # print(qh_data_list)
        else:
            qh_data_list = []
        return qh_data_list

    def QH_Main(self):
        """
        主函数:作者:阙辉
        :return:
        """

        qh_url = self.qh_url
        qh_headers = self.qh_headers
        qh_params = self.qh_params
        qh_code = self.qh_code

        qh_reqs = self.QH_Requests_Get(qh_url,qh_headers, qh_params,qh_code)
        # print(qh_reqs)
        qh_csh_data = self.QH_ChuShiHua(qh_reqs)
        qh_jx_data = self.QH_JieXi(qh_csh_data)
        #
        return qh_jx_data

def QH_His_Get_Spider(qh_code,qh_market,qh_count=-50000):

    qh_url0 = """https://hq.techgp.cn/rjhy-gmg-quote/api/1/stock/quote/v1/historyv1?endtime={}&inst={}&limit={}&market={}&servicetype=KLINEB&starttime=0&resptype=JSON&period=DAY"""
    qh_code = qh_code
    qh_market = qh_market
    qh_count = qh_count

    qh_begin = int(time.time())*1000   #获取当前的时间戳
    qh_url = qh_url0.format(qh_begin,qh_code,qh_count,qh_market)
    qh_header = {
        'accept' : 'application/json',
        'accept-encoding' : 'gzip, deflate, br',
        'accept-language' : 'zh-CN,zh;q=0.9',
        'appcode' : 'com.rjhy.uranus',
        'cache-control' : 'no-cache',
        'origin' : 'https://stock.9fzt.com',
        'pragma' : 'no-cache',
        'referer' : 'https://stock.9fzt.com/index/{}_{}.html',
        'sec-fetch-dest' : 'empty',
        'sec-fetch-mode' : 'cors',
        'sec-fetch-site' : 'cross-site',
        'signature' : '25ca35a1a49b68cf9090c45b9dfd17de',
        # 'timestamp' : '1633592035660',
        'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    }
    qh_header["referer"] = qh_header["referer"].format(qh_market,qh_code)
    #主程序
    qh_object_spi = QH_JiuFang_Spider(qh_url,qh_header)                           #实例化对象
    qh_jieguo_list = qh_object_spi.QH_Main()                                     #运行主程序
    # print(qh_jieguo_list)

    return qh_jieguo_list

if __name__ == "__main__":
    qh_code = "000002"   #股票代码
    qh_count = -50000    #数据数量
    qh_market = "SZ"     #证交所   SZ深交所  SH上交所
    qh_jieguo_list = QH_His_Get_Spider(qh_code,qh_market,qh_count)
    qh_data_list_colunm = ["TradingDay", "Time", "Market","code","zuori","High", "Open", "Low", "Close", "Volume", "Amount","zde","zdf","zf"]
    # qh_data_list_colunm = ["TradingDay", "Time", "Market", "code", "zuori", "High", "Open", "Low", "Close", "Volume",
    #                        "Amount"]
    qh_jieguo_list_to_df = qh_pd.DataFrame(qh_jieguo_list,columns=qh_data_list_colunm)
    qh_jieguo_list_to_df.set_index("TradingDay",inplace=True)
    print(qh_jieguo_list_to_df)

    qh_jieguo_list_to_df.to_csv("qh_jiufang_his_jiaoyi_{}.csv".format(qh_code))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值