python+tushare pro 过滤ST、停牌、创业板及科创板 多因子操作

# 6 获得每只股票的得分后将得分最高的20只股票的信息以excel的格式保存到本地
# 上证指数:000001.SH          深成指:399001.SZ       沪深300399300    中证500399500
import pandas as pd

import matplotlib.pyplot as plt

import tushare as ts

import numpy as np

import time

stmp = time.localtime()

ts.set_token('')
pro=ts.pro_api()

sts = []
cys = []
kcs = []
all_stock = []

# 1 选出A股中有股票(排除ST,创业板,科创板,上市时间短于两年的) 
# 2 剔除停牌股票
# 利用正则表达式剔除ST和*ST股
data = pro.query('stock_basic', exchange='', list_status='L', \
fields='ts_code,symbol,name,area,industry,list_date')
# 剔除出包含ST的股票
st_data = data[data.name.str.contains('ST')]    
sts = st_data['name'].values.tolist() 
for st in sts:
	data = data.drop(index=(data.loc[(data['name'] == st)].index))

#剔除出创业板的股票
cy_data = data[data.ts_code.str.contains('^30')]  
cys = cy_data['ts_code'].values.tolist()  
for cy in cys:
	data = data.drop(index=(data.loc[(data['ts_code'] == cy)].index))
	
# 剔除出科创板的股票
kc_data = data[data.ts_code.str.contains('^68')]    
kcs = kc_data['ts_code'].values.tolist()  
for kc in kcs:
	data = data.drop(index=(data.loc[(data['ts_code'] == kc)].index))

# 剔除上市时间短于2年的
data = data[data['list_date']<'20181113']

# 获取当天日期 剔除停牌股
now_time = time.strftime('%Y%m%d',stmp)
tp_df = pro.suspend_d(suspend_type = 'S', trade_date = now_time)
tp_list = tp_df['ts_code'].values.tolist()
for tp in tp_list:
	data = data.drop(index=(data.loc[(data['ts_code'] == tp)].index))

# 3 只获取总市值50亿至500亿的股票    总市值单位是万元
all_stock = data['ts_code'].values.tolist()

hsl_list = []
code_list = []

for num in range(100):

	df = pro.daily_basic(ts_code = all_stock[num], trade_date='20201113', fields=\
		'ts_code,trade_date,turnover_rate,total_mv')

	if int(df['total_mv']) < 500000 or  int(df['total_mv']) > 5000000:
		all_stock.remove(all_stock[num])
# 4 用换手率排名降序排列获得前200只股票
	else:
		code_list.append(df['ts_code'][0])
		hsl_list.append(df['turnover_rate'][0])
		
print(len(code_list))
print(len(hsl_list))

hsl_df = pd.DataFrame()
hsl_df['ts_code'] = code_list
hsl_df['turnover_rate'] = hsl_list

hsl_df = hsl_df.sort_values(by = 'turnover_rate',ascending = False)

hsl_df = hsl_df.head(50)

# 5 利用下列指标计算股票池中的平均值,将每只股票的值与之对比优于平均值的得1分,低于平均值得不计分
# 		roa_dp总资产净利率	debt_to_assets资本负债率		nca_to_assets非流动资产比率	
# 		cogs_of_sales销售成本率 	
ts_code_list = []
roa_dp_list = []
debt_to_assets_list = []
nca_to_assets_list = []
cogs_of_sales_list = []

caiwu_fenxis = hsl_df['ts_code'].values.tolist()
print(caiwu_fenxis)

num = 0
 
for caiwu_fenxi in caiwu_fenxis:
	df1 = pro.fina_indicator(ts_code = caiwu_fenxi,start_date='20200101', end_date='20201114',\
	fields='ts_code,end_date,roa_dp,debt_to_assets,nca_to_assets,cogs_of_sales')
	df1 = df1.head(1)

	ts_code_list.append(df1['ts_code'][0])
	roa_dp_list.append(df1['roa_dp'][0])
	debt_to_assets_list.append(df1['debt_to_assets'][0])
	nca_to_assets_list.append(df1['nca_to_assets'][0])
	cogs_of_sales_list.append(df1['cogs_of_sales'][0])

cai_wu_fen_xi_qian200 = pd.DataFrame()
cai_wu_fen_xi_qian200['ts_code'] = ts_code_list 
cai_wu_fen_xi_qian200['roa_dp'] = roa_dp_list
cai_wu_fen_xi_qian200['debt_to_assets'] = debt_to_assets_list
cai_wu_fen_xi_qian200['nca_to_assets'] = nca_to_assets_list
cai_wu_fen_xi_qian200['cogs_of_sales'] = cogs_of_sales_list

cai_wu_fen_xi_qian200.to_excel('财务分析.xlsx')

all_stock_code = cai_wu_fen_xi_qian200['ts_code'].values.tolist()

cai_wu_fen_xi_qian200['score'] = ''	

mean_roa_dp = cai_wu_fen_xi_qian200['roa_dp'].sum()/len(cai_wu_fen_xi_qian200['roa_dp'])

mean_debt_to_assets = cai_wu_fen_xi_qian200['debt_to_assets'].sum()/len(cai_wu_fen_xi_qian200['debt_to_assets'])

mean_nca_to_assets = cai_wu_fen_xi_qian200['nca_to_assets'].sum()/len(cai_wu_fen_xi_qian200['nca_to_assets'])

mean_cogs_of_sales = cai_wu_fen_xi_qian200['cogs_of_sales'].sum()/len(cai_wu_fen_xi_qian200['cogs_of_sales'])

for num in range(len(all_stock_code)):
	cai_wu_fen_xi_qian200['score'][num] = 0 
	if cai_wu_fen_xi_qian200['roa_dp'][num] > mean_roa_dp:
		cai_wu_fen_xi_qian200['score'][num] += 1
	
	if cai_wu_fen_xi_qian200['debt_to_assets'][num] < mean_debt_to_assets:
		cai_wu_fen_xi_qian200['score'][num] += 1
	
	if cai_wu_fen_xi_qian200['nca_to_assets'][num] < mean_nca_to_assets:
		cai_wu_fen_xi_qian200['score'][num] += 1
		
	if cai_wu_fen_xi_qian200['cogs_of_sales'][num] < mean_cogs_of_sales:
		cai_wu_fen_xi_qian200['score'][num] += 1

cai_wu_fen_xi_qian200 = cai_wu_fen_xi_qian200.sort_values(by = 'score' , ascending = False)

cai_wu_fen_xi_qian200 = cai_wu_fen_xi_qian200.head(20)

cai_wu_fen_xi_qian200.to_excel('前20名得分.xlsx')	

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhaojieming1990

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值