保存tushare所有股票数据,并对涨停进行分析

该代码实现从tushare获取并分析当天股市数据,包括股票涨跌情况、涨停跌停股票特征,如上市日期、市盈率、流通市值等,并对行业、交易所和地区的统计数据进行展示。程序首先获取所有股票的收盘数据和基本信息,然后筛选出上涨、下跌、涨停和跌停的股票,最后对不同类别股票进行统计分析,输出关键指标的平均值和中位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import tushare as ts
import pandas as pd
import time
import os
import datetime
# 指定自己要存放文件的绝对路径
os.chdir('E:/')
pd.set_option('expand_frame_repr', False)
now_time = datetime.date.today()
# 从tushare获取指定日期
def get_today_all_ts(date):

    date_now = date

# 先获得所有股票的收盘数据
    df_close = ts.get_today_all()

   # 获得所有股票的基本信息
    df_basics = ts.get_stock_basics()
    df_all = pd.merge(left=df_close, right=df_basics, on='name', how='outer')

    df_all['code'] = df_all['code'].astype(str) + ' '

# 保存数据
    df_all.to_csv(str(date_now) + '_ts.csv', index=False, encoding='gbk')
    print('%s is downloaded.' % (str(date_now)))
    print(df_all)
    return df_all

if __name__ == '__main__':
    get_today_all_ts(date=now_time)

import pandas as pd
import requests
import tushare as ts
import os
import time
import warnings
warnings.filterwarnings('ignore')
pd.set_option('expand_frame_repr', False)
os.chdir('E:/')
date_now = datetime.date.today()
print(str(date_now))
# ====龙虎榜数据


# 读取TDX的每日股票数据
df = pd.read_csv('{}_ts.csv'.format(str(date_now)), encoding='gbk')
df.fillna(0, inplace=True)
df.replace('nan ', 0, inplace=True)
df['timeToMarket'] = pd.to_datetime(df['timeToMarket'])

df[['changepercent', 'pe', 'mktcap', 'nmc']] = df[['changepercent', 'pe', 'mktcap', 'nmc']].astype(float)
df['timeToMarket'] = pd.to_datetime(df['timeToMarket'])

df['code'] = df['code'].astype(str)  # 转化成str后,NAN也变成nan str格式
# 添加 交易所 列
df.loc[df['code'].str.startswith('3'), 'exchange'] = 'CY'
df.loc[df['code'].str.startswith('6'), 'exchange'] = 'SH'
df.loc[df['code'].str.startswith('0'), 'exchange'] = 'SZ'

# 找出上涨的股票
df_up = df[df['changepercent'] > 0.00]
# 走平股数
df_even = df[df['changepercent'] == 0.00]
# 找出下跌的股票
df_down = df[df['changepercent'] < 0.00]

# 找出涨停的股票
limit_up = df[df['changepercent'] >= 9.70]
limit_down = df[df['changepercent'] <= -9.70]

# 涨停股数中的未封板股,上市日期小于15天
limit_up_new = limit_up[pd.to_datetime(date_now) - limit_up['timeToMarket'] <= pd.Timedelta(15)]
# 涨停股数中次新股,上市日期小于1年
limit_up_fresh = limit_up[pd.to_datetime(date_now) - limit_up['timeToMarket'] <= pd.Timedelta(365)]

# 涨停股数中的未封板股,上市日期小于15天
limit_down_new = limit_down[pd.to_datetime(date_now) - limit_down['timeToMarket'] <= pd.Timedelta(15)]
# 涨停股数中次新股,上市日期小于1年
limit_down_fresh = limit_down[pd.to_datetime(date_now) - limit_down['timeToMarket'] <= pd.Timedelta(365)]

