Files
sanguo_quant_live/zhaoyun-data/research/task-20260401-edict-test/fetch_hs300.py
T
2026-04-02 08:55:07 +08:00

95 lines
2.7 KiB
Python

"""
ZYJ-20260401-001 - edict集成测试任务
获取沪深300指数(000300.SH)最近5个交易日收盘价
计算每日涨跌幅和5日平均收盘价
"""
import akshare as ak
import pandas as pd
from datetime import datetime
# 获取沪深300指数历史数据
print("🚀 开始获取沪深300指数(000300.SH)数据...")
# 用akshare获取
df = ak.stock_zh_index_daily(symbol="sh000300")
# 将date列转为datetime并设置为索引
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
# 获取最近5个交易日
df_last5 = df.tail(5).copy()
# 计算每日涨跌幅
df_last5['pct_change'] = df_last5['close'].pct_change() * 100
# 计算5日平均收盘价
avg_close_5d = df_last5['close'].mean()
# 格式化输出
print("\n📊 沪深300指数最近5个交易日数据:")
print("=" * 80)
print(f"{'日期':<12} {'收盘价':>12} {'涨跌幅(%)':>10}")
print("-" * 80)
result_data = []
for idx, row in df_last5.iterrows():
date_str = idx.strftime("%Y-%m-%d")
close = float(row['close'])
pct = float(row['pct_change']) if not pd.isna(row['pct_change']) else None
pct_str = f"{pct:.2f}" if pct is not None else "-"
print(f"{date_str:<12} {close:>12.2f} {pct_str:>10}")
result_data.append({
'date': date_str,
'close': close,
'pct_change': pct
})
print("-" * 80)
print(f"{'5日平均收盘价':<12} {avg_close_5d:>12.2f}")
print("=" * 80)
# 分析趋势
last_close = result_data[-1]['close']
first_close = result_data[0]['close']
total_change = (last_close - first_close) / first_close * 100
print(f"\n📈 趋势分析:")
print(f"- 起始日期: {result_data[0]['date']}")
print(f"- 起始收盘价: {first_close:.2f}")
print(f"- 最新日期: {result_data[-1]['date']}")
print(f"- 最新收盘价: {last_close:.2f}")
print(f"- 5日累计涨跌幅: {total_change:.2f}%")
if total_change > 1:
trend = "明显上行趋势"
elif total_change < -1:
trend = "明显下行趋势"
else:
trend = "横盘震荡整理"
print(f"- 趋势判断: {trend}")
# 保存结果到文件
output_file = "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/zhaoyun-data/research/task-20260401-edict-test/result.csv"
df_save = pd.DataFrame(result_data)
df_save.to_csv(output_file, index=False)
print(f"\n💾 结果已保存到: {output_file}")
# 输出json格式结果
result_json = {
'task_id': 'ZYJ-20260401-001',
'symbol': '000300.SH',
'name': '沪深300指数',
'data': result_data,
'avg_close_5d': round(avg_close_5d, 2),
'total_change_pct': round(total_change, 2),
'trend': trend,
'generated_at': datetime.now().isoformat()
}
print("\n📋 JSON结果:")
import json
print(json.dumps(result_json, indent=2, ensure_ascii=False))