JQData 数据获取

作者: pdnbplus | 发布时间: 2024/07/14 | 阅读量: 228

JQData 数据获取 -- 潘登同学的Quant笔记

创建环境

创建环境 安装JQData

conda create -n quant_py36 python=3.6
conda activate quant_py36
pip install jqdatasdk==1.8.11
conda install jupyter notebook

导入认证

# 导入JQData
import jqdatasdk
# 用户认证
'''
账号是绑定的手机号,密码为聚宽官网登录密码
认证成功后,显示”auth success”,就可以开始使用数据了,如果没有出现,请先检查下是否已经申请并通过
'''
jqdatasdk.auth('账号', '密码')

交易策略的结构

  • 初始化函数:initialize(context),用来设定基准等
  • 开盘前运行函数:before_market_open(context)
  • 开盘时运行函数:market_open(context)
  • 收盘后运行函数:after_market_close(context)

这个策略里, 每当我们没有股票时就买入1000股, 每当我们有股票时又卖出800股

def initialize(context):
  # jqdatasdk.g是自带的全局变量 定义一个全局变量, 保存要操作的股票
  jqdatasdk.g.security = '000001.XSHE'
  # 运行函数
  jqdatasdk.run_daily(market_open, time='every_bar')


def market_open(context):
  if jqdatasdk.g.security not in context.portfolio.positions:
    jqdatasdk.order(jqdatasdk.g.security, 1000)
  else:
    jqdatasdk.order(jqdatasdk.g.security, -800)

数据获取函数

  • resample方法:Pandas中的resample,是对原样本重采样的一个方法,经常用于对常规时间序列数
Series.resample(rule, axis=0, closed=None, label=None, convention='start', kind=None, loffset=None, base=None, on=None, level=None, origin='start_day', offset=None, group_keys=_NoDefault.no_default)
import jqdatasdk
import pandas as pd

jqdatasdk.auth('xxx','xxx')

df=jqdatasdk.get_price("000001.XSHE",count=20,end_date="2023-06-29",frequency='daily')
print(df)

df_week = pd.DataFrame()
# 当周开盘价为第一周开盘价
df_week["open"] = df["open"].resample("W").first()
# 当周收盘价为最后一天收盘价
df_week["close"] = df["close"].resample("W").last()
df_week["high"] = df["high"].resample("W").max()
df_week["low"] = df["low"].resample("W").max()
print(df_week)

df_week['volume(sum)'] = df['volume'].resample("W").sum()
df_week['money(sum)'] = df['money'].resample("W").sum()
print(df_week)

  • get_fundamentals()函数:get_fundamentals()函数可以用来查询一只或多只股票的财务数据,其语法格式如下:
get_fundamentals(query_object,date=None,statDate=None)
  • query_object:是一个sqlalchemy.orm.query.Query对象
  • date: 查询日期, 是一个字符串(格式类似’2030-10-15’)或者datetime.date或者datetime.datetime对象,或者可以是None, 即使用默认日期
  • statDate:财报统计的季度或者年份, 一个字符串, 有两种格式:
    • 季度: 格式是: 年 + ‘q’ + 季度序号 例如: ‘2030q1’
    • 年份: 格式就是年份的数字, 例如: ‘2030’
from jqdatasdk import *
# query能获取sqlalchemy.orm.query.Query对象
# valuation是一个StockValuation 市值表 里面包换P/E P/B 日期 股票代码这类数据
q = query(valuation).filter(valuation.code=="000001.XSHE")
df = get_fundamentals(q,"2023-02-05")
df

使用query对象进行股票筛选

from jqdatasdk import *
df = get_fundamentals(
        query(valuation).filter(
                            # 总市值大于1000亿 P/E小于100
                            valuation.market_cap > 1000,
                            valuation.pe_ratio < 10
                        )
                        .order_by(
                            # 按总市值降序排序
                            valuation.market_cap.desc()
                        )
                        .limit(
                            # 最多返回100个
                            100
                        ),
        date='2023-02-05'
    )
df

获取季报数据

  • income表示利润数据
  • balance表示资产负债数据
  • cash_flow表示现金流数据

各财务数据的含义:(不止有这些,ctrl+左键点进去看)

  • income.statDate:财务报表统计的季度的最后一天
  • income.code:股票代码
  • income.basic_eps:基本每股收益(元)
  • balance.cash_equivalents:货币资金(元)
  • cash_flow.goods_sale_and_service_render_cash: 销售商品、提供劳务收到的现金(元)
from jqdatasdk import *
q = query(
    income.statDate,
    income.code,
    income.basic_eps,
    balance.cash_equivalents,
    cash_flow.goods_sale_and_service_render_cash
   ).filter(
    # 平安银行
    income.code == '000001.XSHE',
   )
