HTML应用指南:利用POST请求获取上海黄金交易所金价数据

发布于:2025-08-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

上海黄金交易所(SGE)作为中国唯一经国务院批准、专门从事黄金等贵金属交易的国家级市场平台,自成立以来始终秉持“公开、公平、公正”的原则,致力于构建规范、高效、透明的贵金属交易市场体系。交易所通过完善的交易机制、严格的风险控制和强大的技术支持,为银行、金融投资机构及各类会员单位提供标准化的贵金属交易服务,是中国黄金市场定价机制的核心载体。

在保障交易安全与市场稳定的同时,上海黄金交易所积极推动信息化建设,通过官方网站及数据接口实时发布权威的黄金、白银、铂金等品种的行情信息,涵盖开盘价、最高价、最低价、收盘价及成交量等关键数据。这些数据不仅反映了国内贵金属市场的实时供需状况,也为投资者、研究机构和产业链上下游企业提供了重要的决策依据。

本文将探讨如何通过POST请求从上海黄金交易所的公开数据接口中获取Au99.99等主力合约的日行情数据,并展示使用Python的requests库发送HTTP请求的方法,以提取结构化的金价序列。此类数据通常以JSON格式返回,涵盖全国统一的集中竞价成交信息,通过解析返回结果,可实现对交易日期、开盘价、最高价、最低价、收盘价等核心字段的精准提取。此类数据采集方式有助于深入分析黄金价格的长期趋势、波动特征及市场周期规律。

上海黄金交易所金价数据接口:行情走势-上海黄金交易所

我们第一步先找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;

标头:通常包括URL的连接,也就是目标资源的位置;

负载:对于POST请求:负载通常包含了传递的参数,因为所有参数都通过URL传递,这里我们可以看到Au99.99的明文,代表99.99的纯金,没有进行加密;

预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段;

接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;

方法思路

  1. 找到对应数据存储位置;
  2. 我们通过post请求获取所有日期下的相关金价数据;
  3. 通过html网页的形式,把数据进行可视化;

第一步:我们先找到对应数据存储位置,获取所有有数据距离以来的金价数据,包括开盘价,收盘价之类,经过测试,这里的数据是,直接存在名为Dailyhq的html里,那我们直接获取所有数据即可;

第二步:利用POST请求获取所有金价数据,并根据标签进行保存,另存为csv;

完整代码#运行环境 Python 3.11

import requests
import csv
from datetime import datetime

# --- 配置 ---
instid = "Au99.99"
# 自动生成文件名: SGE_Au99.99_20250818.csv
filename = f"SGE_{instid.replace('(', '_').replace(')', '_')}_{datetime.now().strftime('%Y%m%d')}.csv"

# --- 请求 ---
url = "https://www.sge.com.cn/graph/Dailyhq"
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Referer': 'https://www.sge.com.cn/',
    'X-Requested-With': 'XMLHttpRequest',
}
data = {'instid': instid}

try:
    response = requests.post(url, headers=headers, data=data, timeout=10)
    response.raise_for_status()
    result = response.json()

    # --- 保存CSV ---
    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        writer.writerow(['日期', '开盘价', '最高价', '最低价', '收盘价'])  # 写标题
        writer.writerows(result['time'])  # 写数据

    print(f"数据已保存: {filename} (共{len(result['time'])}条)")

except Exception as e:
    print(f"失败: {e}")
    

获取数据标签如下, 日期、开盘价、最高价、最低价、 收盘价,其他一些非关键标签,这里省略;

第三步:我们把金价数据进行可视化,生成对应的html;

完整代码#运行环境 Python 3.11

import pandas as pd
import json
import os

# --- 1. 读取CSV数据 ---
file_path = r'SGE_Au99.99_20250818.csv'  # 请根据实际路径修改
if not os.path.exists(file_path):
    raise FileNotFoundError(f"未找到文件: {file_path}")

data = pd.read_csv(file_path)

# 确保日期为 datetime 类型并排序
data['日期'] = pd.to_datetime(data['日期'])
data = data.sort_values('日期').reset_index(drop=True)

# 提取数据
dates = data['日期'].dt.strftime('%Y-%m-%d').tolist()
close_prices = data['收盘价'].round(2).tolist()

# --- 2. 构建ECharts系列 ---
series_list = [
    {
        'name': '收盘价',
        'type': 'line',
        'data': close_prices,
        'smooth': True,
        'showSymbol': False,
        'emphasis': {'focus': 'series'},
        'lineStyle': {'width': 3, 'color': '#4a86e8'},  # 蓝色
        'areaStyle': {
            'color': {
                'type': 'linear',
                'x': 0, 'y': 0, 'x2': 0, 'y2': 1,
                'colorStops': [
                    {'offset': 0, 'color': 'rgba(74, 134, 233, 0.5)'},
                    {'offset': 1, 'color': 'rgba(74, 134, 233, 0.1)'}
                ]
            }
        }
    }
]

# --- 3. 生成HTML内容 ---
html_content = f"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Au99.99 黄金收盘价趋势图</title>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
    <style>
        body {{
            font-family: 'Microsoft YaHei', 'Segoe UI', sans-serif;
            background: linear-gradient(to right, #bda0db 0%, #eae9f0 100%);
            margin: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            color: #333;
        }}
        .container {{
            width: 90%;
            max-width: 1200px;
            padding: 30px;
            background: white;
            border-radius: 16px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
            text-align: center;
        }}
        h1 {{
            font-size: 24px;
            margin-bottom: 20px;
            color: #4a86e8;
        }}
        .subtitle {{
            font-size: 16px;
            color: #666;
            margin-bottom: 25px;
        }}
        #chart {{
            width: 100%;
            height: 600px;
            margin-top: 20px;
        }}
    </style>
