akshare分析涨停板股票数据

导入包,获取日期数据

import pandas as pd
import numpy as np
import akshare as ak
#画图
import matplotlib.pyplot as plt
#正确显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#处理时间
from dateutil.parser import parse
from datetime import datetime,timedelta

 
#获取最新交易日期
#获取交易日历
trade_date = ak.tool_trade_date_hist_sina()
#print(trade_date)
trade_date=trade_date['trade_date'].apply(lambda x:x.strftime('%Y%m%d'))
trade_date
d1=datetime.now().strftime('%Y%m%d')
trade_date=np.array(trade_date)
n1=np.argwhere(trade_date==str(d1))[0][0]+1
#获取最近6年的交易日行情
dates=trade_date[-250*6:n1]

获取涨停版股票数据

import time
df=ak.stock_em_zt_pool(date=dates[0])
#print(df)
for date in dates[-100:]:
    print(date)
    df_tem=ak.stock_em_zt_pool(date=date)
    df_tem['date']=date
    #print(df)
    #time.sleep(60*1000/100/2)
    df=pd.concat([df,df_tem])
    #print(df)
df.to_csv('涨停分析.csv')

特征描述

df.iloc[:,1:].describe().round(2)

数据分段并绘图

def dy_zh(data, cut_points, labels=None): 
    min_num = data.min() 
    max_num = data.max() 
    break_points = [min_num] + cut_points + [max_num]
    print(break_points)
    if not labels: 
        labels = range(len(cut_points)+1)
    else: 
         labels=[labels[i] for i in range(len(cut_points)+1)] 
    dataBin = pd.cut(data,bins=break_points,
         labels=labels,include_lowest=True)    
    return dataBin 
 
cut_points = [10,30,50] 
labels=['10元以下', '10-30元','30-50元','50-100元'] 
df = df.sort_values(by='最新价')
print(df['最新价'])
#调用函数dy_zh,增加新列
df['价格区间'] = dy_zh(df['最新价'], cut_points, labels) 
#查看标签列,取值范围前面加上了序号,是便于后面生成表格时按顺序排列
#df.head()

group_price=df.groupby('价格区间')['date'].count()

plt.figure(figsize=(12,5))
colors=['#1f77b4','#ff7f0e','#2ca02c','#d62728','#9467bd','#8c564b']
fig=plt.bar(group_price.index,group_price.values,color=colors[:5]);
#自动添加标签
def autolabel(fig):
    for f in fig:
        h=f.get_height()
        plt.text(f.get_x()+f.get_width()/2,1.02*h,
        f'{int(h)}',ha='center',va='bottom')
autolabel(fig)

查看涨停板数据

def plot_bar(group_data):
    plt.figure(figsize=(16,5))
    fig=plt.bar(group_data.index,group_data.values);
    autolabel(fig)
    plt.title('2016-2021涨停板排名前20',size=15);

group_name=df.groupby('名称')['代码'].count().sort_values(ascending=False)[:20]
plot_bar(group_name)
 

#分别剔除ST、*ST和新股(N开头)
df_st=df[-(df['名称'].str.startswith('ST') | df['名称'].str.startswith('*ST')|df['名称'].str.startswith('N'))]
group_name_st=df_st.groupby('名称')['代码'].count().sort_values(ascending=False)[:20]
plot_bar(group_name_st)
 


#使用0.5.11版本的pyecharts
from pyecharts import Bar
count_=df.groupby('date')['date'].count()
attr=count_.index
v1=count_.values
bar=Bar('每日涨停板个数','2016-2021',title_text_size=15)
bar.add('',attr,v1,is_splitline_show=False,is_datazoom_show=True,linewidth=2)
bar

