收盘自动统计报告--get_data模块

 免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐;文中所有观点均不构成任何投资建议。请读者仔细阅读本声明,若读者阅读此文章,默认知晓此声明。

    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()

免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐;文中所有观点均不构成任何投资建议。请读者仔细阅读本声明,若读者阅读此文章,默认知晓此声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值