</head>
<body>
    <div class="container">
        <h1>上海黄金交易所 Au99.99 收盘价趋势</h1>
        <div class="subtitle">数据范围:{dates[0]} 至 {dates[-1]} (共 {len(dates)} 天)</div>
        <div id="chart"></div>
    </div>

    <script>
        const chartDom = document.getElementById('chart');
        const myChart = echarts.init(chartDom);

        const option = {{
            tooltip: {{
                trigger: 'axis',
                axisPointer: {{ type: 'cross' }},
                formatter: function(params) {{
                    let res = params[0].name + '<br/>';
                    params.forEach(param => {{
                        res += `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${{param.color}};"></span>`;
                        res += `${{param.seriesName}}: <b>${{param.value}}</b> 元/克<br/>`;
                    }});
                    return res;
                }}
            }},
            legend: {{
                data: {json.dumps([s['name'] for s in series_list])},
                bottom: '5%',
                textStyle: {{ color: '#333' }}
            }},
            grid: {{ left: '8%', right: '6%', bottom: '18%', top: '8%' }},
            xAxis: {{
                type: 'category',
                data: {json.dumps(dates)},
                axisLabel: {{ 
                    rotate: 45, 
                    fontSize: 12,
                    color: '#666'
                }},
                axisLine: {{ lineStyle: {{ color: '#ccc' }} }}
            }},
            yAxis: {{
                type: 'value',
                name: '价格 (元/克)',
                splitLine: {{ 
                    show: true, 
                    lineStyle: {{ type: 'dashed', color: '#ddd' }} 
                }},
                axisLabel: {{ color: '#666' }},
                axisLine: {{ lineStyle: {{ color: '#ccc' }} }}
            }},
            series: {json.dumps(series_list, ensure_ascii=False)}
        }};

        myChart.setOption(option);
        window.addEventListener('resize', () => myChart.resize());
    </script>
</body>
</html>
"""

# --- 4. 保存HTML文件 ---
output_path = "SGE_Au9999_Close_Price_Trend.html"
with open(output_path, "w", encoding="utf-8") as f:
    f.write(html_content)

print(f"黄金收盘价趋势图已生成:{output_path}")
print("请用浏览器打开该HTML文件查看可视化图表")

2016年底至2025年8月的金价变化趋势如下,恨没在低位狠狠的抄底o(╥﹏╥)o

接下来,我们进行看图说话:

从2016年底至2025年8月,上海黄金交易所Au99.99的金价呈现出显著的长期上升趋势。价格从2016年底的约300元/克攀升至2025年8月的接近800元/克,累计涨幅超过150%。这一强劲的上涨走势充分体现了黄金作为避险资产和价值储存工具在全球经济不确定性加剧背景下的核心地位。

阶段性走势分析
  • 初期(2016-2017年):金价在300元/克附近窄幅震荡,整体表现平稳。这一阶段全球经济逐步复苏,市场风险偏好回升,黄金的避险需求相对有限,价格维持在低位盘整。

  • 2018年至2019年初:金价进入缓慢增长阶段,逐步突破400元/克。随着全球贸易摩擦升温、地缘政治风险上升,市场对避险资产的关注度提升,黄金的投资吸引力开始显现。

  • 2019年至2020年初:金价开启加速上涨,迅速逼近500元/克。这一阶段美联储转向降息周期,全球主要央行重启宽松货币政策,实际利率下行显著提升了无息资产黄金的持有价值。

  • 2020年至2023年初:受新冠疫情冲击、经济波动与高通胀预期交织影响,金价在400至500元/克区间进入高位震荡期,波动明显加剧。尽管疫情初期流动性紧张导致金价短暂回调,但随后的大规模财政与货币刺激推动黄金价格再度走强。

  • 自2023年初以来:金价再次强势突破,一路攀升至近800元/克。这一轮上涨主要得益于全球通胀持续高企、地缘冲突频发(如俄乌冲突延续、中东局势紧张)、各国央行尤其是新兴市场央行大规模增持黄金储备,以及市场对美元信用长期弱化的担忧不断升温。

我们再来看看银价这些年的变化趋势;

从2016年底至2025年8月,上海黄金交易所Ag(T+D)的银价呈现出显著的长期上升趋势。价格从2016年底的约4元/克攀升至2025年8月的接近9元/克,涨幅超过125%。这一趋势充分体现了白银作为工业金属和投资资产在全球经济复杂变局中的重要地位。

阶段性走势分析
  • 初期(2016-2017年):银价在4元/克附近窄幅震荡,整体表现平稳。这一阶段市场对白银的需求相对稳定,工业需求和投资需求均未出现显著变化。

  • 2018年至2019年初:银价进入缓慢增长阶段,逐步突破5元/克。这一时期,全球经济逐渐复苏,工业需求有所增加,同时投资者对白银的投资兴趣也有所提升。

  • 2019年至2020年初:银价开启加速上涨,迅速逼近6元/克。这一阶段与全球贸易摩擦升级、地缘政治紧张以及主要经济体实施宽松货币政策密切相关。白银作为贵金属,其避险属性和工业应用价值得到进一步体现。

  • 2020年至2023年初:受疫情冲击、经济复苏与通胀预期交织影响,银价在5-6元/克区间进入高位震荡期,波动明显加剧。疫情期间,白银的工业需求受到一定影响,但投资需求大幅增加,导致价格波动较大。

  • 自2023年初以来:银价再次强势突破,一路攀升至近9元/克。这一轮上涨主要得益于全球高通胀持续、地缘冲突频发、各国央行大规模增持黄金储备以及市场对长期货币信用弱化的担忧不断升温。白银作为贵金属和工业金属,其双重属性使其在这一背景下表现出色。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。


网站公告

今日签到

点亮在社区的每一天
去签到