<think>好的,我现在需要帮助用户解决如何使用PythonAkshare根据Excel中的可转债正股股票代码筛选可能涨停的股票。首先,我得理清楚用户的具体需求。用户有一个Excel文件,里面包含可转债对应的正股股票代码,他们想通过这些代码,利用Akshare获取实时或历史数据,筛选出可能涨停的正股。 首先,我应该考虑步骤分解。通常,这类任务可以分为几个步骤:读取Excel文件中的股票代码、使用Akshare获取股票数据、分析数据以判断涨停可能性、最后输出结果。需要确保每个步骤都正确,并且考虑异常处理,比如网络请求失败或数据格式问题。 接下来,我需要确认Akshare的接口是否支持获取实时的股票涨跌幅数据。Akshare的stock_zh_a_spot接口可以获取实时数据,包含当前价格、涨跌幅等信息。然后,涨停的判断通常是当前价格等于涨停价,或者涨跌幅达到10%(对于大部分A股)。但需要注意,不同板块(如科创板、创业板)的涨停幅度可能不同,但用户提到是A股,且股票代码以60开头,可能主要是沪市主板,所以默认10%的涨停幅度可能适用。 然后是读取Excel文件,用户可能需要使用pandas库读取Excel,处理股票代码。需要确保股票代码格式正确,比如是否需要补全前导零,或者转换为Akshare所需的格式,比如“sh601238”中的sh或sz前缀。但根据引用[2],用户提到处理以60开头的股票代码,可能直接使用6位数字代码,而Akshare的接口可能需要加上市场前缀,比如沪市是sh,深市是sz。但stock_zh_a_spot接口可能只需要6位代码,不需要前缀,需要确认。 另外,用户可能需要处理Excel中的股票代码列,确保读取正确。比如使用pandas的read_excel函数,指定正确的列名或索引。然后,遍历每个股票代码,调用Akshare接口获取数据。 在数据处理部分,获取到实时数据后,需要计算涨停价,或者直接使用接口返回的涨跌幅来判断。如果接口已经提供了涨跌幅,可以直接比较是否接近涨停,比如涨跌幅>=9.9%或等于涨停价。但需要考虑数据更新的频率,实时数据可能有一定的延迟,影响准确性。 此外,用户可能需要考虑其他因素,比如成交量、换手率等,来辅助判断涨停的可能性,但用户的问题可能主要集中在价格方面。因此,核心逻辑是获取实时涨跌幅,判断是否达到涨停。 可能的代码结构包括: 1. 导入必要的库:pandas, akshare, openpyxl(用于读取Excel)。 2. 读取Excel文件中的股票代码,假设列名为“股票代码”或类似,可能需要处理格式,如转换为字符串,补全到6位。 3. 遍历每个股票代码,调用ak.stock_zh_a_spot()获取实时数据。 4. 解析返回的数据,检查涨跌幅是否达到涨停条件。例如,当前涨跌幅是否接近10%(考虑到浮点计算误差,可能用>=9.9%)。 5. 收集符合条件的股票代码,保存到新的Excel文件或输出。 需要注意的是,Akshare的接口可能有访问频率限制,需要适当加入延时,或者使用try-except处理请求异常。此外,股票代码可能需要转换为字符串,避免前面的零被省略。例如,Excel中的代码可能是数字格式,如600001会被读取为整数,需要转为字符串并补全到6位。 另外,根据引用[4],用户可能对Excel操作比较熟悉,代码中涉及到的Excel读写部分需要使用pandas或xlrd/xlwt库,但建议使用pandas,因为它更简便。例如,使用pd.read_excel读取,处理后再用to_excel保存结果。 可能的代码示例: 首先安装必要的库:pip install akshare pandas openpyxl 然后编写代码: import pandas as pd import akshare as ak # 读取Excel中的股票代码 df = pd.read_excel('stock_codes.xlsx') stock_codes = df['股票代码'].astype(str).str.zfill(6).tolist() # 获取实时数据 def get_spot_data(code): try: df = ak.stock_zh_a_spot(symbol=code, adjust="") return df except Exception as e: print(f"获取{code}数据失败:{e}") return None # 筛选可能涨停的股票 potential_stocks = [] for code in stock_codes: data = get_spot_data(code) if data is not None and not data.empty: # 假设返回的DataFrame中涨跌幅列为'涨跌幅',单位为百分比 change_percent = data.iloc[0]['涨跌幅'] if change_percent >= 9.9: # 接近涨停 potential_stocks.append({ '股票代码': code, '当前涨跌幅': change_percent, '当前价': data.iloc[0]['最新价'], '涨停价': data.iloc[0]['涨停价'] }) # 转换为DataFrame并保存 if potential_stocks: result_df = pd.DataFrame(potential_stocks) result_df.to_excel('potential_limit_up_stocks.xlsx', index=False) print("筛选完成,结果已保存至potential_limit_up_stocks.xlsx") else: print("未找到可能涨停的股票") 需要确认Akshare的stock_zh_a_spot接口返回的列名是否正确,例如涨跌幅是否为'涨跌幅',涨停价是否为'涨停价'。根据Akshare文档,可能需要调整列名。此外,某些股票可能没有涨停价,比如科创板或创业板注册制后的股票,但用户提到的是以60开头的沪市股票,所以适用10%的涨停幅度。 另外,用户可能需要处理网络请求失败的情况,比如添加重试机制或使用异步请求提高效率,但基础版本可能不需要这些复杂处理。 最后,用户可能需要进一步优化筛选条件,例如结合成交量、市场热度等,但根据问题描述,基础条件是根据涨跌幅判断。 总结步骤:读Excel→获取实时数据→判断涨跌幅→保存结果。</think>以下是使用PythonAkshare筛选可能涨停的可转债正股的具体步骤: ### 1. 准备工作 - **安装依赖库**: ```bash pip install akshare pandas openpyxl ``` - **Excel文件格式**: - 确保Excel文件中包含名为`股票代码`的列,内容为6位数字(如`600000`) ### 2. 读取股票代码 ```python import pandas as pd # 读取Excel文件,假设列名为"股票代码" df = pd.read_excel("可转债正股列表.xlsx", engine="openpyxl") stock_codes = df["股票代码"].astype(str).str.zfill(6).tolist() # 补全为6位字符串 ``` ### 3. 获取实时数据 ```python import akshare as ak def get_realtime_data(code): try: # 获取实时行情(包含最新价、涨跌幅、涨停价等) df = ak.stock_zh_a_spot(symbol=code, adjust="") return df.iloc[0] if not df.empty else None except Exception as e: print(f"获取{code}数据失败:{str(e)}") return None ``` ### 4. 筛选涨停股票 ```python potential_stocks = [] for code in stock_codes: data = get_realtime_data(code) if data is not None: # 判断条件:当前价格等于涨停价 或 涨跌幅≥9.9% if (data["最新价"] >= data["涨停价"]) or (data["涨跌幅"] >= 9.9): potential_stocks.append({ "股票代码": code, "最新价": data["最新价"], "涨跌幅(%)": data["涨跌幅"], "涨停价": data["涨停价"] }) ``` ### 5. 结果输出 ```python if potential_stocks: result_df = pd.DataFrame(potential_stocks) result_df.to_excel("可能涨停股票.xlsx", index=False) print(f"找到{len(potential_stocks)}只可能涨停的股票") else: print("未发现符合条件的股票") ``` ### 代码说明 1. **数据获取**:使用`ak.stock_zh_a_spot()`接口获取实时行情数据[^2] 2. **涨停判断**: - 直接比较最新价与涨停价 - 或通过涨跌幅≥9.9%判断(考虑浮点计算误差) 3. **异常处理**:网络请求添加try-except避免程序中断
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

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

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

打赏作者

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

抵扣说明:

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

余额充值