python量化交易第二章

一.什么是股票

1.1股票的由来
15世纪,海上贸易和殖民掠夺兴起,这是一条致富道路,西方国家诞生了一批又一批远洋航海家,也让善于出海贸易和掠夺的西方国家富裕起来。要组织远航贸易,就必须组建船队,需要巨额的资金,同时,远航经常会遭到海洋飓风和土著居民袭击的风险。当时,极少有人能拥有这样庞大的建队资金,和这样的风险承受能力。为了筹集远航资本和分摊风险,就出现了股份筹资,即在每次出航之前,寻找资金源,并形成按份入股的形态。航行结束后,将资本退给出资人,并将所获利润,按所出股金的比例进行分配。这就是股票的最初形态,源自远洋航海筹资方式。
1.2股票
股份公司发行的所有权凭证,一种投资工具,投资介质。
1.3股票的特性
股票:股份公司的所有权凭证,盈亏自负
基金:投资组合(股票,债券,现金)
债券:还本付息的有价证券(国债,企业债,金融债券)
风险:股票(10%)>基金(5%)>债券(1%)
收益:股票>基金>债券

二.使用JQData查询行情数据

2.1JQData
JQData是聚宽数据团队专门为金融机构、学术团体和量化研究者们提供的本地量化金融数据服务。使用JQData,可快速查看和计算金融数据,无障碍解决本地、Web、金融终端调用数据的需求。历经5年沉淀,40万宽客及数3500家知名量化机构投研交易验证。 使用上,JQData适用Windows、Mac、Linux多种操作系统,支持python2、python3和以及任意编程语言。
2.2安装使用JQData
(1)安装jqdatasdk包
(2)登录JQData:

from jqdatasdk import *
auth('ID','Password') #ID是申请时所填写的手机号;Password为聚宽官网登录密码

2.3获取股票行情数据

#get_price
get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None, panel=True, fill_paused=True)

参数名称 参数说明 注释
security 标的 可获取种类:股票、期货、基金、指数、期权
start_date 开始时间,不可与count同时使用。当’count’和’start_date’为None时, 默认值是 ‘2015-01-01 00:00:00’ 当指定frequency为minute时,如果只传入日期,则日内时间为当日的 00:00:00
end_date 结束时间,如无指定,默认为’2015-12-31 00:00:00’。需与start_date或count同时使用 当指定frequency为minute时, 如果只传入日期, 则日内时间为当日的 00:00:00,所以返回的数据不包括 end_date这天。
count 表示获取 end_date 之前几个 frequency 的数据,与start_date不可同时使用。 返回的结果集的行数, 即表示获取 end_date 之前count个 frequency 的数据
frequency 单位时间长度,即指定获取的时间频级为分钟级(minute)或日级(daily),也可以指定为 ‘3m’,‘10d’ 等 daily’(同’1d’), ‘minute’(同’1m’),
fields 所获取数据的字段名称,即表头。默认是None(返回标准字段[‘open’,‘close’,‘high’,‘low’,‘volume’,‘money’]) 可选择填入以下字段,字段说明可查阅下面fields表[‘open’,‘close’,‘low’,‘high’,‘volume’,‘money’,‘factor’,‘high_limit’,‘low_limit’,‘avg’,‘pre_close’,‘paused’,‘open_interest’],open_interest为期货持仓量
skip_paused 是否跳过不交易日期(含:停牌/未上市/退市后的日期) 如果不跳过, 停牌时会使用停牌前的数据填充,上市前或者退市后数据都为 nan。
fill_paused 对于停牌股票的价格处理,默认为True 默认为True,用pre_close价格填充);False 表示使用NAN填充停牌的股票价格。
fq 复权选项,默认为前复权(fq=‘pre’) ‘pre’:前复权 / ‘none’:不复权, 返回实际价格 / ‘post’:后复权
panel 指定返回的数据格式为panel 默认为True;指定panel=False时返回dataframe格式;

fields内各字段属性

