99 lines
3.2 KiB
Python
99 lines
3.2 KiB
Python
from pyecharts.charts import Line
|
||
from pyecharts import options as opts
|
||
|
||
from utils.comm import *
|
||
|
||
|
||
class LimitList:
|
||
|
||
def __init__(self, trade_date):
|
||
self.trade_date = trade_date.strftime('%Y%m%d')
|
||
self.start_date = return_trading_day(trade_date, -7)
|
||
self.end_date = self.trade_date
|
||
self.limit_df = pd.DataFrame()
|
||
for _ in range(5):
|
||
try:
|
||
# 涨跌停列表
|
||
self.limit_df = xcsc_pro.limit_list_d(start_date=self.start_date, end_date=self.end_date)
|
||
break
|
||
except Exception as e:
|
||
print("涨跌停列表数据获取失败,", e)
|
||
time.sleep(1)
|
||
continue
|
||
else:
|
||
print("涨跌停列表数据获取失败次数过多,请关注!!!")
|
||
|
||
def limit_list_chart(self):
|
||
# 按照 trade_date 和 limit 进行分组统计
|
||
grouped = self.limit_df.groupby(['trade_date', 'limit']).size().reset_index(name='count')
|
||
|
||
# 使用 pivot_table 将 limit 类型作为列,统计数量
|
||
pivot_table = grouped.pivot_table(index='trade_date', columns='limit', values='count', fill_value=0)
|
||
# print(pivot_table)
|
||
# D:跌停,U:涨停,Z:炸板
|
||
# 获取不同 limit 类型的数据
|
||
u_list = pivot_table['U'].tolist()
|
||
d_list = pivot_table['D'].tolist()
|
||
z_list = pivot_table['Z'].tolist()
|
||
trade_dates = pivot_table.index.tolist()
|
||
|
||
c = (
|
||
Line(init_opts=opts.InitOpts(width="100%", height="380px"))
|
||
.add_xaxis(trade_dates)
|
||
.add_yaxis("跌停数", d_list)
|
||
.add_yaxis("涨停数", u_list)
|
||
.add_yaxis("炸板数", z_list)
|
||
.set_global_opts(
|
||
tooltip_opts=opts.TooltipOpts(trigger="axis"),
|
||
title_opts=opts.TitleOpts(title="涨跌停 —— 复盘", pos_left="center"),
|
||
yaxis_opts=opts.AxisOpts(offset=5),
|
||
xaxis_opts=opts.AxisOpts(offset=5, axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),
|
||
legend_opts=opts.LegendOpts(pos_top="8%")
|
||
)
|
||
.render(f"../html/{self.trade_date}/limit_list_chart.html")
|
||
)
|
||
|
||
def html_page_data(self):
|
||
"""
|
||
生成HTML文件
|
||
:return:
|
||
"""
|
||
print(self.limit_df)
|
||
df = self.limit_df[self.limit_df['trade_date'] == self.end_date].fillna(0).sort_values(
|
||
by=["industry", "limit_times"],
|
||
ascending=False).reset_index(drop=True)
|
||
|
||
table_content = f'<table class="table table-hover"><thead>' \
|
||
f'<tr>' \
|
||
f'<th scope="col">股票代码</th>' \
|
||
f'<th scope="col">所属行业</th>' \
|
||
f'<th scope="col">股票名称</th>' \
|
||
f'<th scope="col">换手率</th>' \
|
||
f'<th scope="col">连板数</th>' \
|
||
f'<th scope="col">状态</th>' \
|
||
f'</tr>' \
|
||
f'</thead>' \
|
||
f'<tbody>'
|
||
|
||
for index, row in df.iterrows():
|
||
table_content += f'<tr><th scope="row">{row["ts_code"]}</th>' \
|
||
f'<td>{row["industry"]}</td>' \
|
||
f'<td>{row["name"]}</td>' \
|
||
f'<td>{row["turnover_ratio"]}</td>' \
|
||
f'<td>{row["limit_times"]}</td>'
|
||
if row['limit'] == 'D':
|
||
table_content += f'<td class="table-success">跌停</td>'
|
||
elif row['limit'] == 'U':
|
||
table_content += f'<td class="table-danger">涨停</td>'
|
||
elif row['limit'] == 'Z':
|
||
table_content += f'<td class="table-warning">炸板</td>'
|
||
table_content += '</tr>'
|
||
table_content += f'</tbody></table>'
|
||
return table_content
|
||
|
||
|
||
if __name__ == '__main__':
|
||
limit = LimitList(datetime.strptime('20231108', "%Y%m%d"))
|
||
# limit.limit_list_chart()
|
||
limit.html_page_data()
|