commit 5f4940c45df2627270a521a15ed468f109e868c1 Author: 李馥豪 Date: Sat May 10 16:45:01 2025 +0800 init object diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f3464fc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fdd8fdf --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/pythonProject1.iml b/.idea/pythonProject1.iml new file mode 100644 index 0000000..c36eb49 --- /dev/null +++ b/.idea/pythonProject1.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/east/.idea/.gitignore b/east/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/east/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/east/.idea/east.iml b/east/.idea/east.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/east/.idea/east.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/east/.idea/inspectionProfiles/profiles_settings.xml b/east/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/east/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/east/.idea/misc.xml b/east/.idea/misc.xml new file mode 100644 index 0000000..d74c693 --- /dev/null +++ b/east/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/east/.idea/modules.xml b/east/.idea/modules.xml new file mode 100644 index 0000000..cb293b6 --- /dev/null +++ b/east/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/east/bar-2.py b/east/bar-2.py new file mode 100644 index 0000000..8f22c88 --- /dev/null +++ b/east/bar-2.py @@ -0,0 +1,168 @@ +import requests +import pandas as pd +import json +from datetime import datetime +import matplotlib.pyplot as plt +import matplotlib +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + +matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体 +matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + +def get_fund_flow_data(): + """获取资金流向数据,包括板块和股票名称""" + url = "https://push2delay.eastmoney.com/api/qt/clist/get" + + params = { + 'fid': 'f184', + 'po': '1', + 'pz': '50', + 'pn': '1', + 'np': '1', + 'fltt': '2', + 'invt': '2', + 'fields': 'f2,f3,f12,f13,f14,f62,f184,f225,f165,f263,f109,f175,f264,f160,f100,f124,f265,f1', + 'ut': 'b2884a393a59ad64002292a3e90d46a5', + 'fs': 'm:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2', + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Referer': 'https://data.eastmoney.com/zjlx/list.html' + } + + try: + response = requests.get(url, params=params, headers=headers) + print(response.text) + data = json.loads(response.text) + + if 'data' not in data or 'diff' not in data['data']: + raise Exception("未能获取到数据") + + items = data['data']['diff'] + + parsed_data = [] + for idx, item in enumerate(items[:50]): + # 获取每个板块的股票名称 + stock_names = item.get('f14', '') + + # 打印调试信息,检查 f62 字段的内容 + print(f"板块 {item['f14']} - f62 字段内容: {stock_names}") + + if isinstance(stock_names, str): + stock_names = stock_names.split(';') # 假设股票名称以分号分隔 + else: + stock_names = [] # 如果 f62 为空或格式不正确,设置为空列表 + + # 如果股票名称为空,则跳过该项 + if not stock_names: + print(f"板块 {item['f14']} 没有有效的股票名称") + continue + + # 计算三者的平均排名 + avg_rank = np.mean([item['f225'], item['f263'], item['f264']]) + + parsed_data.append({ + '股票名称': stock_names[0], # 只取第一个股票名称 + '今日排名': item['f225'], + '5日排名': item['f263'], + '10日排名': item['f264'], + '平均排名': avg_rank + }) + + return pd.DataFrame(parsed_data) + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def create_ranking_visualization(data): + """创建排名可视化窗口""" + root = tk.Tk() + root.title("股票资金流向排名对比") + root.geometry("1500x900") + root.configure(bg='#2C3E50') # 深色背景 + + fig = Figure(figsize=(15, 10)) + ax = fig.add_subplot(111) + + # 设置样式 + ax.set_facecolor('#FFFFFF') # 设置背景色 + fig.patch.set_facecolor('#FFFFFF') # 设置背景色 + + # 准备数据 + stock_names = data['股票名称'].tolist()[:30] # 只显示前15个股票,避免过于拥挤 + avg_ranks = data['平均排名'].tolist()[:30] + + # 设置柱状图位置 + x = np.arange(len(stock_names)) + width = 0.5 # 设置柱状图宽度 + + # 绘制柱状图 + rects1 = ax.bar(x, avg_ranks, width, label='平均排名', color='#2980B9', alpha=0.9, edgecolor='black') + + # 设置标题和标签 + ax.set_title('股票资金流向排名对比(排名越高表示资金流入越多)', fontsize=18, pad=20, color='black') + ax.set_xlabel('股票名称', fontsize=14, color='black') + ax.set_ylabel('平均排名', fontsize=14, color='black') + + # 设置x轴刻度 + ax.set_xticks(x) + ax.set_xticklabels(stock_names, rotation=45, ha='right', fontsize=12, color='black') + + # 设置y轴范围和刻度 + ax.set_ylim(0, 55) + ax.set_yticks(np.arange(0, 51, 10)) + + # 添加图例 + ax.legend(loc='upper right', fontsize=12) + + # 设置网格 + ax.grid(True, linestyle='--', alpha=0.3, axis='y') + + # 调整布局 + fig.tight_layout() + + # 创建canvas + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 生成并显示词云 + plt.figure(figsize=(8, 6)) + plt.axis('off') + plt.show() + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12), bg='#C82423', fg='white', padx=10, pady=5) + close_button.pack(side=tk.BOTTOM, pady=10) + + return root + + +def main(): + # 获取资金流向数据 + print("正在获取资金流向数据...") + data = get_fund_flow_data() + + if data is not None: + # 保存数据到Excel + current_date = datetime.now().strftime('%Y%m%d') + output_file = f'fund_flow_ranking_{current_date}.xlsx' + data.to_excel(output_file, index=False) + print(f"资金流向数据已保存到: {output_file}") + + # 创建并显示可视化窗口 + print("正在创建可视化窗口...") + root = create_ranking_visualization(data) + root.mainloop() + else: + print("获取数据失败,请检查网络连接或接口可用性。") + + +if __name__ == "__main__": + main() diff --git a/east/bar.PY b/east/bar.PY new file mode 100644 index 0000000..f42973b --- /dev/null +++ b/east/bar.PY @@ -0,0 +1,167 @@ +import requests +import pandas as pd +import json +from datetime import datetime +import matplotlib.pyplot as plt +import matplotlib +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + +matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体 +matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + +def get_fund_flow_data(): + """获取资金流向数据,包括板块和股票名称""" + url = "https://push2delay.eastmoney.com/api/qt/clist/get" + + params = { + 'fid': 'f184', + 'po': '1', + 'pz': '50', + 'pn': '1', + 'np': '1', + 'fltt': '2', + 'invt': '2', + 'fields': 'f2,f3,f12,f13,f14,f62,f184,f225,f165,f263,f109,f175,f264,f160,f100,f124,f265,f1', + 'ut': 'b2884a393a59ad64002292a3e90d46a5', + 'fs': 'm:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2', + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Referer': 'https://data.eastmoney.com/zjlx/list.html' + } + + try: + response = requests.get(url, params=params, headers=headers) + print(response.text) + data = json.loads(response.text) + + if 'data' not in data or 'diff' not in data['data']: + raise Exception("未能获取到数据") + + items = data['data']['diff'] + + parsed_data = [] + for idx, item in enumerate(items[:50]): + # 获取每个板块的股票名称 + stock_names = item.get('f14', '') + + # 打印调试信息,检查 f62 字段的内容 + print(f"板块 {item['f14']} - f62 字段内容: {stock_names}") + + if isinstance(stock_names, str): + stock_names = stock_names.split(';') # 假设股票名称以分号分隔 + else: + stock_names = [] # 如果 f62 为空或格式不正确,设置为空列表 + + # 如果股票名称为空,则跳过该项 + if not stock_names: + print(f"板块 {item['f14']} 没有有效的股票名称") + continue + + parsed_data.append({ + '板块': item['f100'], + '今日排名': item['f225'], # 转换为排名 + '5日排名': item['f263'], # 临时使用索引作为排名 + '10日排名': item['f264'], # 临时使用索引作为排名 + '股票名称': stock_names[0] # 添加股票名称 + }) + + return pd.DataFrame(parsed_data) + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def create_ranking_visualization(data): + """创建排名可视化窗口""" + root = tk.Tk() + root.title("板块资金流向排名对比") + root.geometry("1500x900") + root.configure(bg='#2C3E50') # 深色背景 + + fig = Figure(figsize=(15, 10)) + ax = fig.add_subplot(111) + + # 设置样式 + ax.set_facecolor('#34495E') # 设置背景色 + fig.patch.set_facecolor('#2C3E50') # 设置背景色 + + # 准备数据 + sectors = data['板块'].tolist()[:15] # 只显示前15个板块,避免过于拥挤 + today_ranks = data['今日排名'].tolist()[:15] + five_day_ranks = data['5日排名'].tolist()[:15] + ten_day_ranks = data['10日排名'].tolist()[:15] + + # 设置柱状图位置 + x = np.arange(len(sectors)) + width = 0.25 + + # 绘制柱状图 + rects1 = ax.bar(x - width, today_ranks, width, label='今日排名', color='#E74C3C', alpha=0.9, edgecolor='black') + rects2 = ax.bar(x, five_day_ranks, width, label='5日排名', color='#F39C12', alpha=0.9, edgecolor='black') + rects3 = ax.bar(x + width, ten_day_ranks, width, label='10日排名', color='#2980B9', alpha=0.9, edgecolor='black') + + # 设置标题和标签 + ax.set_title('板块资金流向排名对比(排名越高表示资金流入越多)', fontsize=18, pad=20, color='white') + ax.set_xlabel('板块', fontsize=14, color='white') + ax.set_ylabel('排名', fontsize=14, color='white') + + # 设置x轴刻度 + ax.set_xticks(x) + ax.set_xticklabels(sectors, rotation=45, ha='right', fontsize=12, color='white') + + # 设置y轴范围和刻度 + ax.set_ylim(0, 55) + ax.set_yticks(np.arange(0, 51, 10)) + + # 添加图例 + ax.legend(loc='upper right', fontsize=12) + + # 设置网格 + ax.grid(True, linestyle='--', alpha=0.3, axis='y') + + # 调整布局 + fig.tight_layout() + + # 创建canvas + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 生成并显示词云 + plt.figure(figsize=(8, 6)) + plt.axis('off') + plt.show() + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12), bg='#C82423', fg='white', padx=10, pady=5) + close_button.pack(side=tk.BOTTOM, pady=10) + + return root + +def main(): + # 获取资金流向数据 + print("正在获取资金流向数据...") + data = get_fund_flow_data() + + if data is not None: + # 保存数据到Excel + current_date = datetime.now().strftime('%Y%m%d') + output_file = f'fund_flow_ranking_{current_date}.xlsx' + data.to_excel(output_file, index=False) + print(f"资金流向数据已保存到: {output_file}") + + # 创建并显示可视化窗口 + print("正在创建可视化窗口...") + root = create_ranking_visualization(data) + root.mainloop() + else: + print("获取数据失败,请检查网络连接或接口可用性。") + +if __name__ == "__main__": + main() diff --git a/east/china.ttf b/east/china.ttf new file mode 100644 index 0000000..b23a2af Binary files /dev/null and b/east/china.ttf differ diff --git a/east/data/RSI_data_20241214.xlsx b/east/data/RSI_data_20241214.xlsx new file mode 100644 index 0000000..df9cc41 Binary files /dev/null and b/east/data/RSI_data_20241214.xlsx differ diff --git a/east/data/RSI_data_20241214_1.xlsx b/east/data/RSI_data_20241214_1.xlsx new file mode 100644 index 0000000..7393dbf Binary files /dev/null and b/east/data/RSI_data_20241214_1.xlsx differ diff --git a/east/data/RSI_data_20241214_2.xlsx b/east/data/RSI_data_20241214_2.xlsx new file mode 100644 index 0000000..a2a6e47 Binary files /dev/null and b/east/data/RSI_data_20241214_2.xlsx differ diff --git a/east/data/RSI_data_20241214_3.xlsx b/east/data/RSI_data_20241214_3.xlsx new file mode 100644 index 0000000..86df22e Binary files /dev/null and b/east/data/RSI_data_20241214_3.xlsx differ diff --git a/east/data/RSI_data_20250222.xlsx b/east/data/RSI_data_20250222.xlsx new file mode 100644 index 0000000..e213eb7 Binary files /dev/null and b/east/data/RSI_data_20250222.xlsx differ diff --git a/east/data/RSI_data_20250222_1.xlsx b/east/data/RSI_data_20250222_1.xlsx new file mode 100644 index 0000000..cb86fb7 Binary files /dev/null and b/east/data/RSI_data_20250222_1.xlsx differ diff --git a/east/data/RSI_data_20250222_10.xlsx b/east/data/RSI_data_20250222_10.xlsx new file mode 100644 index 0000000..0443d6d Binary files /dev/null and b/east/data/RSI_data_20250222_10.xlsx differ diff --git a/east/data/RSI_data_20250222_12.xlsx b/east/data/RSI_data_20250222_12.xlsx new file mode 100644 index 0000000..b517ebf Binary files /dev/null and b/east/data/RSI_data_20250222_12.xlsx differ diff --git a/east/data/RSI_data_20250222_13.xlsx b/east/data/RSI_data_20250222_13.xlsx new file mode 100644 index 0000000..35e3131 Binary files /dev/null and b/east/data/RSI_data_20250222_13.xlsx differ diff --git a/east/data/RSI_data_20250222_14.xlsx b/east/data/RSI_data_20250222_14.xlsx new file mode 100644 index 0000000..013e211 Binary files /dev/null and b/east/data/RSI_data_20250222_14.xlsx differ diff --git a/east/data/RSI_data_20250222_15.xlsx b/east/data/RSI_data_20250222_15.xlsx new file mode 100644 index 0000000..85ffb24 Binary files /dev/null and b/east/data/RSI_data_20250222_15.xlsx differ diff --git a/east/data/RSI_data_20250222_16.xlsx b/east/data/RSI_data_20250222_16.xlsx new file mode 100644 index 0000000..880dd96 Binary files /dev/null and b/east/data/RSI_data_20250222_16.xlsx differ diff --git a/east/data/RSI_data_20250222_17.xlsx b/east/data/RSI_data_20250222_17.xlsx new file mode 100644 index 0000000..9687386 Binary files /dev/null and b/east/data/RSI_data_20250222_17.xlsx differ diff --git a/east/data/RSI_data_20250222_18.xlsx b/east/data/RSI_data_20250222_18.xlsx new file mode 100644 index 0000000..93abbd2 Binary files /dev/null and b/east/data/RSI_data_20250222_18.xlsx differ diff --git a/east/data/RSI_data_20250222_19.xlsx b/east/data/RSI_data_20250222_19.xlsx new file mode 100644 index 0000000..1a45dd5 Binary files /dev/null and b/east/data/RSI_data_20250222_19.xlsx differ diff --git a/east/data/RSI_data_20250222_2.xlsx b/east/data/RSI_data_20250222_2.xlsx new file mode 100644 index 0000000..091e0c1 Binary files /dev/null and b/east/data/RSI_data_20250222_2.xlsx differ diff --git a/east/data/RSI_data_20250222_20.xlsx b/east/data/RSI_data_20250222_20.xlsx new file mode 100644 index 0000000..a52a552 Binary files /dev/null and b/east/data/RSI_data_20250222_20.xlsx differ diff --git a/east/data/RSI_data_20250222_21.xlsx b/east/data/RSI_data_20250222_21.xlsx new file mode 100644 index 0000000..477a0b2 Binary files /dev/null and b/east/data/RSI_data_20250222_21.xlsx differ diff --git a/east/data/RSI_data_20250222_3.xlsx b/east/data/RSI_data_20250222_3.xlsx new file mode 100644 index 0000000..8ea5f8e Binary files /dev/null and b/east/data/RSI_data_20250222_3.xlsx differ diff --git a/east/data/RSI_data_20250222_4.xlsx b/east/data/RSI_data_20250222_4.xlsx new file mode 100644 index 0000000..7fc8114 Binary files /dev/null and b/east/data/RSI_data_20250222_4.xlsx differ diff --git a/east/data/RSI_data_20250222_5.xlsx b/east/data/RSI_data_20250222_5.xlsx new file mode 100644 index 0000000..31e6e3f Binary files /dev/null and b/east/data/RSI_data_20250222_5.xlsx differ diff --git a/east/data/RSI_data_20250222_6.xlsx b/east/data/RSI_data_20250222_6.xlsx new file mode 100644 index 0000000..3a2c7f1 Binary files /dev/null and b/east/data/RSI_data_20250222_6.xlsx differ diff --git a/east/data/RSI_data_20250222_7.xlsx b/east/data/RSI_data_20250222_7.xlsx new file mode 100644 index 0000000..ff38a2e Binary files /dev/null and b/east/data/RSI_data_20250222_7.xlsx differ diff --git a/east/data/RSI_data_20250222_8.xlsx b/east/data/RSI_data_20250222_8.xlsx new file mode 100644 index 0000000..0e5e884 Binary files /dev/null and b/east/data/RSI_data_20250222_8.xlsx differ diff --git a/east/data/RSI_data_20250222_9.xlsx b/east/data/RSI_data_20250222_9.xlsx new file mode 100644 index 0000000..b771129 Binary files /dev/null and b/east/data/RSI_data_20250222_9.xlsx differ diff --git a/east/data/RSI_data_20250224.xlsx b/east/data/RSI_data_20250224.xlsx new file mode 100644 index 0000000..8a2faf9 Binary files /dev/null and b/east/data/RSI_data_20250224.xlsx differ diff --git a/east/data/RSI_data_20250224_1.xlsx b/east/data/RSI_data_20250224_1.xlsx new file mode 100644 index 0000000..915b911 Binary files /dev/null and b/east/data/RSI_data_20250224_1.xlsx differ diff --git a/east/data/RSI_data_20250224_2.xlsx b/east/data/RSI_data_20250224_2.xlsx new file mode 100644 index 0000000..8570b67 Binary files /dev/null and b/east/data/RSI_data_20250224_2.xlsx differ diff --git a/east/data/RSI_data_20250224_3.xlsx b/east/data/RSI_data_20250224_3.xlsx new file mode 100644 index 0000000..9513c1d Binary files /dev/null and b/east/data/RSI_data_20250224_3.xlsx differ diff --git a/east/data/RSI_data_20250225.xlsx b/east/data/RSI_data_20250225.xlsx new file mode 100644 index 0000000..c1cf398 Binary files /dev/null and b/east/data/RSI_data_20250225.xlsx differ diff --git a/east/data/RSI_data_20250227.xlsx b/east/data/RSI_data_20250227.xlsx new file mode 100644 index 0000000..1b42356 Binary files /dev/null and b/east/data/RSI_data_20250227.xlsx differ diff --git a/east/data/RSI_data_20250228.xlsx b/east/data/RSI_data_20250228.xlsx new file mode 100644 index 0000000..33adedc Binary files /dev/null and b/east/data/RSI_data_20250228.xlsx differ diff --git a/east/data/RSI_data_20250228_1.xlsx b/east/data/RSI_data_20250228_1.xlsx new file mode 100644 index 0000000..f58968b Binary files /dev/null and b/east/data/RSI_data_20250228_1.xlsx differ diff --git a/east/data/RSI_data_20250228_2.xlsx b/east/data/RSI_data_20250228_2.xlsx new file mode 100644 index 0000000..925913d Binary files /dev/null and b/east/data/RSI_data_20250228_2.xlsx differ diff --git a/east/data/RSI_data_20250228_3.xlsx b/east/data/RSI_data_20250228_3.xlsx new file mode 100644 index 0000000..12693f0 Binary files /dev/null and b/east/data/RSI_data_20250228_3.xlsx differ diff --git a/east/data/RSI_data_20250228_4.xlsx b/east/data/RSI_data_20250228_4.xlsx new file mode 100644 index 0000000..abaa3b1 Binary files /dev/null and b/east/data/RSI_data_20250228_4.xlsx differ diff --git a/east/data/RSI_data_20250320.xlsx b/east/data/RSI_data_20250320.xlsx new file mode 100644 index 0000000..c986850 Binary files /dev/null and b/east/data/RSI_data_20250320.xlsx differ diff --git a/east/data/RSI_data_20250320_1.xlsx b/east/data/RSI_data_20250320_1.xlsx new file mode 100644 index 0000000..f0e52dd Binary files /dev/null and b/east/data/RSI_data_20250320_1.xlsx differ diff --git a/east/data/RSI_data_20250320_2.xlsx b/east/data/RSI_data_20250320_2.xlsx new file mode 100644 index 0000000..4b4aa25 Binary files /dev/null and b/east/data/RSI_data_20250320_2.xlsx differ diff --git a/east/data/RSI_data_20250320_3.xlsx b/east/data/RSI_data_20250320_3.xlsx new file mode 100644 index 0000000..3e7decc Binary files /dev/null and b/east/data/RSI_data_20250320_3.xlsx differ diff --git a/east/data/RSI_data_20250320_4.xlsx b/east/data/RSI_data_20250320_4.xlsx new file mode 100644 index 0000000..f5a0a03 Binary files /dev/null and b/east/data/RSI_data_20250320_4.xlsx differ diff --git a/east/data/RSI_data_20250320_5.xlsx b/east/data/RSI_data_20250320_5.xlsx new file mode 100644 index 0000000..1f89c78 Binary files /dev/null and b/east/data/RSI_data_20250320_5.xlsx differ diff --git a/east/data/RSI_data_20250428.xlsx b/east/data/RSI_data_20250428.xlsx new file mode 100644 index 0000000..c0cff82 Binary files /dev/null and b/east/data/RSI_data_20250428.xlsx differ diff --git a/east/data/RSI_data_20250510.xlsx b/east/data/RSI_data_20250510.xlsx new file mode 100644 index 0000000..448fb54 Binary files /dev/null and b/east/data/RSI_data_20250510.xlsx differ diff --git a/east/data/RSI_data_20250510_1.xlsx b/east/data/RSI_data_20250510_1.xlsx new file mode 100644 index 0000000..62a810c Binary files /dev/null and b/east/data/RSI_data_20250510_1.xlsx differ diff --git a/east/data/fund_flow_ranking_20241214.xlsx b/east/data/fund_flow_ranking_20241214.xlsx new file mode 100644 index 0000000..b655c58 Binary files /dev/null and b/east/data/fund_flow_ranking_20241214.xlsx differ diff --git a/east/data/fund_flow_ranking_20241214_1.xlsx b/east/data/fund_flow_ranking_20241214_1.xlsx new file mode 100644 index 0000000..da923df Binary files /dev/null and b/east/data/fund_flow_ranking_20241214_1.xlsx differ diff --git a/east/data/fund_flow_ranking_20241214_2.xlsx b/east/data/fund_flow_ranking_20241214_2.xlsx new file mode 100644 index 0000000..cbebf0b Binary files /dev/null and b/east/data/fund_flow_ranking_20241214_2.xlsx differ diff --git a/east/data/stock_data_000001_20241214.xlsx b/east/data/stock_data_000001_20241214.xlsx new file mode 100644 index 0000000..4e3a4da Binary files /dev/null and b/east/data/stock_data_000001_20241214.xlsx differ diff --git a/east/data/stock_data_000001_20241214_1.xlsx b/east/data/stock_data_000001_20241214_1.xlsx new file mode 100644 index 0000000..16b2cea Binary files /dev/null and b/east/data/stock_data_000001_20241214_1.xlsx differ diff --git a/east/data/stock_data_000001_20241214_2.xlsx b/east/data/stock_data_000001_20241214_2.xlsx new file mode 100644 index 0000000..2b8400a Binary files /dev/null and b/east/data/stock_data_000001_20241214_2.xlsx differ diff --git a/east/data/stock_data_000001_20241214_3.xlsx b/east/data/stock_data_000001_20241214_3.xlsx new file mode 100644 index 0000000..bd185d6 Binary files /dev/null and b/east/data/stock_data_000001_20241214_3.xlsx differ diff --git a/east/data/stock_data_000001_20241214_4.xlsx b/east/data/stock_data_000001_20241214_4.xlsx new file mode 100644 index 0000000..e3c8eca Binary files /dev/null and b/east/data/stock_data_000001_20241214_4.xlsx differ diff --git a/east/data/stock_data_000001_20250222.xlsx b/east/data/stock_data_000001_20250222.xlsx new file mode 100644 index 0000000..e64c83c Binary files /dev/null and b/east/data/stock_data_000001_20250222.xlsx differ diff --git a/east/data/stock_data_000001_20250222_1.xlsx b/east/data/stock_data_000001_20250222_1.xlsx new file mode 100644 index 0000000..5217410 Binary files /dev/null and b/east/data/stock_data_000001_20250222_1.xlsx differ diff --git a/east/data/stock_data_000001_20250222_10.xlsx b/east/data/stock_data_000001_20250222_10.xlsx new file mode 100644 index 0000000..d900b76 Binary files /dev/null and b/east/data/stock_data_000001_20250222_10.xlsx differ diff --git a/east/data/stock_data_000001_20250222_11.xlsx b/east/data/stock_data_000001_20250222_11.xlsx new file mode 100644 index 0000000..cb0cdb5 Binary files /dev/null and b/east/data/stock_data_000001_20250222_11.xlsx differ diff --git a/east/data/stock_data_000001_20250222_12.xlsx b/east/data/stock_data_000001_20250222_12.xlsx new file mode 100644 index 0000000..265ff55 Binary files /dev/null and b/east/data/stock_data_000001_20250222_12.xlsx differ diff --git a/east/data/stock_data_000001_20250222_13.xlsx b/east/data/stock_data_000001_20250222_13.xlsx new file mode 100644 index 0000000..de1c49e Binary files /dev/null and b/east/data/stock_data_000001_20250222_13.xlsx differ diff --git a/east/data/stock_data_000001_20250222_14.xlsx b/east/data/stock_data_000001_20250222_14.xlsx new file mode 100644 index 0000000..2ce1e0f Binary files /dev/null and b/east/data/stock_data_000001_20250222_14.xlsx differ diff --git a/east/data/stock_data_000001_20250222_15.xlsx b/east/data/stock_data_000001_20250222_15.xlsx new file mode 100644 index 0000000..f455cfe Binary files /dev/null and b/east/data/stock_data_000001_20250222_15.xlsx differ diff --git a/east/data/stock_data_000001_20250222_16.xlsx b/east/data/stock_data_000001_20250222_16.xlsx new file mode 100644 index 0000000..8a02e98 Binary files /dev/null and b/east/data/stock_data_000001_20250222_16.xlsx differ diff --git a/east/data/stock_data_000001_20250222_2.xlsx b/east/data/stock_data_000001_20250222_2.xlsx new file mode 100644 index 0000000..c8969ed Binary files /dev/null and b/east/data/stock_data_000001_20250222_2.xlsx differ diff --git a/east/data/stock_data_000001_20250222_3.xlsx b/east/data/stock_data_000001_20250222_3.xlsx new file mode 100644 index 0000000..575673d Binary files /dev/null and b/east/data/stock_data_000001_20250222_3.xlsx differ diff --git a/east/data/stock_data_000001_20250222_4.xlsx b/east/data/stock_data_000001_20250222_4.xlsx new file mode 100644 index 0000000..0d7d12e Binary files /dev/null and b/east/data/stock_data_000001_20250222_4.xlsx differ diff --git a/east/data/stock_data_000001_20250222_5.xlsx b/east/data/stock_data_000001_20250222_5.xlsx new file mode 100644 index 0000000..f495a8a Binary files /dev/null and b/east/data/stock_data_000001_20250222_5.xlsx differ diff --git a/east/data/stock_data_000001_20250222_6.xlsx b/east/data/stock_data_000001_20250222_6.xlsx new file mode 100644 index 0000000..ac943fb Binary files /dev/null and b/east/data/stock_data_000001_20250222_6.xlsx differ diff --git a/east/data/stock_data_000001_20250222_7.xlsx b/east/data/stock_data_000001_20250222_7.xlsx new file mode 100644 index 0000000..62027c9 Binary files /dev/null and b/east/data/stock_data_000001_20250222_7.xlsx differ diff --git a/east/data/stock_data_000001_20250222_8.xlsx b/east/data/stock_data_000001_20250222_8.xlsx new file mode 100644 index 0000000..aa82e98 Binary files /dev/null and b/east/data/stock_data_000001_20250222_8.xlsx differ diff --git a/east/data/stock_data_000001_20250222_9.xlsx b/east/data/stock_data_000001_20250222_9.xlsx new file mode 100644 index 0000000..c4f26e8 Binary files /dev/null and b/east/data/stock_data_000001_20250222_9.xlsx differ diff --git a/east/data/stock_data_000001_20250224.xlsx b/east/data/stock_data_000001_20250224.xlsx new file mode 100644 index 0000000..54127b5 Binary files /dev/null and b/east/data/stock_data_000001_20250224.xlsx differ diff --git a/east/data/stock_data_000001_20250224_1.xlsx b/east/data/stock_data_000001_20250224_1.xlsx new file mode 100644 index 0000000..247360d Binary files /dev/null and b/east/data/stock_data_000001_20250224_1.xlsx differ diff --git a/east/data/stock_data_000001_20250225.xlsx b/east/data/stock_data_000001_20250225.xlsx new file mode 100644 index 0000000..685d5d8 Binary files /dev/null and b/east/data/stock_data_000001_20250225.xlsx differ diff --git a/east/data/stock_data_000001_20250227.xlsx b/east/data/stock_data_000001_20250227.xlsx new file mode 100644 index 0000000..aba6f32 Binary files /dev/null and b/east/data/stock_data_000001_20250227.xlsx differ diff --git a/east/data/stock_data_000001_20250228.xlsx b/east/data/stock_data_000001_20250228.xlsx new file mode 100644 index 0000000..d445e5f Binary files /dev/null and b/east/data/stock_data_000001_20250228.xlsx differ diff --git a/east/data/stock_data_000001_20250228_1.xlsx b/east/data/stock_data_000001_20250228_1.xlsx new file mode 100644 index 0000000..21fa1be Binary files /dev/null and b/east/data/stock_data_000001_20250228_1.xlsx differ diff --git a/east/data/stock_data_000001_20250320.xlsx b/east/data/stock_data_000001_20250320.xlsx new file mode 100644 index 0000000..f331153 Binary files /dev/null and b/east/data/stock_data_000001_20250320.xlsx differ diff --git a/east/data/stock_data_000001_20250320_1.xlsx b/east/data/stock_data_000001_20250320_1.xlsx new file mode 100644 index 0000000..db6ceb1 Binary files /dev/null and b/east/data/stock_data_000001_20250320_1.xlsx differ diff --git a/east/data/stock_data_000001_20250320_2.xlsx b/east/data/stock_data_000001_20250320_2.xlsx new file mode 100644 index 0000000..3727c6c Binary files /dev/null and b/east/data/stock_data_000001_20250320_2.xlsx differ diff --git a/east/data/stock_data_399001_20241214.xlsx b/east/data/stock_data_399001_20241214.xlsx new file mode 100644 index 0000000..5a51e84 Binary files /dev/null and b/east/data/stock_data_399001_20241214.xlsx differ diff --git a/east/data/stock_data_399001_20241214_1.xlsx b/east/data/stock_data_399001_20241214_1.xlsx new file mode 100644 index 0000000..607d969 Binary files /dev/null and b/east/data/stock_data_399001_20241214_1.xlsx differ diff --git a/east/data/stock_data_399001_20241214_2.xlsx b/east/data/stock_data_399001_20241214_2.xlsx new file mode 100644 index 0000000..6313ae2 Binary files /dev/null and b/east/data/stock_data_399001_20241214_2.xlsx differ diff --git a/east/data/stock_data_399001_20241214_3.xlsx b/east/data/stock_data_399001_20241214_3.xlsx new file mode 100644 index 0000000..2ef581d Binary files /dev/null and b/east/data/stock_data_399001_20241214_3.xlsx differ diff --git a/east/data/stock_data_399001_20250222.xlsx b/east/data/stock_data_399001_20250222.xlsx new file mode 100644 index 0000000..365b226 Binary files /dev/null and b/east/data/stock_data_399001_20250222.xlsx differ diff --git a/east/data/stock_data_399001_20250222_1.xlsx b/east/data/stock_data_399001_20250222_1.xlsx new file mode 100644 index 0000000..8be2340 Binary files /dev/null and b/east/data/stock_data_399001_20250222_1.xlsx differ diff --git a/east/data/stock_data_399001_20250222_2.xlsx b/east/data/stock_data_399001_20250222_2.xlsx new file mode 100644 index 0000000..da50d70 Binary files /dev/null and b/east/data/stock_data_399001_20250222_2.xlsx differ diff --git a/east/data/stock_data_399001_20250222_3.xlsx b/east/data/stock_data_399001_20250222_3.xlsx new file mode 100644 index 0000000..5beb509 Binary files /dev/null and b/east/data/stock_data_399001_20250222_3.xlsx differ diff --git a/east/data/stock_data_399001_20250222_4.xlsx b/east/data/stock_data_399001_20250222_4.xlsx new file mode 100644 index 0000000..98a07c2 Binary files /dev/null and b/east/data/stock_data_399001_20250222_4.xlsx differ diff --git a/east/data/stock_data_399001_20250222_5.xlsx b/east/data/stock_data_399001_20250222_5.xlsx new file mode 100644 index 0000000..66a904c Binary files /dev/null and b/east/data/stock_data_399001_20250222_5.xlsx differ diff --git a/east/data/stock_data_399001_20250222_6.xlsx b/east/data/stock_data_399001_20250222_6.xlsx new file mode 100644 index 0000000..afa4dc6 Binary files /dev/null and b/east/data/stock_data_399001_20250222_6.xlsx differ diff --git a/east/data/stock_data_399001_20250222_7.xlsx b/east/data/stock_data_399001_20250222_7.xlsx new file mode 100644 index 0000000..aa57e5b Binary files /dev/null and b/east/data/stock_data_399001_20250222_7.xlsx differ diff --git a/east/data/stock_data_399001_20250222_8.xlsx b/east/data/stock_data_399001_20250222_8.xlsx new file mode 100644 index 0000000..3d7ce9f Binary files /dev/null and b/east/data/stock_data_399001_20250222_8.xlsx differ diff --git a/east/data/stock_data_399001_20250224.xlsx b/east/data/stock_data_399001_20250224.xlsx new file mode 100644 index 0000000..7e98941 Binary files /dev/null and b/east/data/stock_data_399001_20250224.xlsx differ diff --git a/east/data/stock_data_399001_20250224_1.xlsx b/east/data/stock_data_399001_20250224_1.xlsx new file mode 100644 index 0000000..faf5212 Binary files /dev/null and b/east/data/stock_data_399001_20250224_1.xlsx differ diff --git a/east/data/stock_data_399001_20250225.xlsx b/east/data/stock_data_399001_20250225.xlsx new file mode 100644 index 0000000..12303bd Binary files /dev/null and b/east/data/stock_data_399001_20250225.xlsx differ diff --git a/east/data/stock_data_399001_20250227.xlsx b/east/data/stock_data_399001_20250227.xlsx new file mode 100644 index 0000000..6bc35c0 Binary files /dev/null and b/east/data/stock_data_399001_20250227.xlsx differ diff --git a/east/data/stock_data_399001_20250228.xlsx b/east/data/stock_data_399001_20250228.xlsx new file mode 100644 index 0000000..e8ea052 Binary files /dev/null and b/east/data/stock_data_399001_20250228.xlsx differ diff --git a/east/data/stock_data_399001_20250228_1.xlsx b/east/data/stock_data_399001_20250228_1.xlsx new file mode 100644 index 0000000..a4cb812 Binary files /dev/null and b/east/data/stock_data_399001_20250228_1.xlsx differ diff --git a/east/data/stock_data_399001_20250228_2.xlsx b/east/data/stock_data_399001_20250228_2.xlsx new file mode 100644 index 0000000..50c4134 Binary files /dev/null and b/east/data/stock_data_399001_20250228_2.xlsx differ diff --git a/east/data/stock_data_399001_20250320.xlsx b/east/data/stock_data_399001_20250320.xlsx new file mode 100644 index 0000000..73b1bf2 Binary files /dev/null and b/east/data/stock_data_399001_20250320.xlsx differ diff --git a/east/data/stock_data_399001_20250320_1.xlsx b/east/data/stock_data_399001_20250320_1.xlsx new file mode 100644 index 0000000..2e8e6ee Binary files /dev/null and b/east/data/stock_data_399001_20250320_1.xlsx differ diff --git a/east/data/stock_data_399001_20250428.xlsx b/east/data/stock_data_399001_20250428.xlsx new file mode 100644 index 0000000..ce2a060 Binary files /dev/null and b/east/data/stock_data_399001_20250428.xlsx differ diff --git a/east/data/stock_data_399001_20250510.xlsx b/east/data/stock_data_399001_20250510.xlsx new file mode 100644 index 0000000..169b332 Binary files /dev/null and b/east/data/stock_data_399001_20250510.xlsx differ diff --git a/east/data/stock_data_399003_20241214.xlsx b/east/data/stock_data_399003_20241214.xlsx new file mode 100644 index 0000000..0d189b6 Binary files /dev/null and b/east/data/stock_data_399003_20241214.xlsx differ diff --git a/east/data/stock_data_399003_20241214_1.xlsx b/east/data/stock_data_399003_20241214_1.xlsx new file mode 100644 index 0000000..d90d727 Binary files /dev/null and b/east/data/stock_data_399003_20241214_1.xlsx differ diff --git a/east/data/stock_data_399003_20241214_2.xlsx b/east/data/stock_data_399003_20241214_2.xlsx new file mode 100644 index 0000000..d364644 Binary files /dev/null and b/east/data/stock_data_399003_20241214_2.xlsx differ diff --git a/east/data/stock_data_399003_20241214_3.xlsx b/east/data/stock_data_399003_20241214_3.xlsx new file mode 100644 index 0000000..4484863 Binary files /dev/null and b/east/data/stock_data_399003_20241214_3.xlsx differ diff --git a/east/data/stock_data_399003_20250222.xlsx b/east/data/stock_data_399003_20250222.xlsx new file mode 100644 index 0000000..33d2527 Binary files /dev/null and b/east/data/stock_data_399003_20250222.xlsx differ diff --git a/east/data/stock_data_399003_20250222_1.xlsx b/east/data/stock_data_399003_20250222_1.xlsx new file mode 100644 index 0000000..eeb4a00 Binary files /dev/null and b/east/data/stock_data_399003_20250222_1.xlsx differ diff --git a/east/data/stock_data_399003_20250222_2.xlsx b/east/data/stock_data_399003_20250222_2.xlsx new file mode 100644 index 0000000..d3a0884 Binary files /dev/null and b/east/data/stock_data_399003_20250222_2.xlsx differ diff --git a/east/data/stock_data_399003_20250222_3.xlsx b/east/data/stock_data_399003_20250222_3.xlsx new file mode 100644 index 0000000..295edda Binary files /dev/null and b/east/data/stock_data_399003_20250222_3.xlsx differ diff --git a/east/data/stock_data_399006_20250222.xlsx b/east/data/stock_data_399006_20250222.xlsx new file mode 100644 index 0000000..5550da5 Binary files /dev/null and b/east/data/stock_data_399006_20250222.xlsx differ diff --git a/east/data/stock_data_399006_20250222_1.xlsx b/east/data/stock_data_399006_20250222_1.xlsx new file mode 100644 index 0000000..2869a94 Binary files /dev/null and b/east/data/stock_data_399006_20250222_1.xlsx differ diff --git a/east/data/stock_data_399006_20250224.xlsx b/east/data/stock_data_399006_20250224.xlsx new file mode 100644 index 0000000..39a1241 Binary files /dev/null and b/east/data/stock_data_399006_20250224.xlsx differ diff --git a/east/data/stock_data_399006_20250224_1.xlsx b/east/data/stock_data_399006_20250224_1.xlsx new file mode 100644 index 0000000..4c49c74 Binary files /dev/null and b/east/data/stock_data_399006_20250224_1.xlsx differ diff --git a/east/data/stock_data_399006_20250225.xlsx b/east/data/stock_data_399006_20250225.xlsx new file mode 100644 index 0000000..63eeced Binary files /dev/null and b/east/data/stock_data_399006_20250225.xlsx differ diff --git a/east/data/stock_data_399006_20250227.xlsx b/east/data/stock_data_399006_20250227.xlsx new file mode 100644 index 0000000..c2b44ed Binary files /dev/null and b/east/data/stock_data_399006_20250227.xlsx differ diff --git a/east/data/stock_data_399006_20250228.xlsx b/east/data/stock_data_399006_20250228.xlsx new file mode 100644 index 0000000..f738295 Binary files /dev/null and b/east/data/stock_data_399006_20250228.xlsx differ diff --git a/east/data/stock_data_399006_20250228_1.xlsx b/east/data/stock_data_399006_20250228_1.xlsx new file mode 100644 index 0000000..3a0b322 Binary files /dev/null and b/east/data/stock_data_399006_20250228_1.xlsx differ diff --git a/east/data/stock_data_399006_20250320.xlsx b/east/data/stock_data_399006_20250320.xlsx new file mode 100644 index 0000000..9fd83f1 Binary files /dev/null and b/east/data/stock_data_399006_20250320.xlsx differ diff --git a/east/data/stock_data_399006_20250320_1.xlsx b/east/data/stock_data_399006_20250320_1.xlsx new file mode 100644 index 0000000..4e39d08 Binary files /dev/null and b/east/data/stock_data_399006_20250320_1.xlsx differ diff --git a/east/data/stock_data_399006_20250320_2.xlsx b/east/data/stock_data_399006_20250320_2.xlsx new file mode 100644 index 0000000..9ddcf7c Binary files /dev/null and b/east/data/stock_data_399006_20250320_2.xlsx differ diff --git a/east/data/stock_data_399006_20250510.xlsx b/east/data/stock_data_399006_20250510.xlsx new file mode 100644 index 0000000..cb4a630 Binary files /dev/null and b/east/data/stock_data_399006_20250510.xlsx differ diff --git a/east/diagram.PY b/east/diagram.PY new file mode 100644 index 0000000..89ee60c --- /dev/null +++ b/east/diagram.PY @@ -0,0 +1,182 @@ +import requests +import pandas as pd +import json +from datetime import datetime +import matplotlib.pyplot as plt +import matplotlib +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg + +matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体 +matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + + +def get_fund_flow_data(): + """获取资金流向数据,包括板块和股票名称""" + url = "https://push2delay.eastmoney.com/api/qt/clist/get" + + params = { + 'fid': 'f184', + 'po': '1', + 'pz': '50', + 'pn': '1', + 'np': '1', + 'fltt': '2', + 'invt': '2', + 'fields': 'f2,f3,f12,f13,f14,f62,f184,f225,f165,f263,f109,f175,f264,f160,f100,f124,f265,f1', + 'ut': 'b2884a393a59ad64002292a3e90d46a5', + 'fs': 'm:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2', + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Referer': 'https://data.eastmoney.com/zjlx/list.html' + } + + try: + response = requests.get(url, params=params, headers=headers) + data = json.loads(response.text) + + if 'data' not in data or 'diff' not in data['data']: + raise Exception("未能获取到数据") + + items = data['data']['diff'] + + parsed_data = [] + for idx, item in enumerate(items[:50]): + # 获取每个板块的股票名称 + stock_names = item.get('f14', '') + + if isinstance(stock_names, str): + stock_names = stock_names.split(';') # 假设股票名称以分号分隔 + else: + stock_names = [] # 如果 f62 为空或格式不正确,设置为空列表 + + if not stock_names: + continue + + # 确保涨停数是有效的数字,并且为正数 + limit_up_count = item.get('f165', 0) + if not isinstance(limit_up_count, (int, float)) or limit_up_count < 0: + limit_up_count = 0 + + parsed_data.append({ + '板块': item.get('f100', '未知板块'), + '涨停数': limit_up_count, # 获取涨停股数,确保是非负数 + }) + + # 确保至少有一些数据 + if not parsed_data: + raise Exception("未能解析到有效的板块数据") + + return pd.DataFrame(parsed_data) + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def create_pie_chart(data): + """创建涨停股数的扇形图""" + # 确保所有要绘制的值都是正数 + filtered_data = data[data['涨停数'] > 0].copy() + + # 如果没有正数值,给用户提示并返回 + if filtered_data.empty: + print("没有找到正数的涨停股数,无法绘制饼图") + return None + + # 获取前15个有效的板块的涨停股数 + filtered_data = filtered_data.sort_values('涨停数', ascending=False).head(15) + sectors = filtered_data['板块'].tolist() + pie_data = filtered_data['涨停数'].tolist() + + # 确保数据长度一致且非空 + if not sectors or not pie_data or len(sectors) != len(pie_data): + print("数据不一致或为空,无法绘制饼图") + return None + + # 打印一下要绘制的数据,用于调试 + print("要绘制的数据:") + for i, (sector, value) in enumerate(zip(sectors, pie_data)): + print(f"{i + 1}. {sector}: {value}") + + root = tk.Tk() + root.title("前15板块涨停股数占比") + root.geometry("800x600") + root.configure(bg='#2C3E50') # 深色背景 + + # 创建Matplotlib图形 + fig = plt.Figure(figsize=(8, 6), facecolor='#FFFFFF') + ax = fig.add_subplot(111) + + # 设置图形背景颜色 + ax.set_facecolor('#2C3E50') + + # 绘制扇形图 + wedges, texts, autotexts = ax.pie( + pie_data, + labels=sectors, + autopct='%1.1f%%', + startangle=140, + colors=plt.cm.Paired.colors, # 使用配色方案 + wedgeprops={'edgecolor': 'black', 'linewidth': 0.5} # 设置扇形边框 + ) + + # 设置标题 + ax.set_title('前15板块涨停股数占比', fontsize=16, color='black', pad=20) + + # 设置标签样式 + for text in texts: + text.set_fontsize(10) + text.set_color('black') + + for autotext in autotexts: + autotext.set_fontsize(10) + autotext.set_color('black') + + # 设置图例 + ax.legend(wedges, sectors, title="板块", loc="upper left", fontsize=10, bbox_to_anchor=(1, 1)) + + # 将图形添加到Tkinter窗口 + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12), bg='#C82423', fg='white', + padx=10, pady=5) + close_button.pack(side=tk.BOTTOM, pady=10) + + # 启动Tkinter主循环 + root.mainloop() + + return root + + +def main(): + # 获取资金流向数据 + print("正在获取资金流向数据...") + data = get_fund_flow_data() + + if data is not None: + # 保存数据到Excel + current_date = datetime.now().strftime('%Y%m%d') + output_file = f'fund_flow_ranking_{current_date}.xlsx' + data.to_excel(output_file, index=False) + print(f"资金流向数据已保存到: {output_file}") + + # 检查数据是否包含有效的涨停数 + if data['涨停数'].max() <= 0: + print("警告: 没有找到正的涨停数据,无法绘制饼图") + else: + # 创建并显示扇形图 + print("正在创建扇形图...") + create_pie_chart(data) + else: + print("获取数据失败,请检查网络连接或接口可用性。") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/east/main.py b/east/main.py new file mode 100644 index 0000000..590690d --- /dev/null +++ b/east/main.py @@ -0,0 +1,109 @@ +import requests +import json +import pandas as pd +import matplotlib.pyplot as plt + +# 设置 Matplotlib 使用的中文字体 +plt.rcParams['font.sans-serif'] = ['SimHei'] # 选择合适的中文字体 +plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + +def get_fund_flow_data(): + """获取资金流向数据""" + url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112309006219872217847_1740232310161&fid=f62&po=1&pz=50&pn=1&np=1&fltt=2&invt=2&ut=8dec03ba335b81bf4ebdf7b29ec27d15&fs=m%3A90+t%3A2&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13" + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + } + + try: + response = requests.get(url, headers=headers) + # 去除 JSONP 格式中的回调函数部分 + response_text = response.text[response.text.find('(') + 1: response.text.rfind(')')] + data = json.loads(response_text) + + if 'data' not in data or 'diff' not in data['data']: + raise Exception("未能获取到数据") + + items = data['data']['diff'] + + parsed_data = [] + for item in items: + # 获取增仓数据 + increase_position = item['f72'] + # 假设你想加入的另一个数据项,比如资金流入(这里只做示范) + fund_inflow = item['f62'] # 可以根据实际需要更改为其他数据字段 + parsed_data.append({ + '板块': item['f14'], # 板块名称 + '增仓': increase_position, # 增仓值 + '资金流入': fund_inflow # 假设另一个对比数据 + }) + + # 将数据转为DataFrame + df = pd.DataFrame(parsed_data) + # 按增仓排序 + df_sorted = df.sort_values(by='增仓', ascending=False) + + return df_sorted + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def plot_combined_chart(data): + """绘制增仓排名的柱状图与折线图结合""" + # 获取前10个板块及其增仓数据 + sectors = data['板块'].tolist()[:10] + increase_positions = data['增仓'].tolist()[:10] + fund_inflows = data['资金流入'].tolist()[:10] # 资金流入作为对比数据 + + # 创建一个图形 + fig, ax1 = plt.subplots(figsize=(12, 7)) + + # 绘制增仓值的柱状图 + ax1.bar(sectors, increase_positions, color='b', alpha=0.6, label='增仓值', width=0.4) + + # 设置柱状图的Y轴标签 + ax1.set_xlabel('板块', fontsize=14) + ax1.set_ylabel('增仓值', fontsize=14, color='b') + ax1.tick_params(axis='y', labelcolor='b') + + # 创建第二个Y轴来绘制折线图 + ax2 = ax1.twinx() + ax2.plot(sectors, increase_positions, color='r', marker='o', label='增仓趋势', linewidth=2) + + # 添加资金流入的折线 + ax2.plot(sectors, fund_inflows, color='g', marker='^', label='资金流入', linewidth=2) + + # 设置折线图的Y轴标签 + ax2.set_ylabel('趋势值', fontsize=14, color='r') + ax2.tick_params(axis='y', labelcolor='r') + + # 设置标题 + plt.title('增仓与资金流入对比 - 柱状图与折线图结合', fontsize=16) + + # 显示图形 + plt.xticks(rotation=45) # 使X轴标签旋转,防止重叠 + fig.tight_layout() # 自动调整布局,防止标签被遮挡 + + # 添加图例 + ax1.legend(loc='upper left') + ax2.legend(loc='upper right') + + plt.show() + + +def main(): + # 获取数据并计算 + print("正在获取资金流向数据...") + data = get_fund_flow_data() + + if data is not None: + print("正在生成增仓与资金流入对比的柱状图与折线图结合...") + plot_combined_chart(data) + else: + print("获取数据失败,请检查网络连接或接口可用性。") + + +if __name__ == "__main__": + main() diff --git a/east/msyh.ttc b/east/msyh.ttc new file mode 100644 index 0000000..ea174b2 Binary files /dev/null and b/east/msyh.ttc differ diff --git a/east/rsi-1.py b/east/rsi-1.py new file mode 100644 index 0000000..2ef5f31 --- /dev/null +++ b/east/rsi-1.py @@ -0,0 +1,245 @@ +import requests +import pandas as pd +import json +from datetime import datetime, timedelta +import time +import matplotlib.pyplot as plt +import matplotlib + +# 设置全局字体 +matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'SimSun', 'Arial Unicode MS'] +matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + + +def get_stock_data(stock_code, market_code, days=90): + """获取股票历史数据,限制为过去90天的数据""" + url = "http://push2his.eastmoney.com/api/qt/stock/kline/get" + + # 获取最近90天的数据 + end_date = datetime.now() + start_date = end_date - timedelta(days=days) + + # 格式化日期 + beg = start_date.strftime('%Y%m%d') + end = end_date.strftime('%Y%m%d') + + params = { + 'secid': f'{market_code}.{stock_code}', + 'fields1': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13', + 'fields2': 'f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61', + 'klt': '101', # 101表示日K线数据 + 'fqt': '0', # 不复权 + 'beg': beg, # 起始日期 + 'end': end, # 结束日期 + 'lmt': days, # 获取的天数 + '_': int(time.time() * 1000) + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + + try: + response = requests.get(url, params=params, headers=headers) + data = json.loads(response.text) + + if data['data'] is None: + raise Exception(f"未能获取到{stock_code}的数据") + + stock_data = data['data']['klines'] + + parsed_data = [] + for item in stock_data: + values = item.split(',') + parsed_data.append({ + '日期': values[0], + '开盘价': float(values[1]), + '收盘价': float(values[2]), + '最高价': float(values[3]), + '最低价': float(values[4]), + '成交量': float(values[5]), + '成交额': float(values[6]), + '振幅': float(values[7]), + '涨跌幅': float(values[8]), + '涨跌额': float(values[9]), + '换手率': float(values[10]) + }) + + df = pd.DataFrame(parsed_data) + df['RSI'] = calculate_rsi(df['收盘价'].values) + + # 返回90天的数据,但仅保留最后30天的数据用于可视化 + return df.tail(30) # 只返回最后30天的数据 + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def calculate_rsi(prices, periods=14): + """计算RSI指标""" + rsi = np.zeros_like(prices) + if len(prices) <= periods: + return rsi + + changes = np.diff(prices) + gains = np.where(changes > 0, changes, 0) + losses = np.where(changes < 0, -changes, 0) + + avg_gain = np.mean(gains[:periods]) + avg_loss = np.mean(losses[:periods]) + + if avg_loss == 0: + rsi[periods] = 100 + else: + rs = avg_gain / avg_loss + rsi[periods] = 100 - (100 / (1 + rs)) + + for i in range(periods + 1, len(prices)): + avg_gain = (avg_gain * (periods - 1) + gains[i - 1]) / periods + avg_loss = (avg_loss * (periods - 1) + losses[i - 1]) / periods + + if avg_loss == 0: + rsi[i] = 100 + else: + rs = avg_gain / avg_loss + rsi[i] = 100 - (100 / (1 + rs)) + + # 确保RSI值在0到100之间 + rsi[i] = max(0, min(rsi[i], 100)) + + return rsi + + +def create_visualization_window(rsi_data): + """创建可视化窗口""" + root = tk.Tk() + root.title("上证指数 RSI走势") + root.geometry("1200x800") + + # 创建Figure + fig = Figure(figsize=(12, 8), dpi=100) + ax = fig.add_subplot(111) + + # 设置样式 + ax.set_facecolor('#f0f0f0') + fig.patch.set_facecolor('white') + + # 绘制RSI线 + for index_name, data in rsi_data.items(): + dates = pd.to_datetime(data['日期']) + ax.plot(dates, data['RSI'], label=index_name, color='#2878B5', linewidth=2, marker='o', markersize=4) + + # 添加过度买入/卖出区域 + ax.axhline(y=70, color='#C82423', linestyle='--', alpha=0.3) + ax.axhline(y=30, color='#2878B5', linestyle='--', alpha=0.3) + ax.fill_between(ax.get_xlim(), 70, 100, color='#C82423', alpha=0.1) + ax.fill_between(ax.get_xlim(), 0, 30, color='#2878B5', alpha=0.1) + + # 设置y轴范围 + ax.set_ylim(0, 100) + + # 设置标题和标签 + ax.set_title('上证指数 RSI走势', fontsize=16, pad=20) + ax.set_xlabel('日期', fontsize=12) + ax.set_ylabel('RSI值', fontsize=12) + + # 设置图例 + ax.legend(loc='best', fontsize=10) + + # 设置网格 + ax.grid(True, linestyle='--', alpha=0.3) + + # 调整x轴标签 + plt.setp(ax.get_xticklabels(), rotation=45) + + # 调整布局 + fig.tight_layout() + + # 创建canvas + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12)) + close_button.pack(side=tk.BOTTOM, pady=10) + + return root + + +def save_to_excel(df, filename): + """安全地保存数据到Excel文件""" + try: + # 尝试在data子目录中保存文件 + import os + data_dir = 'data' + + # 创建data目录(如果不存在) + if not os.path.exists(data_dir): + os.makedirs(data_dir) + + # 构建完整的文件路径 + file_path = os.path.join(data_dir, filename) + + # 如果文件已存在,尝试生成一个新的文件名 + base_name = os.path.splitext(filename)[0] + extension = os.path.splitext(filename)[1] + counter = 1 + while os.path.exists(file_path): + new_filename = f"{base_name}_{counter}{extension}" + file_path = os.path.join(data_dir, new_filename) + counter += 1 + + # 保存文件 + df.to_excel(file_path, index=False) + print(f"数据已成功保存到: {file_path}") + return True + except Exception as e: + print(f"保存文件时发生错误: {str(e)}") + return False + + +def main(): + # 只爬取上证指数的数据 + indices = [ + {'code': '000001', 'market': 1, 'name': '上证指数'} + ] + + # 存储上证指数的数据 + rsi_data = {} + current_date = datetime.now().strftime('%Y%m%d') + + # 爬取上证指数的数据 + for index in indices: + df = get_stock_data(index['code'], index['market'], days=90) # 获取90天的数据 + if df is not None: + # 保存完整数据到Excel + output_file = f'stock_data_{index["code"]}_{current_date}.xlsx' + if save_to_excel(df, output_file): + # 保存RSI数据用于可视化 + rsi_data[index['name']] = df[['日期', 'RSI']] + + # 保存RSI数据到单独的Excel + rsi_df = pd.DataFrame() + first_dates = None + + for index_name, data in rsi_data.items(): + if first_dates is None: + first_dates = data['日期'] + rsi_df['日期'] = first_dates + rsi_df[f'{index_name}_RSI'] = data['RSI'] + + rsi_output = f'RSI_data_{current_date}.xlsx' + if save_to_excel(rsi_df, rsi_output): + # 创建并显示上证指数的RSI折线图 + root = create_visualization_window(rsi_data) + root.mainloop() + + +if __name__ == "__main__": + main() diff --git a/east/rsi-2.PY b/east/rsi-2.PY new file mode 100644 index 0000000..5b30e87 --- /dev/null +++ b/east/rsi-2.PY @@ -0,0 +1,244 @@ +import requests +import pandas as pd +import json +from datetime import datetime, timedelta +import time +import matplotlib.pyplot as plt +import matplotlib + +# 设置全局字体 +matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'SimSun', 'Arial Unicode MS'] +matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + + +def get_stock_data(stock_code, market_code, days=90): + """获取股票历史数据,限制为过去90天的数据""" + url = "http://push2his.eastmoney.com/api/qt/stock/kline/get" + + # 获取最近90天的数据 + end_date = datetime.now() + start_date = end_date - timedelta(days=days) + + # 格式化日期 + beg = start_date.strftime('%Y%m%d') + end = end_date.strftime('%Y%m%d') + + params = { + 'secid': f'{market_code}.{stock_code}', + 'fields1': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13', + 'fields2': 'f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61', + 'klt': '101', # 101表示日K线数据 + 'fqt': '0', # 不复权 + 'beg': beg, # 起始日期 + 'end': end, # 结束日期 + 'lmt': days, # 获取的天数 + '_': int(time.time() * 1000) + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + + try: + response = requests.get(url, params=params, headers=headers) + data = json.loads(response.text) + + if data['data'] is None: + raise Exception(f"未能获取到{stock_code}的数据") + + stock_data = data['data']['klines'] + + parsed_data = [] + for item in stock_data: + values = item.split(',') + parsed_data.append({ + '日期': values[0], + '开盘价': float(values[1]), + '收盘价': float(values[2]), + '最高价': float(values[3]), + '最低价': float(values[4]), + '成交量': float(values[5]), + '成交额': float(values[6]), + '振幅': float(values[7]), + '涨跌幅': float(values[8]), + '涨跌额': float(values[9]), + '换手率': float(values[10]) + }) + + df = pd.DataFrame(parsed_data) + df['RSI'] = calculate_rsi(df['收盘价'].values) + + # 返回90天的数据,但仅保留最后30天的数据用于可视化 + return df.tail(30) # 只返回最后30天的数据 + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def calculate_rsi(prices, periods=14): + """计算RSI指标""" + rsi = np.zeros_like(prices) + if len(prices) <= periods: + return rsi + + changes = np.diff(prices) + gains = np.where(changes > 0, changes, 0) + losses = np.where(changes < 0, -changes, 0) + + avg_gain = np.mean(gains[:periods]) + avg_loss = np.mean(losses[:periods]) + + if avg_loss == 0: + rsi[periods] = 100 + else: + rs = avg_gain / avg_loss + rsi[periods] = 100 - (100 / (1 + rs)) + + for i in range(periods + 1, len(prices)): + avg_gain = (avg_gain * (periods - 1) + gains[i - 1]) / periods + avg_loss = (avg_loss * (periods - 1) + losses[i - 1]) / periods + + if avg_loss == 0: + rsi[i] = 100 + else: + rs = avg_gain / avg_loss + rsi[i] = 100 - (100 / (1 + rs)) + + # 确保RSI值在0到100之间 + rsi[i] = max(0, min(rsi[i], 100)) + + return rsi + + +def create_visualization_window(rsi_data): + """创建可视化窗口""" + root = tk.Tk() + root.title("深证成指 RSI走势") # 修改标题为"深证成指 RSI走势" + root.geometry("1200x800") + + # 创建Figure + fig = Figure(figsize=(12, 8), dpi=100) + ax = fig.add_subplot(111) + + # 设置样式 + ax.set_facecolor('#f0f0f0') + fig.patch.set_facecolor('white') + + # 绘制RSI线 + for index_name, data in rsi_data.items(): + dates = pd.to_datetime(data['日期']) + ax.plot(dates, data['RSI'], label=index_name, color='#2878B5', linewidth=2, marker='o', markersize=4) + + # 添加过度买入/卖出区域 + ax.axhline(y=70, color='#C82423', linestyle='--', alpha=0.3) + ax.axhline(y=30, color='#2878B5', linestyle='--', alpha=0.3) + ax.fill_between(ax.get_xlim(), 70, 100, color='#C82423', alpha=0.1) + ax.fill_between(ax.get_xlim(), 0, 30, color='#2878B5', alpha=0.1) + + # 设置y轴范围 + ax.set_ylim(0, 100) + + # 设置标题和标签 + ax.set_title('深证成指 RSI走势', fontsize=16, pad=20) # 修改标题为"深证成指 RSI走势" + ax.set_xlabel('日期', fontsize=12) + ax.set_ylabel('RSI值', fontsize=12) + + # 设置图例 + ax.legend(loc='best', fontsize=10) + + # 设置网格 + ax.grid(True, linestyle='--', alpha=0.3) + + # 调整x轴标签 + plt.setp(ax.get_xticklabels(), rotation=45) + + # 调整布局 + fig.tight_layout() + + # 创建canvas + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12)) + close_button.pack(side=tk.BOTTOM, pady=10) + + return root + + +def save_to_excel(df, filename): + """安全地保存数据到Excel文件""" + try: + # 尝试在data子目录中保存文件 + import os + data_dir = 'data' + + # 创建data目录(如果不存在) + if not os.path.exists(data_dir): + os.makedirs(data_dir) + + # 构建完整的文件路径 + file_path = os.path.join(data_dir, filename) + + # 如果文件已存在,尝试生成一个新的文件名 + base_name = os.path.splitext(filename)[0] + extension = os.path.splitext(filename)[1] + counter = 1 + while os.path.exists(file_path): + new_filename = f"{base_name}_{counter}{extension}" + file_path = os.path.join(data_dir, new_filename) + counter += 1 + + # 保存文件 + df.to_excel(file_path, index=False) + print(f"数据已成功保存到: {file_path}") + return True + except Exception as e: + print(f"保存文件时发生错误: {str(e)}") + return False + + +def main(): + # 只爬取深证成指的数据 + indices = [ + {'code': '399001', 'market': 0, 'name': '深证成指'} # 修改为深证成指的代码和市场代码 + ] + + # 存储深证成指的数据 + rsi_data = {} + current_date = datetime.now().strftime('%Y%m%d') + + # 爬取深证成指的数据 + for index in indices: + df = get_stock_data(index['code'], index['market'], days=90) # 获取90天的数据 + if df is not None: + # 保存完整数据到Excel + output_file = f'stock_data_{index["code"]}_{current_date}.xlsx' + if save_to_excel(df, output_file): + # 保存RSI数据用于可视化 + rsi_data[index['name']] = df[['日期', 'RSI']] + + # 保存RSI数据到单独的Excel + rsi_df = pd.DataFrame() + first_dates = None + + for index_name, data in rsi_data.items(): + if first_dates is None: + first_dates = data['日期'] + rsi_df['日期'] = first_dates + rsi_df[f'{index_name}_RSI'] = data['RSI'] + + rsi_output = f'RSI_data_{current_date}.xlsx' + if save_to_excel(rsi_df, rsi_output): + # 创建并显示深证成指的RSI折线图 + root = create_visualization_window(rsi_data) + root.mainloop() + +if __name__ == "__main__": + main() diff --git a/east/rsi-3.py b/east/rsi-3.py new file mode 100644 index 0000000..dbb0652 --- /dev/null +++ b/east/rsi-3.py @@ -0,0 +1,244 @@ +import requests +import pandas as pd +import json +from datetime import datetime, timedelta +import time +import matplotlib.pyplot as plt +import matplotlib + +# 设置全局字体 +matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'SimSun', 'Arial Unicode MS'] +matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + + +def get_stock_data(stock_code, market_code, days=90): + """获取股票历史数据,限制为过去90天的数据""" + url = "http://push2his.eastmoney.com/api/qt/stock/kline/get" + + # 获取最近90天的数据 + end_date = datetime.now() + start_date = end_date - timedelta(days=days) + + # 格式化日期 + beg = start_date.strftime('%Y%m%d') + end = end_date.strftime('%Y%m%d') + + params = { + 'secid': f'{market_code}.{stock_code}', + 'fields1': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13', + 'fields2': 'f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61', + 'klt': '101', # 101表示日K线数据 + 'fqt': '0', # 不复权 + 'beg': beg, # 起始日期 + 'end': end, # 结束日期 + 'lmt': days, # 获取的天数 + '_': int(time.time() * 1000) + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + + try: + response = requests.get(url, params=params, headers=headers) + data = json.loads(response.text) + + if data['data'] is None: + raise Exception(f"未能获取到{stock_code}的数据") + + stock_data = data['data']['klines'] + + parsed_data = [] + for item in stock_data: + values = item.split(',') + parsed_data.append({ + '日期': values[0], + '开盘价': float(values[1]), + '收盘价': float(values[2]), + '最高价': float(values[3]), + '最低价': float(values[4]), + '成交量': float(values[5]), + '成交额': float(values[6]), + '振幅': float(values[7]), + '涨跌幅': float(values[8]), + '涨跌额': float(values[9]), + '换手率': float(values[10]) + }) + + df = pd.DataFrame(parsed_data) + df['RSI'] = calculate_rsi(df['收盘价'].values) + + # 返回90天的数据,但仅保留最后30天的数据用于可视化 + return df.tail(30) # 只返回最后30天的数据 + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def calculate_rsi(prices, periods=14): + """计算RSI指标""" + rsi = np.zeros_like(prices) + if len(prices) <= periods: + return rsi + + changes = np.diff(prices) + gains = np.where(changes > 0, changes, 0) + losses = np.where(changes < 0, -changes, 0) + + avg_gain = np.mean(gains[:periods]) + avg_loss = np.mean(losses[:periods]) + + if avg_loss == 0: + rsi[periods] = 100 + else: + rs = avg_gain / avg_loss + rsi[periods] = 100 - (100 / (1 + rs)) + + for i in range(periods + 1, len(prices)): + avg_gain = (avg_gain * (periods - 1) + gains[i - 1]) / periods + avg_loss = (avg_loss * (periods - 1) + losses[i - 1]) / periods + + if avg_loss == 0: + rsi[i] = 100 + else: + rs = avg_gain / avg_loss + rsi[i] = 100 - (100 / (1 + rs)) + + # 确保RSI值在0到100之间 + rsi[i] = max(0, min(rsi[i], 100)) + + return rsi + + +def create_visualization_window(rsi_data): + """创建可视化窗口""" + root = tk.Tk() + root.title("创业板指 RSI走势") # 修改标题为"创业板指 RSI走势" + root.geometry("1200x800") + + # 创建Figure + fig = Figure(figsize=(12, 8), dpi=100) + ax = fig.add_subplot(111) + + # 设置样式 + ax.set_facecolor('#f0f0f0') + fig.patch.set_facecolor('white') + + # 绘制RSI线 + for index_name, data in rsi_data.items(): + dates = pd.to_datetime(data['日期']) + ax.plot(dates, data['RSI'], label=index_name, color='#2878B5', linewidth=2, marker='o', markersize=4) + + # 添加过度买入/卖出区域 + ax.axhline(y=70, color='#C82423', linestyle='--', alpha=0.3) + ax.axhline(y=30, color='#2878B5', linestyle='--', alpha=0.3) + ax.fill_between(ax.get_xlim(), 70, 100, color='#C82423', alpha=0.1) + ax.fill_between(ax.get_xlim(), 0, 30, color='#2878B5', alpha=0.1) + + # 设置y轴范围 + ax.set_ylim(0, 100) + + # 设置标题和标签 + ax.set_title('创业板指 RSI走势', fontsize=16, pad=20) # 修改标题为"创业板指 RSI走势" + ax.set_xlabel('日期', fontsize=12) + ax.set_ylabel('RSI值', fontsize=12) + + # 设置图例 + ax.legend(loc='best', fontsize=10) + + # 设置网格 + ax.grid(True, linestyle='--', alpha=0.3) + + # 调整x轴标签 + plt.setp(ax.get_xticklabels(), rotation=45) + + # 调整布局 + fig.tight_layout() + + # 创建canvas + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12)) + close_button.pack(side=tk.BOTTOM, pady=10) + + return root + + +def save_to_excel(df, filename): + """安全地保存数据到Excel文件""" + try: + # 尝试在data子目录中保存文件 + import os + data_dir = 'data' + + # 创建data目录(如果不存在) + if not os.path.exists(data_dir): + os.makedirs(data_dir) + + # 构建完整的文件路径 + file_path = os.path.join(data_dir, filename) + + # 如果文件已存在,尝试生成一个新的文件名 + base_name = os.path.splitext(filename)[0] + extension = os.path.splitext(filename)[1] + counter = 1 + while os.path.exists(file_path): + new_filename = f"{base_name}_{counter}{extension}" + file_path = os.path.join(data_dir, new_filename) + counter += 1 + + # 保存文件 + df.to_excel(file_path, index=False) + print(f"数据已成功保存到: {file_path}") + return True + except Exception as e: + print(f"保存文件时发生错误: {str(e)}") + return False + + +def main(): + # 只爬取创业板指的数据 + indices = [ + {'code': '399006', 'market': 0, 'name': '创业板指'} # 修改为创业板指的代码和市场代码 + ] + + # 存储创业板指的数据 + rsi_data = {} + current_date = datetime.now().strftime('%Y%m%d') + + # 爬取创业板指的数据 + for index in indices: + df = get_stock_data(index['code'], index['market'], days=90) # 获取90天的数据 + if df is not None: + # 保存完整数据到Excel + output_file = f'stock_data_{index["code"]}_{current_date}.xlsx' + if save_to_excel(df, output_file): + # 保存RSI数据用于可视化 + rsi_data[index['name']] = df[['日期', 'RSI']] + + # 保存RSI数据到单独的Excel + rsi_df = pd.DataFrame() + first_dates = None + + for index_name, data in rsi_data.items(): + if first_dates is None: + first_dates = data['日期'] + rsi_df['日期'] = first_dates + rsi_df[f'{index_name}_RSI'] = data['RSI'] + + rsi_output = f'RSI_data_{current_date}.xlsx' + if save_to_excel(rsi_df, rsi_output): + # 创建并显示创业板指的RSI折线图 + root = create_visualization_window(rsi_data) + root.mainloop() + +if __name__ == "__main__": + main() diff --git a/east/rsi.py b/east/rsi.py new file mode 100644 index 0000000..37bba53 --- /dev/null +++ b/east/rsi.py @@ -0,0 +1,248 @@ +import requests +import pandas as pd +import json +from datetime import datetime, timedelta +import time +import matplotlib.pyplot as plt +import matplotlib + +# 设置全局字体 +matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'SimSun', 'Arial Unicode MS'] +matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 +import numpy as np +import tkinter as tk +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + + +def get_stock_data(stock_code, market_code, days=90): + """获取股票历史数据,限制为过去90天的数据""" + url = "http://push2his.eastmoney.com/api/qt/stock/kline/get" + + # 获取最近90天的数据 + end_date = datetime.now() + start_date = end_date - timedelta(days=days) + + # 格式化日期 + beg = start_date.strftime('%Y%m%d') + end = end_date.strftime('%Y%m%d') + + params = { + 'secid': f'{market_code}.{stock_code}', + 'fields1': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13', + 'fields2': 'f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61', + 'klt': '101', # 101表示日K线数据 + 'fqt': '0', # 不复权 + 'beg': beg, # 起始日期 + 'end': end, # 结束日期 + 'lmt': days, # 获取的天数 + '_': int(time.time() * 1000) + } + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + + try: + response = requests.get(url, params=params, headers=headers) + data = json.loads(response.text) + + if data['data'] is None: + raise Exception(f"未能获取到{stock_code}的数据") + + stock_data = data['data']['klines'] + + parsed_data = [] + for item in stock_data: + values = item.split(',') + parsed_data.append({ + '日期': values[0], + '开盘价': float(values[1]), + '收盘价': float(values[2]), + '最高价': float(values[3]), + '最低价': float(values[4]), + '成交量': float(values[5]), + '成交额': float(values[6]), + '振幅': float(values[7]), + '涨跌幅': float(values[8]), + '涨跌额': float(values[9]), + '换手率': float(values[10]) + }) + + df = pd.DataFrame(parsed_data) + df['RSI'] = calculate_rsi(df['收盘价'].values) + + # 返回90天的数据,但仅保留最后30天的数据用于可视化 + return df.tail(30) # 只返回最后30天的数据 + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + + +def calculate_rsi(prices, periods=14): + """计算RSI指标""" + rsi = np.zeros_like(prices) + if len(prices) <= periods: + return rsi + + changes = np.diff(prices) + gains = np.where(changes > 0, changes, 0) + losses = np.where(changes < 0, -changes, 0) + + avg_gain = np.mean(gains[:periods]) + avg_loss = np.mean(losses[:periods]) + + if avg_loss == 0: + rsi[periods] = 100 + else: + rs = avg_gain / avg_loss + rsi[periods] = 100 - (100 / (1 + rs)) + + for i in range(periods + 1, len(prices)): + avg_gain = (avg_gain * (periods - 1) + gains[i - 1]) / periods + avg_loss = (avg_loss * (periods - 1) + losses[i - 1]) / periods + + if avg_loss == 0: + rsi[i] = 100 + else: + rs = avg_gain / avg_loss + rsi[i] = 100 - (100 / (1 + rs)) + + # 确保RSI值在0到100之间 + rsi[i] = max(0, min(rsi[i], 100)) + + return rsi + + +def create_visualization_window(rsi_data): + """创建可视化窗口""" + root = tk.Tk() + root.title("股票指数 RSI走势") # 设置标题 + root.geometry("1200x800") + root.configure(bg="#f0f0f0") # 设置背景颜色 + + # 创建Figure + fig = Figure(figsize=(12, 8), dpi=100) + ax = fig.add_subplot(111) + + # 设置样式 + ax.set_facecolor('#f0f0f0') + fig.patch.set_facecolor('white') + + # 绘制RSI线 + colors = ['#2878B5', '#9AC9DB', '#C82423'] # 设置不同的颜色 + for (index_name, data), color in zip(rsi_data.items(), colors): + dates = pd.to_datetime(data['日期']) + ax.plot(dates, data['RSI'], label=index_name, color=color, linewidth=2, marker='o', markersize=4) + + # 添加过度买入/卖出区域 + ax.axhline(y=70, color='#C82423', linestyle='--', alpha=0.3) + ax.axhline(y=30, color='#2878B5', linestyle='--', alpha=0.3) + ax.fill_between(ax.get_xlim(), 70, 100, color='#C82423', alpha=0.1) + ax.fill_between(ax.get_xlim(), 0, 30, color='#2878B5', alpha=0.1) + + # 设置y轴范围 + ax.set_ylim(0, 100) + + # 设置标题和标签 + ax.set_title('股票指数 RSI走势', fontsize=16, pad=20) + ax.set_xlabel('日期', fontsize=12) + ax.set_ylabel('RSI值', fontsize=12) + + # 设置图例 + ax.legend(loc='best', fontsize=10) + + # 设置网格 + ax.grid(True, linestyle='--', alpha=0.3) + + # 调整x轴标签 + plt.setp(ax.get_xticklabels(), rotation=45) + + # 调整布局 + fig.tight_layout() + + # 创建canvas + canvas = FigureCanvasTkAgg(fig, master=root) + canvas.draw() + canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) + + # 添加关闭按钮 + close_button = tk.Button(root, text="关闭", command=root.quit, font=('SimHei', 12), bg='#C82423', fg='white', padx=10, pady=5) + close_button.pack(side=tk.BOTTOM, pady=10) + + return root + + +def save_to_excel(df, filename): + """安全地保存数据到Excel文件""" + try: + # 尝试在data子目录中保存文件 + import os + data_dir = 'data' + + # 创建data目录(如果不存在) + if not os.path.exists(data_dir): + os.makedirs(data_dir) + + # 构建完整的文件路径 + file_path = os.path.join(data_dir, filename) + + # 如果文件已存在,尝试生成一个新的文件名 + base_name = os.path.splitext(filename)[0] + extension = os.path.splitext(filename)[1] + counter = 1 + while os.path.exists(file_path): + new_filename = f"{base_name}_{counter}{extension}" + file_path = os.path.join(data_dir, new_filename) + counter += 1 + + # 保存文件 + df.to_excel(file_path, index=False) + print(f"数据已成功保存到: {file_path}") + return True + except Exception as e: + print(f"保存文件时发生错误: {str(e)}") + return False + + +def main(): + # 爬取多个指数的数据 + indices = [ + {'code': '000001', 'market': 1, 'name': '上证指数'}, + {'code': '399001', 'market': 0, 'name': '深证成指'}, + {'code': '399006', 'market': 0, 'name': '创业板指'} + ] + + # 存储多个指数的数据 + rsi_data = {} + current_date = datetime.now().strftime('%Y%m%d') + + # 爬取数据 + for index in indices: + df = get_stock_data(index['code'], index['market'], days=90) # 获取90天的数据 + if df is not None: + # 保存完整数据到Excel + output_file = f'stock_data_{index["code"]}_{current_date}.xlsx' + if save_to_excel(df, output_file): + # 保存RSI数据用于可视化 + rsi_data[index['name']] = df[['日期', 'RSI']] + + # 保存RSI数据到单独的Excel + rsi_df = pd.DataFrame() + first_dates = None + + for index_name, data in rsi_data.items(): + if first_dates is None: + first_dates = data['日期'] + rsi_df['日期'] = first_dates + rsi_df[f'{index_name}_RSI'] = data['RSI'] + + rsi_output = f'RSI_data_{current_date}.xlsx' + if save_to_excel(rsi_df, rsi_output): + # 创建并显示股票指数的RSI折线图 + root = create_visualization_window(rsi_data) + root.mainloop() + +if __name__ == "__main__": + main() diff --git a/east/word.PY b/east/word.PY new file mode 100644 index 0000000..0cde5d8 --- /dev/null +++ b/east/word.PY @@ -0,0 +1,87 @@ +import requests +import json +import pandas as pd +from wordcloud import WordCloud +import matplotlib.pyplot as plt + +def get_fund_flow_data(): + """获取资金流向数据""" + # 修改 pz 参数为 50,获取更多数据 + url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112309006219872217847_1740232310161&fid=f62&po=1&pz=50&pn=1&np=1&fltt=2&invt=2&ut=8dec03ba335b81bf4ebdf7b29ec27d15&fs=m%3A90+t%3A2&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13" + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + } + + try: + response = requests.get(url, headers=headers) + response_text = response.text[response.text.find('(') + 1: response.text.rfind(')')] + data = json.loads(response_text) + + if 'data' not in data or 'diff' not in data['data']: + raise Exception("未能获取到数据") + + items = data['data']['diff'] + + parsed_data = [] + for item in items: + net_flow = item['f62'] - item['f66'] + parsed_data.append({ + '板块': item['f14'], + '净流入': net_flow, + }) + + df = pd.DataFrame(parsed_data) + return df + + except Exception as e: + print(f"获取数据时发生错误: {str(e)}") + return None + +def generate_wordcloud(data): + """生成词云图,增加层次感""" + # 获取所有板块及其净流入值 + sectors = data['板块'].tolist() + net_flows = data['净流入'].tolist() + + # 将负值转换为正值,保持相对大小关系 + min_flow = min(net_flows) + if min_flow < 0: + net_flows = [flow - min_flow + 1 for flow in net_flows] # 加1避免出现0值 + + # 准备词云输入数据 + wordcloud_data = {sectors[i]: net_flows[i] for i in range(len(sectors))} + + # 修改词云参数以突出层次感 + wordcloud = WordCloud( + width=1600, # 增加宽度 + height=1000, # 增加高度 + background_color='white', + font_path='C:\\Windows\\Fonts\\msyh.ttc', + min_font_size=8, # 设置最小字体大小 + max_font_size=100, # 设置最大字体大小 + max_words=50, # 显示最多50个词 + relative_scaling=0.8, # 增加层次感,调整词大小的相对比例 + colormap='coolwarm', # 使用渐变色方案增加层次感 + contour_color='black', # 边缘色 + contour_width=2 # 边缘宽度 + ).generate_from_frequencies(wordcloud_data) + + # 显示词云 + plt.figure(figsize=(16, 10)) # 增加图像大小 + plt.imshow(wordcloud, interpolation='bilinear') + plt.axis('off') + plt.show() + +def main(): + print("正在获取资金流向数据...") + data = get_fund_flow_data() + + if data is not None: + print("正在生成词云图...") + generate_wordcloud(data) + else: + print("获取数据失败,请检查网络连接或接口可用性。") + +if __name__ == "__main__": + main()