100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python量化实战(一):银行板块低估值选股策略

Python量化实战(一):银行板块低估值选股策略

时间:2019-01-09 01:15:10

相关推荐

Python量化实战(一):银行板块低估值选股策略

本项目的核心思路:根据pe ratio对股票进行分组,分组之后等权重投资低估值的股票,再平衡日为每月最后一天。

Contents

1 获取并处理数据1.1 获取数据1.2 数据整理

1 获取并处理数据

注:本项目使用的全部数据来自Tushare社区(id=570231):Tushare社区

1.1 获取数据

1.首先,我们安装一下Tushare库

pip install tushare

2.调用API之前,进行必要的初始化设置

import tushare as ts # 导入Tusharemy_token = '你的Token'pro = ts.pro_api(my_token)

3.获取A股所有股票的基本信息,包括:股票代码、股票名称、所在地、行业等最基本的信息

all_stock_basic_infos = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code, symbol, name, area, industry, list_date')all_stock_basic_infos # 查看一下刚刚获取到的数据

4.获取银行股票的基本信息

bank_stock_basic_infos = all_stock_basic_infos[all_stock_basic_infos['industry'] == '银行']bank_stock_basic_infos

拿到的数据长这样:

5.接下来,我们获取所有银行股票的日线行情数据

(1)先拿到所有银行股票代码的一个list

all_bank_stock_code = bank_stock_basic_infos['ts_code'].tolist()print(all_bank_stock_code)

拿到的list输出如下所示:

(2)然后我们定义一个函数,随后使用for循环遍历all_bank_stock_code,获取到全部银行股的日线数据

bank_stock_daily = pd.DataFrame() # 创建一个空的DataFrame,用于保存最后获得的银行股行情数据# 定义一个函数,用于获取个股行情def get_stock_daily(stock_code):"""获取个股日线行情数据:param stock_code: 传入一个股票代码:return: 以DataFrame形式返回股票日线行情数据"""df1 = pro.daily(ts_code=stock_code)if len(df1) == 6000: # 每次最多获取6000条数据time.sleep(1.6)df2 = pro.daily(ts_code=stock_code, end_date=df1['trade_date'].to_list()[-1])df2 = df2.iloc[1:, :]df1 = pd.concat([df1, df2], axis=0, ignore_index=True)return df1if len(df1) < 6000:return df1# for循环调用API获取银行股票日线数据for i in all_bank_stock_code:df1 = get_stock_daily(i)bank_stock_daily = pd.concat([bank_stock_daily, df1], axis=0, ignore_index=True)time.sleep(1.6)

这里一定要注意一下,我们每次最多只能获取6000条数据,考虑到有些股票历史行情数据明显超过6000条,因此在写这个函数时特意添加了一个判断语句。

至此,我们拿到了所有银行股票的日线行情数据,如下图所示,大概90000多条数据:

(3)获取复权因子,计算后复权行情,本项目回测基于后复权行情。

fuquan_factor = pd.DataFrame()def get_adj_factor(stock_code):"""获取复权因子:param stock_code:传入股票代码:return: 返回DataFrame,包含复权因子信息"""df1 = pro.adj_factor(ts_code=stock_code)if len(df1) == 6000: # 每次最多获取6000条数据time.sleep(1.6)df2 = pro.adj_factor(ts_code=stock_code, end_date=df1['trade_date'].to_list()[-1])df2 = df2.iloc[1:, :]df1 = pd.concat([df1, df2], axis=0, ignore_index=True)return df1if len(df1) < 6000:return df1# for循环调用API获取银行股票日线数据for i in all_bank_stock_code:df1 = get_adj_factor(i)fuquan_factor = pd.concat([fuquan_factor, df1], axis=0, ignore_index=True)time.sleep(1.8)fuquan_factor

就这样,我们拿到了所有银行股票的复权因子。

之后,我们合并一下这两个DataFrame,方便计算后复权数据

bank_stock_daily_merged = pd.merge(bank_stock_daily, fuquan_factor, on=['ts_code', 'trade_date'], how='left')bank_stock_daily_merged

合并之后的数据是这样的

现在我们计算后复权行情

bank_stock_daily_merged['closeAdj'] = bank_stock_daily_merged['close'] * bank_stock_daily_merged['adj_factor']bank_stock_daily_merged['openAdj'] = bank_stock_daily_merged['open'] / bank_stock_daily_merged['close'] * bank_stock_daily_merged['closeAdj']bank_stock_daily_merged['highAdj'] = bank_stock_daily_merged['high'] / bank_stock_daily_merged['close'] * bank_stock_daily_merged['closeAdj']bank_stock_daily_merged['lowAdj'] = bank_stock_daily_merged['low'] / bank_stock_daily_merged['close'] * bank_stock_daily_merged['closeAdj']bank_stock_daily_merged # 后复权行情

就这样,我们获得了所有银行股的日线行情数据。

6.获取所有银行股票每日的基本面指标,用于最终的选股,话不多说上代码

bank_stock_daily_basic = pd.DataFrame()def get_stock_daily_basic(stock_code):"""获取股票每日的基本面数据:param stock_code: 股票代码:return: 返回基本面DataFrame"""df1 = pro.daily_basic(ts_code=stock_code)if len(df1) == 5600: # 每次最多获取5600条数据time.sleep(1.6)df2 = pro.daily_basic(ts_code=stock_code, end_date=df1['trade_date'].to_list()[-1])df2 = df2.iloc[1:, :]df1 = pd.concat([df1, df2], axis=0, ignore_index=True)return df1if len(df1) < 5600:return df1# for循环调用API获取银行股票日线数据for i in all_bank_stock_code:df1 = get_stock_daily_basic(i)bank_stock_daily_basic = pd.concat([bank_stock_daily_basic, df1], axis=0, ignore_index=True)time.sleep(1.8)bank_stock_daily_basic

如此,我们拿到了所有银行股票的日线基本面数据,包括:换手率、pe、pb、ps等等指标。

7.最后,我们在拉一个沪深300指数和中证银行指数,留作比较基准。

hs300 = pro.index_daily(ts_code='000300.SH')hs300 = hs300[['trade_date', 'close']] # 只需要用到收盘价即可hs300.rename(columns={'close': '000300.SH'}, inplace=True)zzyy = pro.index_daily(ts_code='399986.CSI')zzyy = zzyy[['trade_date', 'close']] # 只需要用到收盘价即可zzyy.rename(columns={'close': '399986.CSI'}, inplace=True)bank_index_daily = pd.merge(hs300, zzyy, on=['trade_date'], how='inner', sort=True) # 合并数据bank_index_daily

这样,我们拿到了两个指数的收盘价数据

至此,我们拿到了本项目需要用到的全部原始数据

1.2 数据整理

在此,我们把拿到的银行股票的基本面数据整理一下,转换一下周期拿到月线数据,用于回测。

df = bank_stock_daily_basic.groupby(by=['ts_code']).resample('M').last()df

那先到这里了,数据已经全部拿到,回头更回测篇啦。

喜欢的话欢迎点赞+关注。另外,我日后也会定期更一些技术指标实现、量化交易策略等等,敬请期待吧!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。