results = [get_fundamentals(q, statDate='2022q'+str(i)) for i in range(1, 5)]
results[1]
  • get_fundamentals_continuously()函数:get_fundamentals()函数只能用来查询某一交易日的股票财务数据信息,如果要查询多个交易日的股票财务数据信息,则要使用get_fundamentals_continuously()函数

如要求获取平安银行(000001.XSHE)和浦发银行(600000.XSHG)的五日内交易数据

from jqdatasdk import *

q = query(valuation).filter(valuation.code.in_(['000001.XSHE','600000.XSHG']))
df = get_fundamentals_continuously(q,end_date='2023-02-07',count=5)
  • get_industry_stocks()函数:获取在给定日期一个行业的所有股票代码

industry_code:行业编码,可查询

from jqdatasdk import *
stocks = get_industry_stocks("C36",date='2023-02-09') # 获取汽车制造业的股票代码
stocks
  • get_concept_stocks()函数:获取在给定日期一个概念板块的所有股票
  • get_concepts() :获取所有概念

concept_code: 概念板块编码

from jqdatasdk import *
df = get_concepts()
stocks = get_concept_stocks("SC0047",date='2023-02-09') # 获取5G概念的股票
stocks
  • get_all_securities()函数:获取平台支持的所有股票、基金、指数、期货等信息
    • types: list类型用来过滤securities的类型, list元素可选: ‘stock’, ‘fund’, ‘index’, ‘futures’, ‘etf’, ‘lof’, ‘fja’, ‘fjb’。types为空时返回所有股票, 不包括基金,指数和期货
    • date:日期,一个字符串或者 datetime.datetime/datetime.date 对象, 用于获取某日 期还在上市的股票信息. 默认值为 None, 表示获取所有日期的股票信息
from jqdatasdk import *
# 获取所有股票信息
df1 = get_all_securities(['stock'])
# 获取所有分级基金的A份额和B份额的信息
df2 = get_all_securities(['fja','fjb'])
print(df1,df2)
  • get_security_info()函数:获取一只股票(基金或指数)的信息
    • 返回值:一个对象, 有如下属性:
      • display_name # 中文名称
      • name # 缩写简称
      • start_date # 开始日期, [datetime.date] 类型
      • end_date # 结束日期,[datetime.date] 类型
      • type # 类型
from jqdatasdk import *


print("代码502050的证券名:",get_security_info('502050.XSHG').display_name)
print("代码502050的证券缩写简称:",get_security_info('502050.XSHG').name)
print("代码502050的证券上市日期:",get_security_info('502050.XSHG').start_date)
print("代码502050的证券退市日期:",get_security_info('502050.XSHG').end_date)
print("代码502050的证券类型:",get_security_info('502050.XSHG').type)
  • get_billboard_list()函数:获取指定日期区间内的龙虎榜数据
    • 各项参数意义如下:
      • stock_list: 一个股票代码的 list。 当值为 None 时, 返回指定日期的所有股票。
      • start_date:开始日期
      • end_date: 结束日期
      • count: 交易日数量, 可以与 end_date 同时使用, 表示获取 end_date 前 count 个交易日的数据(含 end_date 当日)
    • 返回值pandas.DataFrame, 各 column 的含义如下:
      • code: 股票代码
      • day: 日期
      • direction: ALL 表示『汇总』,SELL 表示『卖』,BUY 表示『买』
      • abnormal_code: 异常波动类型
      • abnormal_name: 异常波动名称
      • sales_depart_name: 营业部名称
      • rank: 0 表示汇总, 1~5 对应买入金额或卖出金额排名第一到第五
      • buy_value:买入金额
      • buy_rate:买入金额占比(买入金额/市场总成交额)
      • sell_value:卖出金额
      • sell_rate:卖出金额占比(卖出金额/市场总成交额)
      • total_value:总额(买入金额 + 卖出金额)
      • net_value:净额(买入金额 - 卖出金额)
      • amount:市场总成交额
from jqdatasdk import *
df = get_billboard_list(stock_list=None,count=5,end_date="2023-02-07")
df
  • history()函数与attribute_history()函数都是回测环境/模拟专用API(只能再JQData平台用)
    • history() 可查询多个标的单个数据字段
    • attribute_history() 获取历史数据,可查询单个标的多个数据字段
df1 = history(5, unit='1d', field='close', security_list=['000001.XSHE','000002.XSHE','000009.XSHE'], df=True, skip_paused=False, fq='pre')
df2 = attribute_history('000009.XSHE',5, '1d', ('open', 'close', 'high', 'low', 'avg', 'low_limit','factor'),True,True,'pre')

history()函数与attribute_history()函数