量化交易-获取股票数据

发布时间:2024年01月24日

什么是股票

股票的由来
image.png
股票:股份公司发行的所有权凭证、一种投资工具、投资介质
股票的特性
股票:股份公司的所有权凭证、盈亏自负
基金:投资组合(股票、债券、现金)
债券:还本付息的有价证券(国债、企业债、金融债券)
风险
股票>基金>债券
收益
股票>基金>债券

如何获取股票数据

爬虫、数据服务商、免费接口
https://www.joinquant.com/data
image.png
注册账号提交使用申请
https://www.joinquant.com/user/login/index?redirect=/default/index/sdk#jq-sdk-apply
申请试用
https://www.joinquant.com/default/index/sdk#jq-sdk-apply
image.png
按照教程
https://www.joinquant.com/help/api/doc?name=logon&id=9823

安装库

pip install jqdatasdk -i https://pypi.tuna.tsinghua.edu.cn/simple

image.png
image.png
获取数据

from jqdatasdk import *
auth('账号','密码')

df = get_price('000001.XSHE', count=2,end_date='2022-10-31',frequency='daily',
               fields=['open','close'])
print(df)

获取所有A股行情数据

stocks = list(get_all_securities(['stock']).index)
for stock_code in stocks:
    df = get_price(stock_code, count=2,end_date='2022-10-31',frequency='daily',panel=False)
    print(df)
    time.sleep(3)

image.png

Resample函数

Python数据分析库Pandas方法函数
用于转换时间序列的频次
image.png
image.png
代码

import time
import  pandas as pd
from jqdatasdk import *
auth('账号','密码')
# stocks = list(get_all_securities(['stock']).index)
# for stock_code in stocks:
#     df = get_price(stock_code, count=2,end_date='2022-10-31',frequency='daily',panel=False)
#     print(df)
#     time.sleep(3)

# 转换周期:日K转换为周K
df = get_price('000001.XSHG',start_date='2022-01-01',end_date='2022-12-31',
               frequency='daily',panel=False)
df['weekday']=df.index.weekday
# 获取周K(当周的):开盘价(当周第一天)、收盘价(当周最后一天)、最高价(当周)、最低价(当周)
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').min()


# 汇总统计 统计一下月成交量、成交额(sum)
df_week['volume(sum)']=df['volume'].resample('W').sum()
df_week['money(sum)']=df['money'].resample('W').sum()

print(df_week)

image.png

使用JQData查询财务指标

财务指标
image.png
资产负债表:体现企业家底和负债情况
利润表:公司盈利能力、赚了多少、怎么赚的 隐含着对未来利润增长的预期 体现市场空间、成长能力
现金流量表:权责发生制vs收付实现制

打开文档搜索财务数据
image.png
image.png
例子:

df = get_fundamentals(query(indicator),statDate='2022')
print(df)
df.to_csv('finance2022.csv')

获取数据 将数据保存为CSV
image.png