字段名称 中文名称 注释
open 时间段开始时价格
close 时间段结束时价格
low 时间段中的最低价
high 时间段中的最高价
volume 时间段中的成交的股票数量 单位股
money 时间段中的成交的金额
factor pre’:前复权(默认)/None:不复权,返回实际价格/‘post’:后复权 前(后)复权数据=价格×前(后)复权因子;前(后)复权后的成交量=成交量 / 前(后)复权因子;成交额不处理
high_limit 时间段中的涨停价
low_limit 时间段中的跌停价
avg 时间段中的平均价 (1)天级别:股票是成交额除以成交量;期货是直接从CTP行情获取的,计算方法为成交额除以成交量再除以合约乘数;(2)分钟级别:用该分钟所有tick的现价乘以该tick的成交量加起来之后,再除以该分钟的成交量。
pre_close 前一个单位时间结束时的价格,按天则是前一天的收盘价 期货:pre_close–前一天结算;建议使用get_extras获取结算价;在分钟频率下pre_close=open
paused bool值,股票是否停牌; 停牌时open/close/low/high/pre_close;都等于停牌前的收盘价, volume=money=0

获取一支股票示例

#获取平安银行按1分钟为周期以“2015-01-30 14:00:00”为基础前4个时间单位的数据
df = get_price('000001.XSHE', end_date='2015-01-30 14:00:00',count=4, frequency='minute', fields=['open','close','high','low','volume','money'])
print(df)
                     open  close  high   low    volume      money
2015-01-30 13:57:00  8.98   8.97  8.98  8.97  295949.0  2656384.0
2015-01-30 13:58:00  8.97   8.97  8.98  8.97  339030.0  3041408.0
2015-01-30 13:59:00  8.98   8.98  8.98  8.96  459533.0  4121592.0
2015-01-30 14:00:00  8.98   8.97  8.98  8.96  469211.0  4208384.0

get_all_securities 所有标的信息(股票、基金、指数、期货等)

get_all_securities(types=[], date=None)

参数

types: list: 用来过滤securities的类型, list元素可选: ‘stock’, ‘fund’, ‘index’, ‘futures’, ‘etf’, ‘lof’, ‘fja’, ‘fjb’。types为空时返回所有股票, 不包括基金,指数和期货
date: 日期, 一个字符串或者 [datetime.datetime]/[datetime.date] 对象, 用于获取某日期还在上市的股票信息. 默认值为 None, 表示获取所有日期的股票信息
返回 [pandas.DataFrame], 比如:
get_all_securities()[:2]

display_name name start_date end_date type
000001.XSHE 平安银行 PAYH 1991-04-03 9999-01-01 stock
000002.XSHE 万 科A WKA 1991-01-29 9999-01-01 stock
  • display_name: 中文名称
  • name: 缩写简称
  • start_date: 上市日期
  • end_date: 退市日期,如果没有退市则为2200-01-01
  • type: 类型,stock(股票),index(指数),etf(ETF基金),fja(分级A),fjb(分级B),fjm(分级母基金),mmf(场内交易的货币基金)open_fund(开放式基金),
    bond_fund(债券基金), stock_fund(股票型基金), QDII_fund(QDII 基金),
    money_market_fund(场外交易的货币基金), mixture_fund(混合型基金), options(期权)
#获取所有A股的行情数据
stocks = list(get_all_securities(['stock']).index)
print(stocks)
#如何获取股票行情数据
for stock_code in stocks:
    print("正在获取股票行情数据,股票代码:",stock_code)
    df=get_price(stock_code,count=10,end_date='2022-01-22',frequency='daily',panel=False)
    print(df)
    time.sleep(3)

三.使用resample函数转化时间序列

#转换周期:日K转换为周K
df = get_price('000001.XSHE', start_date='2021-01-01',end_date='2021-12-31', frequency='daily', panel=False)
df['weekday']=df.index.weekday#获取日K
print(df)
#获取周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()
print(df_week)
#汇总统计:统计一下月成交量,成交额(sum)
df_week['volume(sum)']=df['volume'].resample('W').sum()
df_week['volume(sum)']=df['volume'].resample('W').sum()
print(df_week)

四.使用JQData查询财务指标

4.1什么是财务指标

财务报表包括:资产负债表,利润表,现金流量表

  • 资产负债表:体现企业家底和负债情况
  • 利润表:公司盈利能力,赚了多少,怎么赚的,隐含着对未来利润增长的预期,体现市场空间,成长能力
  • 现金流量表:权责发生制VS收付实现制,体现造血能力,竞争优势,议价优势
'''获取股票财务指标'''
df=get_fundamentals(query(indicator),statDate='2020')#获取财务指标数据