print('A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。' % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))
print('A股总成交额:%d, 总成交量:%d' % (df['amount'].sum(), df['volume'].sum()))
print('A股平均市盈率:%.2f, 平均流通市值 %.2f 亿, 平均总市值 %.2f 亿' % (df['pe'].mean(), df['nmc'].mean(), df['mktcap'].mean()))
print('涨停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_up.shape[0], limit_up_new.shape[0], limit_up_fresh.shape[0]))
print('跌停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_down.shape[0], limit_down_new.shape[0], limit_down_fresh.shape[0]))

# 获取指定列的分析统计结果
def get_output(df, columns='industry', name='_limit_up'):
    df = df.copy()
    output = pd.DataFrame()
    output = pd.DataFrame(df.groupby(columns)['code'].count())

    output['pe_mean'] = df.groupby(columns)['pe'].mean()
    output['pe_median'] = df.groupby(columns)['pe'].median()

    output['nmc_mean'] = df.groupby(columns)['nmc'].mean()
    output['nmc_median'] = df.groupby(columns)['nmc'].median()

    output['mktcap_mean'] = df.groupby(columns)['mktcap'].mean()
    output['mktcap_median'] = df.groupby(columns)['mktcap'].median()

    output['volume_mean'] = df.groupby(columns)['volume'].mean()
    output['volume_median'] = df.groupby(columns)['volume'].median()

    output['amount_mean'] = df.groupby(columns)['amount'].mean()
    output['amount_median'] = df.groupby(columns)['amount'].median()

    output.sort_values('code', ascending=False, inplace=True)
    output.rename(columns={'code': name + '_count'}, inplace=True)
    return output


for i in ['industry', 'exchange', 'area']:
# 对涨停的股票分析
    output_limit_up = get_output(limit_up, columns=i, name='limit_up')
    print(output_limit_up)
# 对跌停的股票分析
    output_limit_down = get_output(limit_down, columns=i, name='limit_down')
    print(output_limit_down)
# 对全量的股票分析
    output_total = get_output(df, columns=i, name='total')
    print(output_total)

### 使用 Tushare 获取特定日期所有股票数据计算炸板率 为了实现这一目标,首先需要安装初始化 Tushare 库。接着,可以通过 `daily` 和 `trade_cal` 接口获取指定日期内所有股票的日线行情数据以及交易日历。对于炸板率的计算,则需关注涨停未封住的情况。 #### 安装和导入必要的库 ```bash pip install tushare numpy pandas ``` ```python import tushare as ts import pandas as pd from datetime import datetime, timedelta ``` #### 初始化 Tushare Pro API ```python ts.set_token('your_tushare_pro_api_token') pro = ts.pro_api() ``` #### 获取指定日期内的所有股票列表及其基本信息 ```python def get_all_stocks(trade_date): df = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,list_date') return df[df['list_date'] <= trade_date] all_stocks_df = get_all_stocks(date) print(all_stocks_df.head()) ``` #### 获取单个股票的日线行情数据 ```python def fetch_daily_data(ts_code, trade_date): try: daily_data = pro.daily(ts_code=ts_code, start_date=trade_date, end_date=trade_date) return daily_data.iloc[0] if not daily_data.empty else None except Exception as e: print(f"Error fetching {ts_code}: {e}") return None ``` #### 批量获取多个股票的日线行情数据 ```python def batch_fetch_daily_data(stock_list, trade_date): results = [] for index, row in stock_list.iterrows(): result = fetch_daily_data(row['ts_code'], trade_date) if result is not None: results.append(result) return pd.DataFrame(results).reset_index(drop=True) batched_results = batch_fetch_daily_data(all_stocks_df[['ts_code']], date) print(batched_results.shape) ``` #### 计算炸板率 炸板是指开盘价达到涨跌停后又打开的现象。通常情况下,如果某只个股当天最高价等于前一日收盘价乘以1.1(即上涨10%),而最终收盘价低于这个价格,则认为发生了炸板现象。 ```python def calculate_breakout_rate(df): previous_close_prices = {} # 预处理前一天的价格信息 prev_day = (datetime.strptime(date, '%Y%m%d') - timedelta(days=1)).strftime('%Y%m%d') pre_daily_data = pro.daily(trade_date=prev_day) for _, item in pre_daily_data.iterrows(): previous_close_prices[item['ts_code']] = float(item['close']) count_total = 0 count_breakouts = 0 for idx, record in df.iterrows(): code = record['ts_code'] close_price_today = float(record['close']) high_price_today = float(record['high']) if code in previous_close_prices and abs(high_price_today / previous_close_prices[code] - 1.1) < 1e-6 \ and close_price_today < high_price_today: count_breakouts += 1 count_total += 1 breakout_rate = round(count_breakouts / max(1, count_total), 4)*100 return f'{breakout_rate}%' rate = calculate_breakout_rate(batched_results) print(rate) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

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

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

打赏作者

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

抵扣说明:

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

余额充值