fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
248 lines
9.0 KiB
Python
248 lines
9.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding:utf-8 -*-
|
|
"""
|
|
Date: 2025/7/1 16:30
|
|
Desc: 期货-仓单日报
|
|
上海期货交易所-仓单日报
|
|
https://tsite.shfe.com.cn/statements/dataview.html?paramid=dailystock
|
|
郑州商品交易所-交易数据-仓单日报
|
|
http://www.czce.com.cn/cn/jysj/cdrb/H770310index_1.htm
|
|
大连商品交易所-行情数据-统计数据-日统计-仓单日报
|
|
http://www.dce.com.cn/dalianshangpin/xqsj/tjsj26/rtj/cdrb/index.html
|
|
广州期货交易所-行情数据-仓单日报
|
|
http://www.gfex.com.cn/gfex/cdrb/hqsj_tjsj.shtml
|
|
"""
|
|
|
|
import re
|
|
from io import BytesIO, StringIO
|
|
|
|
import pandas as pd
|
|
import requests
|
|
|
|
|
|
def futures_warehouse_receipt_czce(date: str = "20251103") -> dict:
|
|
"""
|
|
郑州商品交易所-交易数据-仓单日报
|
|
http://www.czce.com.cn/cn/jysj/cdrb/H770310index_1.htm
|
|
:param date: 交易日, e.g., "20200702"
|
|
:type date: str
|
|
:return: 指定日期的仓单日报数据
|
|
:rtype: dict
|
|
"""
|
|
import urllib3
|
|
|
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
if int(date) > 20251101:
|
|
url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{date[:4]}/{date}/FutureDataWhsheet.xlsx"
|
|
else:
|
|
url = f"http://www.czce.com.cn/cn/DFSStaticFiles/Future/{date[:4]}/{date}/FutureDataWhsheet.xls"
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
"Chrome/83.0.4103.116 Safari/537.36"
|
|
}
|
|
r = requests.get(url, verify=False, headers=headers)
|
|
temp_df = pd.read_excel(BytesIO(r.content))
|
|
index_list = temp_df[temp_df.iloc[:, 0].str.find("品种") == 0.0].index.to_list()
|
|
index_list.append(len(temp_df))
|
|
big_dict = {}
|
|
for inner_index in range(len(index_list) - 1):
|
|
inner_df = temp_df[index_list[inner_index] : index_list[inner_index + 1]]
|
|
inner_key = re.findall(pattern=r"[a-zA-Z]+", string=inner_df.iloc[0, 0])[0]
|
|
inner_df = inner_df.iloc[1:, :]
|
|
inner_df.dropna(axis=0, how="all", inplace=True)
|
|
inner_df.dropna(axis=1, how="all", inplace=True)
|
|
inner_df.columns = inner_df.iloc[0, :].to_list()
|
|
inner_df = inner_df.iloc[1:, :]
|
|
inner_df.reset_index(inplace=True, drop=True)
|
|
big_dict[inner_key] = inner_df
|
|
return big_dict
|
|
|
|
|
|
def futures_warehouse_receipt_dce(date: str = "20251027") -> pd.DataFrame:
|
|
"""
|
|
大连商品交易所-行情数据-统计数据-日统计-仓单日报
|
|
http://www.dce.com.cn/dce/channel/list/187.html
|
|
:param date: 交易日, e.g., "20200702"
|
|
:type date: str
|
|
:return: 指定日期的仓单日报数据
|
|
:rtype: dict
|
|
"""
|
|
url = "http://www.dce.com.cn/dcereport/publicweb/dailystat/wbillWeeklyQuotes"
|
|
payload = {
|
|
"tradeDate": date,
|
|
"varietyId": "all",
|
|
}
|
|
r = requests.post(url, json=payload)
|
|
data_json = r.json()
|
|
temp_df = pd.DataFrame(data_json["data"]["entityList"])
|
|
temp_df.rename(
|
|
columns={
|
|
"variety": "品种名称",
|
|
"whAbbr": "仓库/分库",
|
|
"deliveryAbbr": "可选提货地点/分库-数量",
|
|
"lastWbillQty": "昨日仓单量(手)",
|
|
"wbillQty": "今日仓单量(手)",
|
|
"diff": "增减(手)",
|
|
"varietyOrder": "品种代码",
|
|
},
|
|
inplace=True,
|
|
)
|
|
temp_df = temp_df[
|
|
[
|
|
"品种代码",
|
|
"品种名称",
|
|
"仓库/分库",
|
|
"可选提货地点/分库-数量",
|
|
"昨日仓单量(手)",
|
|
"今日仓单量(手)",
|
|
"增减(手)",
|
|
]
|
|
]
|
|
return temp_df
|
|
|
|
|
|
def futures_shfe_warehouse_receipt(date: str = "20200702") -> dict:
|
|
"""
|
|
上海期货交易所指定交割仓库期货仓单日报
|
|
https://tsite.shfe.com.cn/statements/dataview.html?paramid=dailystock¶mdate=20200703
|
|
:param date: 交易日, e.g., "20200702"
|
|
:type date: str
|
|
:return: 指定日期的仓单日报数据
|
|
:rtype: dict
|
|
"""
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
"Chrome/83.0.4103.116 Safari/537.36"
|
|
}
|
|
url = (
|
|
f"https://www.shfe.com.cn/data/tradedata/future/dailydata/{date}dailystock.dat"
|
|
)
|
|
if date >= "20140519":
|
|
r = requests.get(url, headers=headers)
|
|
data_json = r.json()
|
|
temp_df = pd.DataFrame(data_json["o_cursor"])
|
|
temp_df["VARNAME"] = temp_df["VARNAME"].str.split(r"$", expand=True).iloc[:, 0]
|
|
temp_df["REGNAME"] = temp_df["REGNAME"].str.split(r"$", expand=True).iloc[:, 0]
|
|
temp_df["WHABBRNAME"] = (
|
|
temp_df["WHABBRNAME"].str.split(r"$", expand=True).iloc[:, 0]
|
|
)
|
|
big_dict = {}
|
|
for item in set(temp_df["VARNAME"]):
|
|
big_dict[item] = temp_df[temp_df["VARNAME"] == item]
|
|
else:
|
|
url = f"https://www.shfe.com.cn/data/tradedata/future/dailydata/{date}dailystock.html"
|
|
r = requests.get(url, headers=headers)
|
|
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
index_list = temp_df[
|
|
temp_df.iloc[:, 3].str.contains("单位:") == 1
|
|
].index.to_list()
|
|
big_dict = {}
|
|
for inner_index in range(len(index_list)):
|
|
temp_index_start = index_list[inner_index]
|
|
if (inner_index + 1) >= len(index_list):
|
|
if temp_df.iloc[-1, 0].startswith("注:"):
|
|
temp_index_end = len(temp_df) - 1
|
|
else:
|
|
temp_index_end = len(temp_df)
|
|
else:
|
|
temp_index_end = index_list[inner_index + 1]
|
|
inner_df = temp_df[temp_index_start:temp_index_end]
|
|
inner_df.reset_index(inplace=True, drop=True)
|
|
inner_key = inner_df.iloc[0, 0]
|
|
inner_df.columns = inner_df.iloc[1].to_list()
|
|
inner_df = inner_df[2:]
|
|
inner_df.reset_index(inplace=True, drop=True)
|
|
big_dict[inner_key] = inner_df
|
|
return big_dict
|
|
|
|
|
|
def futures_gfex_warehouse_receipt(date: str = "20240122") -> dict:
|
|
"""
|
|
广州期货交易所-行情数据-仓单日报
|
|
http://www.gfex.com.cn/gfex/cdrb/hqsj_tjsj.shtml
|
|
:param date: 交易日, e.g., "20240122"
|
|
:type date: str
|
|
:return: 指定日期的仓单日报数据
|
|
:rtype: dict
|
|
"""
|
|
url = "http://www.gfex.com.cn/u/interfacesWebTdWbillWeeklyQuotes/loadList"
|
|
headers = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
"Chrome/83.0.4103.116 Safari/537.36"
|
|
}
|
|
payload = {"gen_date": date}
|
|
r = requests.post(url=url, data=payload, headers=headers)
|
|
data_json = r.json()
|
|
temp_df = pd.DataFrame(data_json["data"])
|
|
symbol_list = list(
|
|
set([item.upper() for item in temp_df["varietyOrder"].tolist() if item != ""])
|
|
)
|
|
temp_df.rename(
|
|
columns={
|
|
"varietyOrder": "symbol",
|
|
"variety": "品种",
|
|
"whAbbr": "仓库/分库",
|
|
"lastWbillQty": "昨日仓单量",
|
|
"wbillQty": "今日仓单量",
|
|
"regWbillQty": "增减",
|
|
},
|
|
inplace=True,
|
|
)
|
|
temp_df = temp_df[
|
|
[
|
|
"symbol",
|
|
"whType",
|
|
"品种",
|
|
"仓库/分库",
|
|
"昨日仓单量",
|
|
"今日仓单量",
|
|
"增减",
|
|
]
|
|
]
|
|
temp_df["whType"] = pd.to_numeric(temp_df["whType"], errors="coerce")
|
|
temp_df.dropna(
|
|
subset=["whType"], how="any", axis=0, ignore_index=True, inplace=True
|
|
)
|
|
big_dict = dict()
|
|
for symbol in symbol_list:
|
|
inner_temp_df = temp_df[temp_df["symbol"] == symbol.lower()].copy()
|
|
inner_temp_df = inner_temp_df[
|
|
[
|
|
"品种",
|
|
"仓库/分库",
|
|
"昨日仓单量",
|
|
"今日仓单量",
|
|
"增减",
|
|
]
|
|
]
|
|
inner_temp_df["昨日仓单量"] = pd.to_numeric(
|
|
inner_temp_df["昨日仓单量"], errors="coerce"
|
|
)
|
|
inner_temp_df["今日仓单量"] = pd.to_numeric(
|
|
inner_temp_df["今日仓单量"], errors="coerce"
|
|
)
|
|
inner_temp_df["增减"] = pd.to_numeric(inner_temp_df["增减"], errors="coerce")
|
|
inner_temp_df.reset_index(inplace=True, drop=True)
|
|
big_dict[symbol] = inner_temp_df
|
|
return big_dict
|
|
|
|
|
|
if __name__ == "__main__":
|
|
futures_warehouse_receipt_czce_df = futures_warehouse_receipt_czce(date="20251014")
|
|
print(futures_warehouse_receipt_czce_df)
|
|
|
|
futures_warehouse_receipt_dce_df = futures_warehouse_receipt_dce(date="20251014")
|
|
print(futures_warehouse_receipt_dce_df)
|
|
|
|
futures_shfe_warehouse_receipt_df = futures_shfe_warehouse_receipt(date="20200702")
|
|
print(futures_shfe_warehouse_receipt_df)
|
|
|
|
futures_shfe_warehouse_receipt_df = futures_shfe_warehouse_receipt(date="20140516")
|
|
print(futures_shfe_warehouse_receipt_df)
|
|
|
|
futures_gfex_warehouse_receipt_df = futures_gfex_warehouse_receipt(date="20240122")
|
|
print(futures_gfex_warehouse_receipt_df)
|
|
|
|
futures_gfex_warehouse_receipt_df = futures_gfex_warehouse_receipt(date="20260226")
|
|
print(futures_gfex_warehouse_receipt_df)
|