# 6 获得每只股票的得分后将得分最高的20只股票的信息以excel的格式保存到本地
# 上证指数:000001.SH 深成指:399001.SZ 沪深300:399300 中证500 :399500
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')
02-07
8983