df.to_csv('D:/python project/pythonProject/data/finance/finanace2020.csv')#存储数据
print(df)
#基于盈利指标选股:eps,operating_profit,roe,inc_net_profit_year_on_year
df=df[(df['eps']>0)&(df['operating_profit']>2212173617)&(df['roe']>11)&(df['inc_net_profit_year_on_year']>10)]
print(df)

五.使用JQData查询估值指标

5.1估值方法

  • 绝对估值法:定价模型—>计算企业的内在价值
  • 相对估值法:PE市盈率,PB市净率,PS市销率

市值数据
每天更新
表名: 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) 每股股价与每股净资产的比率 市净率=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/归属母公司股东的权益。
ps_ratio 市销率(PS, TTM) 市销率为股票价格与每股销售收入之比,市销率越小,通常被认为投资价值越高。 市销率TTM=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/营业总收入TTM
pcf_ratio 市现率(PCF, 现金净流量TTM) 每股市价为每股现金净流量的倍数 市现率=(股票在指定交易日期的收盘价 * 截至当日公司总股本)/现金及现金等价物净增加额TTM
'''获取股票估值指标'''
df=get_fundamentals(query(valuation),statDate=datetime.datetime.today())
print(df)
'''获取股票财务指标'''
df=get_fundamentals(query(indicator),statDate='2020')#获取财务指标数据
df.to_csv('D:/python project/pythonProject/data/finance/finanace2020.csv')#存储数据
#基于盈利指标选股:eps,operating_profit,roe,inc_net_profit_year_on_year
df=df[(df['eps']>0)&(df['operating_profit']>2212173617)&(df['roe']>11)&(df['inc_net_profit_year_on_year']>10)]
df.index=df['code']
#print(df.head())
'''获取股票估值指标'''
df_valuation=get_fundamentals(query(valuation),statDate=datetime.datetime.today())
df_valuation.index=df_valuation['code']
#print(df_valuation.head())
df['pe_ratio']=df_valuation['pe_ratio']
df=df[df['pe_ratio']<50]
print(df)

六.实时更新股票数据

6.1量化交易系统
量化交易平台功能模块

行情记录与历史数据 交易策略与回测模块 交易数据管理与查询
标的信息 择时策略 委托管理
行情记录 选股策略 持仓管理
历史记录 止盈止损策略 资金管理
数据导出 数据回测 收益管理
图表可视化 图表可视化 图表可视化

6.2代码实操
函数:

  • def 获取所有A股股票列表
  • def 获取当个股票行情数据
  • def 导出股票行情数据
  • def 转换股票行情周期
  • def 获取单个股票估值指标
import time

import pandas as pd
#全局变量:
data_root='D:/python project/pythonProject/data/'
#000002.XSHE 	万 科A 000001.XSHE 平安银行
from jqdatasdk import *
auth('15608617235','Xwt688698')  #账号是申请时所填写的手机号;密码为聚宽官网登录密码
pd.set_option('display.max_rows',1000000)
pd.set_option('display.max_columns',10000)
import datetime

def get_stock_list():
    """
     获取所有A股股票列表
    :return: stock_list
    """
    stocks_list= list(get_all_securities(['stock']).index)
    return stocks_list
def get_single_stock_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 exoprt_data(data,filename,type):
    """
    导出股票相关数据
    :param data:
    :param data:股票数据类型,可以是:price,finance
    :param filename:
    :return:
    """
    file_root=data_root+type+'/'+filename+'.csv'
    data.index.names=['date']
    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:
    """
    #获取周K(当周的):开盘价(当周第一天),收盘价(当周最后一天),最高价(当周),最低价(当周)
    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_signle_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


七.实战:创建股票数据库

  • 调用stock:创建example模块->stock脚本->获取数据
  • 实时获取:获取日k数据,循环获更新
#调用一只股票的行情数据
code='000001.XSHG'
data=st.get_single_stock_Price(code=code,time_freq='daily',start_date='2021-02-01',end_date='2021-03-01')
#存入csv
st.exoprt_data(data=data,filename=code,type='price')
print(data)
#从csv中获取数据
data=st.get_csv_data(code=code,type='price')
print(data)

猜你喜欢

转载自blog.csdn.net/weixin_43853077/article/details/122763534