免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐;文中所有观点均不构成任何投资建议。请读者仔细阅读本声明,若读者阅读此文章,默认知晓此声明。
get_data模块主要是获取股票市场相关的数据,主要含有dict_data和get_stock_data两个模块。
1. dict_data
1.1 模块解释
主要是作为指数代码的存放,主要分为三类:宽基,风格和中证行业。
1.2 模块源码
'''
设置所需的数据,以字典的形式展现
'''
# 宽基指数
base_index_dict = {'上证指数': 'sh000001', '深证成指': 'sz399001',
'创业板指数': 'sz399006', '科创板指数': 'sh000688'}
# 风格指数
style_index_dict = {'沪深300': 'sz399300', '中证500': 'sh000905',
'中证800': 'sh000906', '中证1000': 'sh000852',
'国证2000': 'sz399303', '上证小盘': 'sh000045'}
# 中证行业指数
industry_dict = {'中证环保': 'sh000827', '中证能源': 'sh000928',
'中证医药': 'sh000933', '中证金融': 'sh000934',
'中证信息': 'sh000935', '中证体育': 'sz399804',
'中证国安': 'sz399813', '中证传媒': 'sz399971',
'中证国防': 'sz399973', '中证银行': 'sz399986',
'中证白酒': 'sz399997', '中证煤炭': 'sz399998',
'中证消费': 'sh000932', '中证新能': 'sz399808', '中证医疗': 'sz399989'}
index_dict_list = [industry_dict, base_index_dict, style_index_dict]
2. get_stock_data
2.1 模块解释
下表例举该模块下各个函数的功能。
函数名称 | 功能 |
set_market | 识别股票所属市场,主要用于过滤北交所数据 |
set_change_group | 根据股票单日涨跌幅进行分组 |
get_stock_market | 获取当日股票市场的涨跌概况 |
get_stock_data | 获取股票涨跌幅分布情况和成交额前十的股票 |
get_index_data | 获取指数对应的当天和当年的涨幅 |
get_volume_data | 获取沪深两市近100个交易日的成交额数据 |
store | 存储数据,路径对应data_deal文件夹 |
store_data | 运行模块下所有的数据,获取数据并保存 |
2.2 模块源码
'''
处理股票的数据,并保存为xlsx
主要是获取股票和指数对应的一些统计指标
'''
import akshare as ak
import pandas as pd
from Automatic_report.get_data.dict_data import *
from Automatic_report.data_deal.store_path import get_path
def set_market(symbol):
# 获取股票所属的市场
if symbol == '6':
market = 'SH'
elif symbol == '0' or symbol == '3':
market = 'SZ'
else:
market = 'BJ'
return market
def set_change_group(change):
# 设置涨跌幅对应所处的分组
if change < -0.1:
change_gp = 'a.下跌大于10%'
elif -0.1 <= change < -0.07:
change_gp = 'b.下跌7%-10%'
elif -0.07 <= change <= -0.04:
change_gp = 'c.下跌4%-7%'
elif -0.04 <= change < 0:
change_gp = 'd.下跌0%-4%'
elif 0 <= change <= 0.04:
change_gp = 'e.上涨0%-4%'
elif 0.04 <= change < 0.07:
change_gp = 'f.上涨4%-7%'
elif 0.07 <= change < 0.1:
change_gp = 'g.上涨7%-10%'
elif change >= 0.1:
change_gp = 'h.涨幅大于10%'
else:
change_gp = 'i.停牌或其他'
return change_gp
def get_stock_market():
# 涨跌统计
stock_market = ak.stock_market_activity_legu()
new_df = stock_market.loc[0:9]
new_df.columns = ['名称', '数量']
new_df['名称'] = new_df['名称'] + '家数'
return new_df
def get_stock_data():
# 涨幅分布;成交额前十的股票
stock_data = ak.stock_zh_a_spot_em()
# 剔除北交所的数据
stock_data['market'] = stock_data['代码'].apply(lambda x: set_market(str(x[0])))
new_s_data = stock_data[stock_data['market'] != 'BJ']
# 涨跌幅分组
new_s_data['涨跌幅分组'] = new_s_data['涨跌幅'].apply(lambda x: set_change_group(x / 100))
change_group = new_s_data.groupby(['涨跌幅分组'])['代码'].count().reset_index()
change_group = change_group.rename(columns={'代码': '数量'})
# 成交额前十
vol_df = new_s_data.sort_values(['成交额'], ascending=False)
ten_df = vol_df.head(10)
tenth_vol_df = pd.DataFrame({'股票名称': ten_df['名称'],
'成交额(亿)': round(ten_df['成交额'] / 100000000, 2),
'换手率(%)': round(ten_df['换手率'], 2)})
return change_group, tenth_vol_df
def get_index_data(index_dict):
# 获取指数的涨跌幅统计
all_df = pd.DataFrame()
for name in index_dict.keys():
print(name)
code = index_dict.get(name)
data_source = ak.stock_zh_index_daily_em(symbol=code).sort_values(by=['date'], ascending=True)
last_year_close = data_source.loc[data_source['date'] == '2022-12-30']['close'].values[0]
# 当日涨跌幅
today_return = data_source['close'].values[-1] / data_source['close'].values[-2] - 1
# 当年涨跌幅
year_return = data_source['close'].values[-1] / last_year_close - 1
one_df = pd.DataFrame({'指数名称': [name], '当日涨幅': [today_return],
'当年涨幅': [year_return]})
all_df = all_df.append(one_df)
return all_df
def get_volume_data():
# 沪深两市成交量及历史数据--过去100个交易日
sh = ak.stock_zh_index_daily_em(symbol='sh000001').sort_values(by=['date'], ascending=True)
sh_df = pd.DataFrame({'日期': sh['date'], '沪市': sh['amount']})
sz = ak.stock_zh_index_daily_em(symbol='sz399001').sort_values(by=['date'], ascending=True)
sz_df = pd.DataFrame({'日期': sz['date'], '深市': sz['amount']})
me_df = pd.merge(sh_df, sz_df, how='left', on='日期')
me_df['总成交额(亿)'] = round((me_df['沪市'] + me_df['深市']) / 100000000, 2)
new_df = me_df[-100:]
out_df = pd.DataFrame({'日期': new_df['日期'],
'总成交额(亿)': new_df['总成交额(亿)']})
return out_df
def store(df, name):
# 保存数据
file_path = get_path()
df.to_excel(file_path + str(name) + '.xlsx', index=False)
def store_data():
# 保存数据,格式为excel
index_name = ['中证行业', '宽基', '风格']
for num in range(len(index_name)):
name = index_name[num]
index_dict = index_dict_list[num]
index_df = get_index_data(index_dict)
store(index_df, name)
vol_df = get_volume_data()
store(vol_df, '成交额')
stock_market = get_stock_market()
store(stock_market, '市场概况')
change_group, tenth_vol_df = get_stock_data()
store(change_group, '涨跌幅分组')
store(tenth_vol_df, '成交前十')
print('基础数据获取完毕!')
if __name__ == '__main__':
store_data()
免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐;文中所有观点均不构成任何投资建议。请读者仔细阅读本声明,若读者阅读此文章,默认知晓此声明。