股票的由来
股票:股份公司发行的所有权凭证、一种投资工具、投资介质
股票的特性
股票:股份公司的所有权凭证、盈亏自负
基金:投资组合(股票、债券、现金)
债券:还本付息的有价证券(国债、企业债、金融债券)
风险
股票>基金>债券
收益
股票>基金>债券
爬虫、数据服务商、免费接口
https://www.joinquant.com/data
注册账号提交使用申请
https://www.joinquant.com/user/login/index?redirect=/default/index/sdk#jq-sdk-apply
申请试用
https://www.joinquant.com/default/index/sdk#jq-sdk-apply
按照教程
https://www.joinquant.com/help/api/doc?name=logon&id=9823
安装库
pip install jqdatasdk -i https://pypi.tuna.tsinghua.edu.cn/simple
获取数据
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)
Python数据分析库Pandas方法函数
用于转换时间序列的频次
代码
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)
财务指标
资产负债表:体现企业家底和负债情况
利润表:公司盈利能力、赚了多少、怎么赚的 隐含着对未来利润增长的预期 体现市场空间、成长能力
现金流量表:权责发生制vs收付实现制
打开文档搜索财务数据
例子:
df = get_fundamentals(query(indicator),statDate='2022')
print(df)
df.to_csv('finance2022.csv')
获取数据 将数据保存为CSV
列名 | 列的含义 | 解释 |
---|---|---|
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%。 |
选股
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)
对企业进行估值的方法:绝对估值、相对估值
定价模型:计算企业的内在价值
估值指标:PE市盈率、PB市净率、PS市销率
使用get_fundamentals(query(valuation),date),指定date为某一交易日,获取该交易日的估值数据
列名 | 列的含义 | 解释 | 公式 |
---|---|---|---|
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)
将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)
量化交易系统
代码实操
项目根目录创建说明文档
编写方法
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)
添加一个读取方法
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)
修复日期列名为 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
将to_csv方法加上mode='a’参数可实现新数据追加到csv文件
data.to_csv(file_root,mode='a')