indicator财务指标表
列名列的含义解释
code股票代码带后缀.XSHE/.XSHG
pubDate日期公司发布财报日期
statDate日期财报统计的季度的最后一天, 比如2015-03-31, 2015-06-30
eps每股收益EPS(元)每股收益(摊薄)=净利润/期末股本;分子从单季利润表取值,分母取季度末报告期股本值。
adjusted_profit扣除非经常损益后的净利润(元)非经常性损益这一概念是证监会在1999年首次提出的,当时将其定义为:公司正常经营损益之外的一次性或偶发性损益。《问答第1号》则指出:非经常性损益是公司发生的与经营业务无直接关系的收支;以及虽与经营业务相关,但由于其性质、金额或发生频率等方面的原因,影响了真实公允地反映公司正常盈利能力的各项收入。
operating_profit经营活动净收益(元)营业总收入-营业总成本
value_change_profit价值变动净收益(元)公允价值变动净收益+投资净收益+汇兑净收益
roe净资产收益率ROE(%)归属于母公司股东的净利润*2/(期初归属于母公司股东的净资产+期末归属于母公司股东的净资产)
inc_return净资产收益率(扣除非经常损益)(%)扣除非经常损益后的净利润(不含少数股东损益)*2/(期初归属于母公司股东的净资产+期末归属于母公司股东的净资产)
roa总资产净利率ROA(%)净利润*2/(期初总资产+期末总资产)
net_profit_margin销售净利率(%)净利润/营业收入
gross_profit_margin销售毛利率(%)毛利/营业收入
expense_to_total_revenue营业总成本/营业总收入(%)营业总成本/营业总收入(%)
operation_profit_to_total_revenue营业利润/营业总收入(%)营业利润/营业总收入(%)
net_profit_to_total_revenue净利润/营业总收入(%)净利润/营业总收入(%)
operating_expense_to_total_revenue营业费用/营业总收入(%)营业费用/营业总收入(%)
ga_expense_to_total_revenue管理费用/营业总收入(%)管理费用/营业总收入(%)
financing_expense_to_total_revenue财务费用/营业总收入(%)财务费用/营业总收入(%)
operating_profit_to_profit经营活动净收益/利润总额(%)经营活动净收益/利润总额(%)
invesment_profit_to_profit价值变动净收益/利润总额(%)价值变动净收益/利润总额(%)
adjusted_profit_to_profit扣除非经常损益后的净利润/归属于母公司所有者的净利润(%)扣除非经常损益后的净利润/归属于母公司所有者的净利润(%)
goods_sale_and_service_to_revenue销售商品提供劳务收到的现金/营业收入(%)销售商品提供劳务收到的现金/营业收入(%)
ocf_to_revenue经营活动产生的现金流量净额/营业收入(%)经营活动产生的现金流量净额/营业收入(%)
ocf_to_operating_profit经营活动产生的现金流量净额/经营活动净收益(%)经营活动产生的现金流量净额/经营活动净收益(%)
inc_total_revenue_year_on_year营业总收入同比增长率(%)营业总收入同比增长率是企业在一定期间内取得的营业总收入与其上年同期营业总收入的增长的百分比,以反映企业在此期间内营业总收入的增长或下降等情况。
inc_total_revenue_annual营业总收入环比增长率(%)营业收入是指企业在从事销售商品,提供劳务和让渡资产使用权等日常经营业务过程中所形成的经济利益的总流入。环比增长率=(本期的某个指标的值-上一期这个指标的值)/上一期这个指标的值*100%。
inc_revenue_year_on_year营业收入同比增长率(%)营业收入,是指公司在从事销售商品、提供劳务和让渡资产使用权等日常经营业务过程中所形成的经济利益的总流入,而营业收入同比增长率,则是检验上市公司去年一年挣钱能力是否提高的标准,营业收入同比增长,说明公司在上一年度挣钱的能力加强了,营业收入同比下降,则说明公司的挣钱能力稍逊于往年。
inc_revenue_annual营业收入环比增长率(%)环比增长率=(本期的某个指标的值-上一期这个指标的值)/上一期这个指标的值*100%。
inc_operation_profit_year_on_year营业利润同比增长率(%)同比增长率就是指公司当年期的净利润和上月同期、上年同期的净利润比较。(当期的利润-上月(上年)当期的利润)/上月(上年)当期的利润=利润同比增长率。
inc_operation_profit_annual营业利润环比增长率(%)环比增长率=(本期的某个指标的值-上一期这个指标的值)/上一期这个指标的值*100%。
inc_net_profit_year_on_year净利润同比增长率(%)(当期的净利润-上月(上年)当期的净利润)/上月(上年)当期的净利润绝对值=净利润同比增长率。
inc_net_profit_annual净利润环比增长率(%)环比增长率=(本期的某个指标的值-上一期这个指标的值)/上一期这个指标的值*100%。
inc_net_profit_to_shareholders_year_on_year归属母公司股东的净利润同比增长率(%)归属于母公司股东净利润是指全部归属于母公司股东的净利润,包括母公司实现的净利润和下属子公司实现的净利润;同比增长率,一般是指和去年同期相比较的增长率。同比增长 和上一时期、上一年度或历史相比的增长(幅度)。
inc_net_profit_to_shareholders_annual归属母公司股东的净利润环比增长率(%)环比增长率=(本期的某个指标的值-上一期这个指标的值)/上一期这个指标的值*100%。

image.png
选股

df = get_fundamentals(query(indicator),statDate='2022')
# print(df)
# df.to_csv('finance2022.csv')

# 基于盈利指标选股:eps,operating_profit,roe,inc_net_profit_year_on_year
df = df[(df['eps']>0)&(df['operating_profit']>1012171617)&(df['roe']>10)&(df['inc_net_profit_year_on_year']>10)]
print(df)

