期货数据下载与分析:Python实战分享
引言
在金融市场中,期货分析是一项重要的工作,而获取准确且及时的数据是进行有效分析的基础。今天,我们将深入探讨一段使用Python编写的代码,该代码用于从郑州商品交易所(CZCE)下载期货持仓数据和价格数据。通过对这段代码的详细解读,我们不仅能了解如何使用Python进行网络数据下载,还能学习到如何处理日期范围、文件存储以及错误处理等技巧。
代码整体概述
这段代码主要包含以下几个部分:
- 导入必要的库:使用
os
、requests
、pandas
、datetime
、logging
和time
等库。 - 配置日志记录:将下载过程中的信息记录到
download.log
文件中。 - 创建下载目录:确保数据文件有一个指定的存储位置。
- 设置请求头:模拟浏览器请求,避免被服务器拒绝。
- 定义下载函数:
download_holding_data
函数用于下载指定日期的持仓数据和价格数据。 - 定义主函数:
get_data_main
函数用于生成日期范围并调用下载函数。 - 主程序入口:处理可能的异常并确保下载过程结束后记录完成信息。
代码详细解读
导入必要的库
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技术分享,希望大家能从中有所收获。