量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

 

 

烟蒂股是对于实际价值高于市场估计价值的上市公司股票的一种代称。这种股票的最大特点就是由于特定环境下的市场作用,其市场股值表现较低,股价十分低廉,花很少钱就可以买到。

其中巴菲特的第一桶金就是在“烟蒂股”上赚取的。

策略思路:

 

可能用到库:

import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import tushare as ts
import warnings; warnings.simplefilter('ignore') #忽略可能会出现的警告信息,警告并不是错误,可以忽略;

1、获取沪深300股票代码列表

hs300 = ts.get_hs300s()['code'].tolist()        #tolist():把数据转成list;

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

2、获取基本面数据

stock_basics = ts.get_stock_basics()
stock_basics.reset_index(inplace=True)      #reset_index重置dataFrame的索引
stock_basics.head()

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

3、从stcok_basics这张大表格里面把hs300的这300只股票代码给挑选出来(流动性好)

data1 = stock_basics.loc[stock_basics['code'].isin(hs300),        
                         ['code', 'name', 'industry', 'pe', 'pb', 'esp','rev', 'profit',]]
data1.columns = ['代码','名称', '行业', 'PE', 'PB', 'EPS', '收入%', '利润%']

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

4、获取盈利能力数据

stock_profit = ts.get_profit_data(2017,1)
data2 = stock_profit.loc[stock_profit['code'].isin(hs300), 
                        ['code', 'roe', 'gross_profit_rate', 'net_profit_ratio']]
data2.columns = ['代码', 'ROE', '毛利率', '净利率']
data2 = round(data2,2)    # 精确到小数点后2位
data2.head()

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

5、获取成长能力数据(nprg:净利润增长率(%)  nav:净资产增长率)

stock_growth = ts.get_growth_data(2017,1)
data3 = stock_growth.loc[stock_growth['code'].isin(hs300), ['code', 'nprg']]
data3.columns = ['代码', 'NI%', ]
data3 = round(data3,2)
data3.head()

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

6、data1、data2、data3,3表数据合并

from functools import reduce

# 数据合并
merge = lambda x,y: pd.merge(x, y, how='left', on='代码')     #定义了merge函数;
data = reduce(merge, [data1, data2, data3])
data.drop_duplicates(inplace=True)           #去除重复数据;
data.head()

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

4、插入烟蒂值,这里用估值系数:(烟蒂值=PE*PB)

data['估值系数'] = data['PE'] * data['PB']
data = round(data,2)
data.head(5)

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析

5、选股条件,并且按选定字段对数据进行排序

data_filtered = data.loc[(data['估值系数'] < 60) & (data['ROE'] > 5),
                     ['代码', '名称', 'PE', 'PB', '估值系数', 'ROE', '收入%']]
data_filtered.sort_values(['估值系数'], ascending=True, inplace=True)    # sort_values具体实战应用;
data_filtered.head(10)

量化金融分析AQF(8):Tushare爬取数据、 烟蒂系数选股条件分析