使用JQData查询估值指标

对企业进行估值的方法:绝对估值、相对估值

绝对估值法

定价模型:计算企业的内在价值
image.png

相对估值法

估值指标:PE市盈率、PB市净率、PS市销率
image.png
使用get_fundamentals(query(valuation),date),指定date为某一交易日,获取该交易日的估值数据

valuation估值数据表
列名列的含义解释公式
code股票代码带后缀.XSHE/.XSHG
day日期取数据的日期
capitalization总股本(万股)公司已发行的普通股股份总数(包含A股,B股和H股的总股本)
circulating_cap流通股本(万股)公司已发行的境内上市流通、以人民币兑换的股份总数(A股市场的流通股本)
market_cap总市值(亿元)A股收盘价*已发行股票总股本(A股+B股+H股)
circulating_market_cap流通市值(亿元)流通市值指在某特定时间内当时可交易的流通股股数乘以当时股价得出的流通股票总价值。A股市场的收盘价*A股市场的流通股数
turnover_ratio换手率(%)指在一定时间内市场中股票转手买卖的频率,是反映股票流通性强弱的指标之一。换手率=[指定交易日成交量(手)_100/截至该日股票的流通股本(股)]_100%
pe_ratio市盈率(PE, TTM)每股市价为每股收益的倍数,反映投资人对每元净利润所愿支付的价格,用来估计股票的投资报酬和风险市盈率(PE,TTM)=(股票在指定交易日期的收盘价* 截止当日公司总股本)/归属于母公司股东的净利润TTM
pe_ratio_lyr市盈率(PE)以上一年度每股盈利计算的静态市盈率. 股价/最近年度报告EPS市盈率(PE)=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/归属母公司股东的净利润
pb_ratio市净率(PB)每股股价与每股净资产的比率市净率=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/(归属母公司股东的权益 MRQ-其他权益工具)
ps_ratio市销率(PS, TTM)市销率为股票价格与每股销售收入之比,市销率越小,通常被认为投资价值越高。市销率TTM=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/营业总收入TTM
pcf_ratio市现率(PCF, 现金净流量TTM)每股市价为每股现金净流量的倍数市现率=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/现金及现金等价物净增加额TTM
# 获取股票估值指标
df = get_fundamentals(query(valuation),statDate='2022')
print(df)

image.png
将code为索引匹配对应信息 筛选

df = get_fundamentals(query(indicator),statDate='2022')
# print(df)
# # df.to_csv('finance2022.csv')
#
# # 基于盈利指标选股:eps,operating_profit,roe,inc_net_profit_year_on_year
df = df[(df['eps']>0)&(df['operating_profit']>1012171617)&(df['roe']>10)&(df['inc_net_profit_year_on_year']>10)]
df.index=df['code']
# print(df)

# 获取股票估值指标
df_valuation = get_fundamentals(query(valuation),statDate='2022')
df_valuation.index=df_valuation['code']

df['pe_ratio']=df_valuation['pe_ratio']
print(df)
df=df[df['pe_ratio']<50]
print(df)

image.png

实时更新股票数据

量化交易系统
image.png
代码实操
image.png
项目根目录创建说明文档
编写方法


def get_stock_list():
    """
    获取所有A股股票列表
    :return: stock_list
    """
    stock_list = list(get_all_securities(['stock']).index)
    return stock_list

def get_single_price(code,time_freq,start_date,end_date ):
    """
    获取单个股票行情数据
    :param code:
    :param time_freq:
    :param start_date:
    :param end_date:
    :return:
    """
    data = get_price(code, start_date=start_date,end_date=end_date, frequency=time_freq, panel=False)
    return data


def export_data(data,filename,type):
    """
    导出股票相关数据
    :param data:
    :param filename:
    :param type: 股票数据类型,可以是:price、finance
    :return:
    """
    file_root='/data/price/'+type+'/'+filename+'.csv'
    data.to_csv(file_root)
    print('已成功存储至:',file_root)


