玻璃期货数据下载与分析:Python金融实战分享

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

期货数据下载与分析:Python实战分享

引言

在金融市场中,期货分析是一项重要的工作,而获取准确且及时的数据是进行有效分析的基础。今天,我们将深入探讨一段使用Python编写的代码,该代码用于从郑州商品交易所(CZCE)下载期货持仓数据和价格数据。通过对这段代码的详细解读,我们不仅能了解如何使用Python进行网络数据下载,还能学习到如何处理日期范围、文件存储以及错误处理等技巧。

代码整体概述

这段代码主要包含以下几个部分:

  1. 导入必要的库:使用osrequestspandasdatetimeloggingtime等库。
  2. 配置日志记录:将下载过程中的信息记录到download.log文件中。
  3. 创建下载目录:确保数据文件有一个指定的存储位置。
  4. 设置请求头:模拟浏览器请求,避免被服务器拒绝。
  5. 定义下载函数download_holding_data函数用于下载指定日期的持仓数据和价格数据。
  6. 定义主函数get_data_main函数用于生成日期范围并调用下载函数。
  7. 主程序入口:处理可能的异常并确保下载过程结束后记录完成信息。

代码详细解读

导入必要的库

import os
import requests
import pandas as pd
from datetime import datetime
import logging
import time
  • os:用于处理文件和目录操作。
  • requests:用于发送HTTP请求,获取网页数据。
  • pandas:用于处理日期范围和时间序列数据。
  • datetime:用于处理日期和时间。
  • logging:用于记录程序运行过程中的信息。
  • time:用于添加延迟,避免频繁请求被服务器封禁。

配置日志记录

logging.basicConfig(
    filename='download.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

这段代码将日志信息记录到download.log文件中,日志级别为INFO,并指定了日志的格式。

创建下载目录

download_dir = 'czce_holdings'
os.makedirs(download_dir, exist_ok=True)

使用os.makedirs函数创建名为czce_holdings的目录,如果目录已经存在则不会报错。

设置请求头

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}

设置请求头,模拟Chrome浏览器的请求,避免被服务器识别为爬虫而拒绝请求。

定义下载函数

def download_holding_data(date):
    """下载指定日期的持仓数据"""
    try:
        # 构造URL
        year = date.strftime("%Y")
        date_str = date.strftime("%Y%m%d")
        filename = f"FutureDataHolding_{date_str}.xls"
        filepath = os.path.join(download_dir, filename)

        # 检查文件是否已存在
        """
        if os.path.exists(filepath):
            logging.info(f"File already exists: {date_str}")
            print(f"Exists: {date_str}")
            return
        """

        url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{year}/{date_str}/FutureDataHolding.xls"
        price_data_url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{year}/{date_str}/FutureDataDaily.xls"

        print(f"url: {url},price_url:{price_data_url}")

        # 发送请求
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查HTTP状态码

        # 保存文件
        filename = f"FutureDataHolding_{date_str}.xls"
        filepath = os.path.join(download_dir, filename)

        with open(filepath, 'wb') as f:
            f.write(response.content)

        logging.info(f"Successfully downloaded {date_str}")
        print(f"Downloaded: {date_str}")

        # 礼貌性延迟
        time.sleep(1)

        # 发送请求
        response = requests.get(price_data_url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查HTTP状态码

        # 保存文件
        filename = f"Price_FutureDataHolding_{date_str}.xls"
        filepath = os.path.join(download_dir, filename)

        with open(filepath, 'wb') as f:
            f.write(response.content)

        logging.info(f"Successfully downloaded {date_str}")
        print(f"Downloaded: {date_str}")

    except requests.exceptions.HTTPError as e:
        logging.warning(f"HTTP Error {e.response.status_code} for {date_str}")
    except requests.exceptions.ConnectionError:
        logging.error(f"Connection Error for {date_str}")
    except requests.exceptions.Timeout:
        logging.warning(f"Timeout Error for {date_str}")
    except Exception as e:
        logging.error(f"Unexpected error for {date_str}: {str(e)}")
  • 该函数接受一个日期对象作为参数,用于下载指定日期的持仓数据和价格数据。
  • 首先,根据日期构造数据文件的URL。
  • 然后,发送HTTP请求获取数据,并使用raise_for_status方法检查请求是否成功。
  • 接着,将获取的数据保存到本地文件中。
  • 最后,添加1秒的延迟,避免频繁请求被服务器封禁。

定义主函数

def get_data_main():
    # 生成日期范围(中国工作日,排除周末)
    # 获取当前日期
    now = pd.Timestamp.now()
    # 计算当前日期是本周的第几天
    weekday = now.weekday()
    # 计算本周一的日期
    start_date = now - pd.Timedelta(days=weekday)
    #start_date = pd.Timestamp('2025-01-02')
    end_date = pd.Timestamp(datetime.today().date())

    # 生成所有工作日日期
    date_range = pd.bdate_range(start=start_date, end=end_date, freq='B')

    # 遍历所有日期
    for date in date_range:
        print(f"begin Downloading: {date}")
        download_holding_data(date)
  • 该函数用于生成日期范围,并调用download_holding_data函数下载每个日期的数据。
  • 使用pd.bdate_range函数生成从本周一到当前日期的所有工作日日期。
  • 遍历日期范围,依次调用download_holding_data函数下载数据。

主程序入口

if __name__ == "__main__":
    try:
        get_data_main()
    except KeyboardInterrupt:
        logging.info("Process interrupted by user")
    except Exception as e:
        logging.critical(f"Critical error occurred: {str(e)}")
    finally:
        logging.info("Download process completed")
  • 处理可能的异常,如用户中断(KeyboardInterrupt)和其他异常。
  • 无论是否发生异常,最后都会记录下载过程完成的信息。

总结

通过这段代码,我们学习了如何使用Python从郑州商品交易所下载期货持仓数据和价格数据。主要涉及到网络请求、文件操作、日期处理和错误处理等方面的知识。在实际应用中,我们可以根据下载的数据进行进一步的分析,如绘制图表、计算统计指标等,以更好地理解期货市场的动态。

希望这篇技术分享对你有所帮助,如果你有任何疑问或建议,欢迎在评论区留言讨论。

以上就是本次期货数据下载与分析的Python技术分享,希望大家能从中有所收获。


网站公告

今日签到

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