一沸伏、選股的需求
- 上市日期在給定之日之后
- 最近N個交易日成交額大于給定值
- 大股東質(zhì)押率不大于給定值
- 歸母利潤達到指定值
- 上一年的年報審計意見為正常
- 最近沒有停牌
二糕珊、選股常見方式
- 一鍵式選股:各種金融終端里面的自定義條件
- 自編公式選股:tongdaxin里面自編公式,引用專業(yè)財務(wù)數(shù)據(jù)
- winq選股:
- 量化API選股:
三毅糟、如何選擇
- 研究階段的選擇:用一鍵式红选,自編公式選股
- 模型穩(wěn)定后,用winq來綜合實現(xiàn)(后期可以直接移植到wind量化接口下)
- 其他量化接口選股
四姆另、winq選股的實現(xiàn)例子
連接服務(wù)器
#連接服務(wù)器
from WindPy import *
w.start(); #命令超時時間為 120 秒
print('連接狀態(tài):' ,w.isconnected())
w.start(); #命令超時時間設(shè)置成 60
獲取A股列表
import datetime
#獲取當前的日期
today_date = datetime.date.today().isoformat() #str類型喇肋,iso格式:2020-01-01
print("當前時間為:",today_date)
#讀取A股股票列表
a_stocks = w.wset("sectorconstituent", f"date={today_date};sectorId=a001010100000000", usedf=True)
#錯誤代碼處理
err_code = a_stocks[0]
#print(f"err_code = {err_code}")
if err_code != 0:
raise ValueError(f"讀取A股股票列表,出錯迹辐,錯誤代碼:{err_code}")
a_stock_df = a_stocks[1]
"""
格式:
===========a_stock_df:dataFrame=============
date wind_code sec_name
-------------------------------------------------
1 2020-02-25 00:00:00.005 000001.SZ 平安銀行
2 2020-02-25 00:00:00.005 000002.SZ 萬科A
"""
a_stock_list = a_stock_df.wind_code.values.tolist()
print(f"讀取的股票代碼數(shù)量為:{len(a_stock_list)}")
#print(f"type of a_stock_list is {type(a_stock_list)}")
print("代碼的格式如下:",a_stock_list[-1:])
today = '20210914' #日期 年【----】月【--】日【--】 總計8個數(shù)字
sjnb_date = '20201231' #審計年報的讀入日期 '####1231'-該年年報讀取日期蝶防,目前尚無2019年的年報審計意見,遂明吩,讀取上一年的年報審計意見
函數(shù)定義
import pandas as pd
#獲取大股東累計質(zhì)押數(shù)占持股數(shù)比例
def get_dagudong_zhiya_zhanbi(stock_code:str,deal_date:str):
"""
功能:獲取大股東累計質(zhì)押數(shù)占持股數(shù)比例
參數(shù):
stock_code:股票代碼,包含市場后綴间学,可以是一只或者多只股票 eg. 一只 '002157.SZ' 多只 ['002157.SZ','600797.SH']
deal_date:交易日期 eg. '20191106'
return:df
==========================
大股東質(zhì)押占比
002157.SZ 80.841848
600797.SH 76.293443
==========================
"""
dd = w.wss(stock_code, "share_pledgeda_pct_largestholder", f"tradeDate={deal_date}", usedf=True)
df = dd[1]
df.columns = ['大股東質(zhì)押占比']
df['大股東質(zhì)押占比'] = df.apply(lambda r: 0 if r['大股東質(zhì)押占比']==None else r['大股東質(zhì)押占比'],axis = 1) #單獨查詢一只股,占比為0時印荔,返回None的處理
df = df.fillna(0) #查詢多只股低葫,占比為0時,返回NaN
return df
"""
#=========test code=============
stock_code = ['002157.SZ','600797.SH']
deal_date = '20191106'
mydf =get_dagudong_zhiya_zhanbi(stock_code,deal_date)
mydf
"""
#獲取財報的 [歸屬母公司的凈利潤]
def get_guishu_mugongsi_jinglirun(stock_code:str,deal_date:str):
"""
功能:歸屬母公司的凈利潤
參數(shù):
stock_code:股票代碼,包含市場后綴仍律,可以是一只或者多只股票 eg. 一只 '002157.SZ' 多只 ['002157.SZ','600797.SH']
deal_date:交易日期 eg. '20191106'
**萬礦是取每個季度最后一天作為報告期嘿悬,如取2017年的四個定期報告數(shù)據(jù),那報告期設(shè)置分別為 :一季報:2017-03-31水泉,半年報:2017-06-30善涨,三季報:2017-09-30窒盐,年報:2017-12-31
return:df
=============================
歸屬母公司的凈利潤
600352.SH 4.814994e+09
==============================
"""
dd = w.wss(stock_code, "netprofit_ttm", f"tradeDate={deal_date}", usedf=True)
df = dd[1]
df.columns = ['歸屬母公司的凈利潤']
df['歸屬母公司的凈利潤'] = df['歸屬母公司的凈利潤'].astype('float')
return df
"""
#===========test code=============
stock_code = ['600352.SH','000001.SZ']
deal_date = '20181231'
my_df = get_guishu_mugongsi_jinglirun(stock_code,deal_date)
display(my_df)
"""
#獲取股票的上市日期
def get_shangshi_date(stockCodes):
"""
功能:獲取股票的上市日期
參數(shù):
stockCodes:股票列表 ['000001.SZ','600000.SH']
return:df,
===========================================
上市日期
000001.SZ 1991-04-03 00:00:00.005
600000.SH 1999-11-10 00:00:00.005
===========================================
"""
dd = w.wss(stockCodes, "ipo_date", "", usedf=True)
df = dd[1]
df.columns = ['上市日期']
return df
"""
#==============test code===============
stockCodes = ['000001.SZ','600000.SH']
df = get_shangshi_date(stockCodes)
df
"""
#得到某些股票的N日成交額
def get_amount_nDays(stockCodes:list,days:int,tradeDate:str):
"""
功能:得到某些股票的N日成交額
參數(shù):
stockCodes:要查詢的股票列表
days:N日成交額中的N,往前推的交易天數(shù)钢拧,days = 1 蟹漓,表示往前推一天,連同當天(tradeDate)娶靡,則有兩個交易日
tradeDate:查詢的日期
return df
===========================
N日成交額
000001.SZ 3.669349e+10
600000.SH 1.619291e+10
===========================
"""
dd = w.wss(stockCodes, "amt_nd", f"days=-{days};tradeDate={tradeDate}", usedf=True)
df = dd[1]
df.columns = ["N日成交額"]
return df
"""
#========test code=====================
stockCodes = ['000001.SZ','600000.SH']
days = 20
tradeDate = '20191111'
df = get_amount_nDays(stockCodes,days,tradeDate)
df
"""
#日期格式轉(zhuǎn)換:timestamp_str '2019-01-08 00:00:00.005' to str '20190108'
def timestamp_2_str(timestamp_str_date):
"""
功能:日期格式轉(zhuǎn)換:timestamp_str '2019-01-08 00:00:00.005' to str '20190108'
參數(shù):
timestamp_str_date:'2019-01-08 00:00:00.005'
return:string牧牢,20190108
"""
day1 = timestamp_str_date.split(' ')[0].split('-') #'2019','01','08'
day2 = f"{day1[0]}{day1[1]}{day1[2]}" #'20190108'
return day2
#日期用年數(shù)進行相減操作
import datetime
from dateutil.relativedelta import relativedelta
#給定日期減去指定年數(shù)后看锉,返回一個新日期
def substract_date_years(mydate:str,years_to_substract:int):
"""
功能:給定日期減去指定年數(shù)后姿锭,返回一個新日期
參數(shù):
mydate:str日期 eg. '20190101' '%Y%m%d'
years_to_substract:int要減去的年數(shù)
return:'%Y%m%d' '20180101'
備注:pandas矢量化操作有日期加減函數(shù)
"""
d = datetime.datetime.strptime(f"{mydate}", '%Y%m%d')
#print(d) # 2018-01-31 00:00:00
new_date = (d - relativedelta(years=years_to_substract)).strftime('%Y%m%d')
#print(new_date) # 20170131
return new_date
#獲取一個大盤交易日列表,作為交易日時間軸
def get_dapan_tradeday(dapan:str,begin_dapan_date:str,end_dapan_date:str):
"""
功能:獲取一個大盤交易日列表,作為交易日時間軸
參數(shù):
dapan:大盤代碼 eg. '000001.SH'#上證指數(shù)
begin_dapan_date:起始日期
end_dapan_date:結(jié)束日期
return:days , 交易日系列,string
"""
dd =w.wsd(dapan, "close", begin_dapan_date, end_dapan_date, "Fill=Previous", usedf=True)
df = dd[1]
df['日期'] = df.index
days = df['日期'].astype('str').values.tolist()
return days
"""
#=========test code=============
dapan = '000001.SH'#上證指數(shù)
begin_dapan_date = '2019-01-01'
end_dapan_date = '2019-11-10'
days = get_dapan_tradeday(dapan,begin_dapan_date,end_dapan_date)
"""
#審計意見類別
def get_shenjiyijian(stocks:list,date:str):
"""
功能:獲取給定股票的某期財務(wù)審計意見
參數(shù):
stocks:股票列表list
date:報告期 str
return:df
df的格式如下:
-----------------------
|審計意見類別
-----------------------
000001.SZ|標準無保留意見
600000.SH|標準無保留意見
-----------------------
"""
dd = w.wss(stocks, "stmnote_audit_category", f"rptDate={date};zoneType=1", usedf=True)
df = dd[1]
df.columns = ['審計意見類別']
return df
"""
#==========test code==============
stocks = ['600352.SH','000001.SZ']
date = '20181231'
DF = get_shenjiyijian(stocks,date)
DF
"""
ST股票處理
#st處理的函數(shù)
#獲取ST字典
def get_st_dict(df_st,st_start_date,st_end_date)->dict:
#df_st = pd.read_excel(file_path,converters={'代碼':str})
df_st['操作日期'] = pd.to_datetime(df_st['操作日期'])
#display(df_st)
#整理成字典
st_dict = {}
for name,df in df_st.groupby(['代碼']):
#print(name)
df = df.sort_values(['操作日期'])
df.index = range(len(df))
#display(df)
df_tmp = get_st_info(df,st_start_date,st_end_date)
#display(df_tmp)
st_dict[name] = df_tmp
print("停牌字典處理完畢伯铣!")
return st_dict
#====測試代碼====
file_path = 'C:/緩存數(shù)據(jù)/ST狀態(tài)合并表.xls'
df_st_dict = get_st_dict(file_path)
df_st_dict['600163']
#獲取st的信息
def get_st_info(df,st_start_date,st_end_date)->pd.DataFrame:
"""
注意事項:中間用到兩個日期常量呻此,需要設(shè)定
df:ST合并表:實施ST 和 撤銷ST
st_start_date:2020-01-01
st_end_date:2020-12-31
"""
lenth_df = len(df)
status_list = []
for idx in range(len(df)):
#print(idx)
op = df.at[idx,'操作']
op_date = df.at[idx,'操作日期']
#1、實施及撤銷操作前后的狀態(tài)處理
if op == '實施':
#print('實施')
#----實施前----
status_before_op = "正常"
if '*ST'in df.at[idx,'操作前簡稱']:
#print(f"操作前為:*ST")
status_before_op = "*ST"
else:
if 'ST' in df.at[idx,'操作前簡稱']:
#print(f"操作前為:ST")
status_before_op = "ST"
#----實施后----
status_after_op = "正常"
if '*ST'in df.at[idx,'操作后簡稱']:
#print(f"操作后為:*ST")
status_after_op = "*ST"
else:
if 'ST' in df.at[idx,'操作后簡稱']:
#print(f"操作后為:ST")
status_after_op = "ST"
if '退' in df.at[idx,'操作后簡稱']:
#print(f"操作后為:退")
status_after_op = "退"
elif op == '撤銷':
#print("撤銷")
#----撤銷前----
status_before_op = "正常"
if '*ST'in df.at[idx,'操作前簡稱']:
#print(f"操作前為:*ST")
status_before_op = "*ST"
else:
if 'ST' in df.at[idx,'操作前簡稱']:
#print(f"操作前為:ST")
status_before_op = "ST"
if '退' in df.at[idx,'操作前簡稱']:
#print(f"操作后為:退")
status_before_op = "退"
#----撤銷后----
status_after_op = "正常"
if '*ST'in df.at[idx,'操作后簡稱']:
#print(f"操作后為:*ST")
status_after_op = "*ST"
else:
if 'ST' in df.at[idx,'操作后簡稱']:
#print(f"操作后為:ST")
status_after_op = "ST"
if '退' in df.at[idx,'操作后簡稱']:
#print(f"操作后為:退")
status_after_op = "退"
#2腔寡、狀態(tài)對應(yīng)的時間段處理
if idx == 0: #當前為第一條記錄
#增加一段:起始日期到當前日期的狀態(tài)
start_date_1 = pd.to_datetime(st_start_date)
end_date_1 = op_date - pd.DateOffset(days = 1)
status_cur_1 = status_before_op
status_list.append([start_date_1,end_date_1,status_cur_1])
#當前日期及之后的狀態(tài)處理
start_date_2 = op_date
if idx < lenth_df - 1: #不是最后一條記錄焚鲜,日期取下一次操作的日期
end_date_2 = op_date = df.at[idx + 1,'操作日期']
end_date_2 = end_date_2 - pd.DateOffset(days = 1)
elif idx == lenth_df - 1: #確定是最后一條記錄,日期取2019-12-31
end_date_2 = pd.to_datetime(st_end_date)
status_cur_2 = status_after_op
status_list.append([start_date_2,end_date_2,status_cur_2])
#print(f"op = {op},op_date = {op_date} status_before_op = {status_before_op} status_after_op = {status_after_op} ")
elif idx > 0: #當前為第一條記錄
#當前日期及之后的狀態(tài)處理
start_date_2 = op_date
if idx < lenth_df - 1: #不是最后一條記錄放前,日期取下一次操作的日期
end_date_2 = df.at[idx + 1,'操作日期']
end_date_2 = end_date_2 - pd.DateOffset(days = 1)
elif idx == lenth_df - 1: #確定是最后一條記錄忿磅,日期取2019-12-31
end_date_2 = pd.to_datetime(st_start_date)
status_cur_2 = status_after_op
status_list.append([start_date_2,end_date_2,status_cur_2])
#print(f"op = {op},op_date = {op_date} status_before_op = {status_before_op} status_after_op = {status_after_op} ")
df_tmp = pd.DataFrame(status_list)
df_tmp.columns = ['起始日期','結(jié)束日期','狀態(tài)']
df_tmp
return df_tmp
# .1、設(shè)置【起始日期】和【終止日期】
def get_st(last_3years_date,today_date):
"""
"""
# 生成ST信息
# .2凭语、讀取【實施ST】
dd = w.wset("carryoutspecialtreatment", f"startdate={last_3years_date};enddate={today_date}", usedf=True)
df = dd[1]
do_st_df = df[["wind_code","implementation_date","name_before","name_after"]]
do_st_df.columns=['代碼','操作日期','操作前簡稱','操作后簡稱']
do_st_df['操作'] = '實施'
do_st_df.index = do_st_df.index + do_st_df['操作']
#print(do_st_df.head(2))
# .3葱她、讀取【撤銷ST】
dd = w.wset("cancelspecialtreatment",f"startdate={last_3years_date};enddate={today_date}", usedf=True)
df = dd[1]
undo_st_df = df[["wind_code","implementation_date","name_before","name_after"]]
undo_st_df.columns=['代碼','操作日期','操作前簡稱','操作后簡稱']
undo_st_df['操作'] = '撤銷'
undo_st_df.index = undo_st_df.index + undo_st_df['操作']
#print(undo_st_df.head(2))
# .4、雙表合并
st_df = pd.DataFrame()
st_df = st_df.append(do_st_df).append(undo_st_df)
#print(f"{len(do_st_df)},{len(undo_st_df)}")
#print(len(st_df))
# .5似扔、計算st信息
st_dict = get_st_dict(st_df,last_3years_date,today_date) #{last_3years_date};enddate={today_date}"
#print(len(st_dict))
#print(list(st_dict.keys())[0])
#display(st_dict["000010.SZ"])
return st_dict
#判斷篩選出來的股票集合吨些,在指定的日期,它們是否在停牌字典里炒辉,并且當前處于停牌狀態(tài)
def get_st_stocks(st_dict:dict,select_stocks:set,check_date:str)->set:
keys_set = set(st_dict.keys())
#print(len(keys_set))
common_set = select_stocks & keys_set
#print(len(common_set))
common_set
res_set = set()
for item in common_set:
#display(st_dict[item])
df = st_dict[item]
df1 = df.query("(起始日期 <= @check_date <= 結(jié)束日期) & (狀態(tài) != '正常')")
if len(df1) >=1:
#print("處于停牌狀態(tài)")
res_set.add(item)
else:
#print("處于正常狀態(tài)")
pass
return res_set
main流程
#獲取A股列表 API--WSD日期序列 -- 直接拉清單
all_stocks = a_stock_list
print("指定的截止日期為today = ",today)
beginDate = substract_date_years(today,3) #得到今天往前推3年的日期豪墅,作為上市日期起始判斷值
# 1、選取符合上市日期的股票列表
df = get_shangshi_date(all_stocks) #獲取上市日期df
beginDate = pd.to_datetime(beginDate)
df = df.query("上市日期 <= @beginDate")
select_stocks = df.index.tolist()
print("上市日期篩選后的股票",len(select_stocks))
# 2黔寇、 近21個交易日成交額大于63億
df = get_amount_nDays(select_stocks,20,today)
df = df.query("N日成交額>= 6300000000") #近21日成交額總計大于63億
select_stocks = df.index.tolist() #更新股票列表
print("近21個交易日成交額大于63億",len(select_stocks))
# 3偶器、第一大股東質(zhì)押率小于80%
df = get_dagudong_zhiya_zhanbi(select_stocks,today)
df = df.query("大股東質(zhì)押占比 < 80")
#display(df)
select_stocks = df.index.tolist() #更新股票列表
print("第一大股東質(zhì)押率小于80%",len(select_stocks))
# 4、歸屬母公司凈利潤判斷
"""
在1月1日-8月30日之間的缝裤,選用上一年度報告凈利潤屏轰;
在9月1日-10月31日之間的,選用當年半年報數(shù)據(jù)*2倘是;
在11月1日-12月31日的亭枷,選用本年度3季報數(shù)據(jù)*4/3
"""
month = pd.to_datetime(today).month
year = pd.to_datetime(today).year
if 1 <= month <= 8: #在1月1日-8月30日之間的,選用上一年度報告凈利潤搀崭;
last_year = year - 1
last_year_nianbao_date = f"{last_year}1231"
df = get_guishu_mugongsi_jinglirun(select_stocks,last_year_nianbao_date)
elif 9 <= month <= 10:
this_year_banNianBao_date = f"{year}0630"
df = get_guishu_mugongsi_jinglirun(select_stocks,this_year_banNianBao_date)
df['歸屬母公司的凈利潤'] = df.eval("歸屬母公司的凈利潤 * 2")
elif 11 <= month <= 12:
this_year_quarter3_date = f"{year}0930"
df = get_guishu_mugongsi_jinglirun(select_stocks,this_year_quarter3_date)
df['歸屬母公司的凈利潤'] = df.eval("歸屬母公司的凈利潤 * 4/3")
df = df.query("歸屬母公司的凈利潤 >= 50000000 ") #文檔顯示為1億
select_stocks = df.index.tolist()
print("歸屬母公司的凈利潤:",len(select_stocks))
# 5叨粘、審核意見處理:排除“標準無保留意見”之外的其它股票
sjyj_df:pd.DataFrame = get_shenjiyijian(select_stocks,'20181231') #獲取審計意見df
df2 = sjyj_df.query("審計意見類別 !='標準無保留意見' ") #篩選非標意見的股票
feibiao_stocks_set = set(df2.index) #非標準意見的股票集合
final_select_stocks = set(select_stocks) - feibiao_stocks_set #最終選股股票 = 排除了非標意見的股票
print(f"萬礦選股結(jié)束,選出的股票數(shù)量為:{len(final_select_stocks)}")
# 6猾编、ST信息獲取
last_3years_date = substract_date_years(today_date.replace("-",""),3)
st_dict = get_st(last_3years_date,today_date)
print(f"ST信息獲取,共獲取停牌股票數(shù)量:{len(st_dict)}")
# 7升敲、刨除ST的股票
st_set = get_st_stocks(st_dict,final_select_stocks,today)
final_select_stocks = final_select_stocks - st_set
print(f"ST停牌的股票:{len(st_set)}")
print(f"最終選出的股票只數(shù):{len(final_select_stocks)}")
運行結(jié)果
指定的截止日期為today = 20210914
上市日期篩選后的股票 3496
近21個交易日成交額大于x億 941
第一大股東質(zhì)押率小于80% 900
歸屬母公司的凈利潤: 823
萬礦選股結(jié)束,選出的股票數(shù)量為:817
停牌字典處理完畢答倡!
ST信息獲取,共獲取停牌股票數(shù)量:836
ST停牌的股票:1
最終選出的股票只數(shù):816
{'000001.SZ',
'000002.SZ',
'000009.SZ',
'000012.SZ',
'000027.SZ',
'000039.SZ',
'000050.SZ',
'000060.SZ',
'000063.SZ',
'000066.SZ',
'000100.SZ',
'000155.SZ',
'000157.SZ',
'000158.SZ',
'000166.SZ',
'000301.SZ',
'000333.SZ',
'000338.SZ',
'000400.SZ',
'000401.SZ',
'000422.SZ',
'000425.SZ',
'000488.SZ',
'000507.SZ',
'000516.SZ',
'000519.SZ',
'000528.SZ',
'000538.SZ',
'000547.SZ',
'000559.SZ',
'000568.SZ',
'000576.SZ',
'000581.SZ',
'000591.SZ',
'000596.SZ',
'000612.SZ',
'000623.SZ',
'000625.SZ',
'000629.SZ',
'000630.SZ',
'000635.SZ',
'000636.SZ',
'000651.SZ',
'000655.SZ',
'000657.SZ',
'000661.SZ',
'000672.SZ',
'000681.SZ',
'000686.SZ',
'000698.SZ',
'000703.SZ',
'000709.SZ',
'000717.SZ',
'000725.SZ',
'000728.SZ',
'000731.SZ',
'000733.SZ',
'000738.SZ',
'000739.SZ',
'000750.SZ',
'000751.SZ',
'000758.SZ',
'000761.SZ',
'000768.SZ',
'000776.SZ',
'000778.SZ',
'000783.SZ',
'000786.SZ',
'000789.SZ',
'000791.SZ',
'000799.SZ',
'000800.SZ',
'000807.SZ',
'000818.SZ',
'000821.SZ',
'000825.SZ',
'000829.SZ',
'000830.SZ',
'000831.SZ',
'000833.SZ',
'000837.SZ',
'000848.SZ',
'000858.SZ',
'000860.SZ',
'000862.SZ',
'000875.SZ',
'000876.SZ',
'000877.SZ',
'000878.SZ',
'000883.SZ',
'000887.SZ',
'000893.SZ',
'000895.SZ',
'000898.SZ',
'000902.SZ',
'000923.SZ',
'000932.SZ',
'000933.SZ',
'000935.SZ',
'000938.SZ',
'000949.SZ',
'000960.SZ',
'000962.SZ',
'000963.SZ',
'000966.SZ',
'000968.SZ',
'000969.SZ',
'000970.SZ',
'000975.SZ',
'000977.SZ',
'000983.SZ',
'000988.SZ',
'000990.SZ',
'000997.SZ',
'000998.SZ',
'001979.SZ',
'002001.SZ',
'002004.SZ',
'002007.SZ',
'002008.SZ',
'002009.SZ',
'002010.SZ',
'002013.SZ',
'002023.SZ',
'002025.SZ',
'002026.SZ',
'002027.SZ',
'002028.SZ',
'002030.SZ',
'002036.SZ',
'002041.SZ',
'002044.SZ',
'002048.SZ',
'002049.SZ',
'002050.SZ',
'002056.SZ',
'002057.SZ',
'002060.SZ',
'002064.SZ',
'002068.SZ',
'002074.SZ',
'002075.SZ',
'002078.SZ',
'002079.SZ',
'002080.SZ',
'002091.SZ',
'002092.SZ',
'002097.SZ',
'002108.SZ',
'002110.SZ',
'002120.SZ',
'002123.SZ',
'002125.SZ',
'002127.SZ',
'002128.SZ',
'002129.SZ',
'002130.SZ',
'002131.SZ',
'002132.SZ',
'002135.SZ',
'002136.SZ',
'002138.SZ',
'002139.SZ',
'002140.SZ',
'002142.SZ',
'002145.SZ',
'002149.SZ',
'002151.SZ',
'002155.SZ',
'002156.SZ',
'002169.SZ',
'002170.SZ',
'002171.SZ',
'002176.SZ',
'002179.SZ',
'002180.SZ',
'002182.SZ',
'002183.SZ',
'002184.SZ',
'002185.SZ',
'002191.SZ',
'002192.SZ',
'002201.SZ',
'002202.SZ',
'002206.SZ',
'002214.SZ',
'002218.SZ',
'002221.SZ',
'002223.SZ',
'002230.SZ',
'002233.SZ',
'002236.SZ',
'002237.SZ',
'002240.SZ',
'002241.SZ',
'002245.SZ',
'002249.SZ',
'002254.SZ',
'002258.SZ',
'002266.SZ',
'002270.SZ',
'002271.SZ',
'002273.SZ',
'002274.SZ',
'002283.SZ',
'002285.SZ',
'002286.SZ',
'002288.SZ',
'002291.SZ',
'002297.SZ',
'002300.SZ',
'002304.SZ',
'002311.SZ',
'002312.SZ',
'002318.SZ',
'002326.SZ',
'002335.SZ',
'002340.SZ',
'002346.SZ',
'002350.SZ',
'002352.SZ',
'002353.SZ',
'002368.SZ',
'002371.SZ',
'002378.SZ',
'002382.SZ',
'002384.SZ',
'002385.SZ',
'002386.SZ',
'002389.SZ',
'002396.SZ',
'002402.SZ',
'002407.SZ',
'002409.SZ',
'002410.SZ',
'002413.SZ',
'002414.SZ',
'002415.SZ',
'002428.SZ',
'002436.SZ',
'002442.SZ',
'002453.SZ',
'002455.SZ',
'002459.SZ',
'002460.SZ',
'002465.SZ',
'002472.SZ',
'002475.SZ',
'002487.SZ',
'002493.SZ',
'002497.SZ',
'002498.SZ',
'002507.SZ',
'002508.SZ',
'002511.SZ',
'002518.SZ',
'002520.SZ',
'002531.SZ',
'002532.SZ',
'002533.SZ',
'002539.SZ',
'002555.SZ',
'002559.SZ',
'002568.SZ',
'002585.SZ',
'002594.SZ',
'002597.SZ',
'002598.SZ',
'002600.SZ',
'002601.SZ',
'002607.SZ',
'002611.SZ',
'002612.SZ',
'002617.SZ',
'002624.SZ',
'002636.SZ',
'002645.SZ',
'002648.SZ',
'002673.SZ',
'002709.SZ',
'002714.SZ',
'002733.SZ',
'002736.SZ',
'002738.SZ',
'002741.SZ',
'002745.SZ',
'002747.SZ',
'002756.SZ',
'002759.SZ',
'002791.SZ',
'002797.SZ',
'002812.SZ',
'002821.SZ',
'002837.SZ',
'002850.SZ',
'002895.SZ',
'002897.SZ',
'002920.SZ',
'002922.SZ',
'002926.SZ',
'300001.SZ',
'300002.SZ',
'300003.SZ',
'300007.SZ',
'300012.SZ',
'300014.SZ',
'300015.SZ',
'300017.SZ',
'300019.SZ',
'300031.SZ',
'300033.SZ',
'300034.SZ',
'300035.SZ',
'300036.SZ',
'300037.SZ',
'300040.SZ',
'300041.SZ',
'300059.SZ',
'300065.SZ',
'300070.SZ',
'300073.SZ',
'300079.SZ',
'300082.SZ',
'300087.SZ',
'300088.SZ',
'300091.SZ',
'300099.SZ',
'300101.SZ',
'300113.SZ',
'300115.SZ',
'300118.SZ',
'300122.SZ',
'300124.SZ',
'300127.SZ',
'300129.SZ',
'300131.SZ',
'300136.SZ',
'300142.SZ',
'300146.SZ',
'300171.SZ',
'300173.SZ',
'300177.SZ',
'300179.SZ',
'300183.SZ',
'300185.SZ',
'300188.SZ',
'300203.SZ',
'300207.SZ',
'300212.SZ',
'300221.SZ',
'300223.SZ',
'300224.SZ',
'300227.SZ',
'300228.SZ',
'300229.SZ',
'300236.SZ',
'300241.SZ',
'300260.SZ',
'300263.SZ',
'300265.SZ',
'300271.SZ',
'300274.SZ',
'300285.SZ',
'300294.SZ',
'300302.SZ',
'300303.SZ',
'300311.SZ',
'300316.SZ',
'300319.SZ',
'300320.SZ',
'300323.SZ',
'300327.SZ',
'300329.SZ',
'300339.SZ',
'300342.SZ',
'300346.SZ',
'300347.SZ',
'300350.SZ',
'300358.SZ',
'300369.SZ',
'300373.SZ',
'300376.SZ',
'300377.SZ',
'300378.SZ',
'300379.SZ',
'300382.SZ',
'300390.SZ',
'300393.SZ',
'300395.SZ',
'300408.SZ',
'300409.SZ',
'300413.SZ',
'300418.SZ',
'300428.SZ',
'300432.SZ',
'300433.SZ',
'300435.SZ',
'300438.SZ',
'300441.SZ',
'300443.SZ',
'300450.SZ',
'300454.SZ',
'300456.SZ',
'300457.SZ',
'300458.SZ',
'300460.SZ',
'300474.SZ',
'300476.SZ',
'300483.SZ',
'300487.SZ',
'300488.SZ',
'300490.SZ',
'300496.SZ',
'300497.SZ',
'300500.SZ',
'300502.SZ',
'300503.SZ',
'300508.SZ',
'300527.SZ',
'300529.SZ',
'300558.SZ',
'300567.SZ',
'300568.SZ',
'300569.SZ',
'300576.SZ',
'300581.SZ',
'300582.SZ',
'300590.SZ',
'300593.SZ',
'300595.SZ',
'300598.SZ',
'300601.SZ',
'300604.SZ',
'300607.SZ',
'300610.SZ',
'300613.SZ',
'300618.SZ',
'300623.SZ',
'300629.SZ',
'300631.SZ',
'300648.SZ',
'300655.SZ',
'300657.SZ',
'300661.SZ',
'300663.SZ',
'300671.SZ',
'300672.SZ',
'300677.SZ',
'300679.SZ',
'300693.SZ',
'300696.SZ',
'300699.SZ',
'300708.SZ',
'300712.SZ',
'300719.SZ',
'300724.SZ',
'300725.SZ',
'300726.SZ',
'300727.SZ',
'300737.SZ',
'300747.SZ',
'300750.SZ',
'600000.SH',
'600006.SH',
'600008.SH',
'600010.SH',
'600011.SH',
'600016.SH',
'600018.SH',
'600019.SH',
'600021.SH',
'600022.SH',
'600023.SH',
'600025.SH',
'600027.SH',
'600028.SH',
'600030.SH',
'600031.SH',
'600036.SH',
'600038.SH',
'600039.SH',
'600048.SH',
'600050.SH',
'600055.SH',
'600061.SH',
'600063.SH',
'600066.SH',
'600072.SH',
'600075.SH',
'600079.SH',
'600085.SH',
'600089.SH',
'600095.SH',
'600096.SH',
'600104.SH',
'600109.SH',
'600110.SH',
'600111.SH',
'600116.SH',
'600118.SH',
'600123.SH',
'600126.SH',
'600132.SH',
'600141.SH',
'600143.SH',
'600150.SH',
'600151.SH',
'600160.SH',
'600161.SH',
'600163.SH',
'600166.SH',
'600171.SH',
'600176.SH',
'600183.SH',
'600185.SH',
'600188.SH',
'600196.SH',
'600197.SH',
'600199.SH',
'600206.SH',
'600210.SH',
'600216.SH',
'600218.SH',
'600219.SH',
'600223.SH',
'600230.SH',
'600251.SH',
'600256.SH',
'600259.SH',
'600268.SH',
'600273.SH',
'600276.SH',
'600282.SH',
'600295.SH',
'600297.SH',
'600298.SH',
'600307.SH',
'600308.SH',
'600309.SH',
'600312.SH',
'600316.SH',
'600328.SH',
'600330.SH',
'600332.SH',
'600338.SH',
'600346.SH',
'600348.SH',
'600352.SH',
'600360.SH',
'600361.SH',
'600362.SH',
'600363.SH',
'600366.SH',
'600367.SH',
'600369.SH',
'600372.SH',
'600379.SH',
'600383.SH',
'600389.SH',
'600392.SH',
'600395.SH',
'600406.SH',
'600409.SH',
'600418.SH',
'600426.SH',
'600428.SH',
'600435.SH',
'600436.SH',
'600438.SH',
'600456.SH',
'600459.SH',
'600460.SH',
'600470.SH',
'600481.SH',
'600482.SH',
'600483.SH',
'600487.SH',
'600489.SH',
'600497.SH',
'600499.SH',
'600500.SH',
'600507.SH',
'600509.SH',
'600516.SH',
'600517.SH',
'600519.SH',
'600522.SH',
'600529.SH',
'600531.SH',
'600536.SH',
'600546.SH',
'600547.SH',
'600549.SH',
'600552.SH',
'600559.SH',
'600563.SH',
'600567.SH',
'600569.SH',
'600577.SH',
'600580.SH',
'600581.SH',
'600582.SH',
'600584.SH',
'600585.SH',
'600586.SH',
'600587.SH',
'600588.SH',
'600590.SH',
'600596.SH',
'600600.SH',
'600618.SH',
'600621.SH',
'600623.SH',
'600641.SH',
'600660.SH',
'600667.SH',
'600673.SH',
'600685.SH',
'600688.SH',
'600690.SH',
'600691.SH',
'600699.SH',
'600702.SH',
'600703.SH',
'600704.SH',
'600707.SH',
'600711.SH',
'600720.SH',
'600727.SH',
'600732.SH',
'600737.SH',
'600739.SH',
'600740.SH',
'600741.SH',
'600745.SH',
'600746.SH',
'600755.SH',
'600760.SH',
'600763.SH',
'600765.SH',
'600773.SH',
'600779.SH',
'600782.SH',
'600795.SH',
'600801.SH',
'600803.SH',
'600808.SH',
'600809.SH',
'600810.SH',
'600837.SH',
'600845.SH',
'600859.SH',
'600862.SH',
'600863.SH',
'600872.SH',
'600873.SH',
'600875.SH',
'600879.SH',
'600882.SH',
'600884.SH',
'600885.SH',
'600887.SH',
'600888.SH',
'600893.SH',
'600900.SH',
'600909.SH',
'600919.SH',
'600926.SH',
'600958.SH',
'600961.SH',
'600963.SH',
'600966.SH',
'600970.SH',
'600985.SH',
'600988.SH',
'600993.SH',
'600997.SH',
'600999.SH',
'601001.SH',
'601005.SH',
'601009.SH',
'601011.SH',
'601012.SH',
'601015.SH',
'601016.SH',
'601058.SH',
'601066.SH',
'601088.SH',
'601100.SH',
'601101.SH',
'601106.SH',
'601108.SH',
'601117.SH',
'601126.SH',
'601138.SH',
'601139.SH',
'601166.SH',
'601168.SH',
'601169.SH',
'601179.SH',
'601186.SH',
'601198.SH',
'601211.SH',
'601216.SH',
'601222.SH',
'601225.SH',
'601233.SH',
'601238.SH',
'601288.SH',
'601311.SH',
'601318.SH',
'601328.SH',
'601336.SH',
'601369.SH',
'60......