def transfer_price_freq(data,time_freq):
    """
    将数据转换为指定周期:开盘价(周期第一天)、收盘价(周期最后一天)、最高价(周期内)、最低价(周期内)
    :param data:
    :param time_freq:
    :return:
    """
    df_trans = pd.DataFrame()
    df_trans['open']=data['open'].resample(time_freq).first()
    df_trans['close']=data['close'].resample(time_freq).last()
    df_trans['high']=data['high'].resample(time_freq).max()
    df_trans['low']=data['low'].resample(time_freq).min()

    return df_trans


def get_single_finance(code,date,statDate):
    """
    获取单个股票财务指标
    :param code:
    :param date:
    :param statDate:
    :return:
    """
    data = get_fundamentals(query(indicator).filter(indicator.code==code),date=date,statDate=statDate)
    return data


def get_single_valuation(code,date,statDate):
    """
    获取单个股票估值指标
    :param code:
    :param date:
    :param statDate:
    :return:
    """
    data = get_fundamentals(query(valuation).filter(valuation.code == code), date=date, statDate=statDate)
    return data

实战

import Stock as st
# 初始化变量
code = '000001.XSHG'
# 调用一只股票的行情数据
data = st.get_single_price(code=code,
                           time_freq='daily',
                           start_date='2023-02-01',
                           end_date='2023-03-01')
# 存入CSV
st.export_data(data=data,filename=code,type='price')

print(data)

image.png
添加一个读取方法

def get_csv_data(code,type):
    file_root = data_root+type+'/'+code+'.csv'
    return pd.read_csv(file_root)

改写后的类

import time
import  pandas as pd
from jqdatasdk import *
import datetime
auth('18974724932','Qq304520434')
# pd.set_option('display.max_columns',1000)

# 全局变量
data_root = 'C:/Users/30452/Desktop/PYS/DeltaTrader/data/'

def get_stock_list():
    """
    获取所有A股股票列表
    :return: stock_list
    """
    stock_list = list(get_all_securities(['stock']).index)
    return stock_list

def get_single_price(code,time_freq,start_date,end_date ):
    """
    获取单个股票行情数据
    :param code:
    :param time_freq:
    :param start_date:
    :param end_date:
    :return:
    """
    data = get_price(code, start_date=start_date,end_date=end_date, frequency=time_freq, panel=False)
    return data


def export_data(data,filename,type):
    """
    导出股票相关数据
    :param data:
    :param filename:
    :param type: 股票数据类型,可以是:price、finance
    :return:
    """
    file_root=data_root+type+'/'+filename+'.csv'
    data.to_csv(file_root)
    print('已成功存储至:',file_root)

def get_csv_data(code,type):
    file_root = data_root+type+'/'+code+'.csv'
    return pd.read_csv(file_root)


def transfer_price_freq(data,time_freq):
    """
    将数据转换为指定周期:开盘价(周期第一天)、收盘价(周期最后一天)、最高价(周期内)、最低价(周期内)
    :param data:
    :param time_freq:
    :return:
    """
    df_trans = pd.DataFrame()
    df_trans['open']=data['open'].resample(time_freq).first()
    df_trans['close']=data['close'].resample(time_freq).last()
    df_trans['high']=data['high'].resample(time_freq).max()
    df_trans['low']=data['low'].resample(time_freq).min()

    return df_trans


def get_single_finance(code,date,statDate):
    """
    获取单个股票财务指标
    :param code:
    :param date:
    :param statDate:
    :return:
    """
    data = get_fundamentals(query(indicator).filter(indicator.code==code),date=date,statDate=statDate)
    return data


def get_single_valuation(code,date,statDate):
    """
    获取单个股票估值指标
    :param code:
    :param date:
    :param statDate:
    :return:
    """
    data = get_fundamentals(query(valuation).filter(valuation.code == code), date=date, statDate=statDate)
    return data

读取数据

# 从csv中获取数据
data=st.get_csv_data(code=code,type='price')
print(data)

image.png
修复日期列名为 Unnamed:0

def export_data(data,filename,type):
    """
    导出股票相关数据
    :param data:
    :param filename:
    :param type: 股票数据类型,可以是:price、finance
    :return:
    """
    file_root=data_root+type+'/'+filename+'.csv'
    data.index.names=['Date']
    data.to_csv(file_root)
    print('已成功存储至:',file_root)

重新保存csv
image.png
将to_csv方法加上mode='a’参数可实现新数据追加到csv文件

data.to_csv(file_root,mode='a')
文章来源:https://blog.csdn.net/weixin_42403632/article/details/135827543
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。