期货持仓报告
期货持仓报告,简称COT(Commitment of Traders)报告,记录机构投资者包括商业公司和对冲基金的期货持仓数据。由美国期货交易委员会(CFTC)公布,公布时间是每周五下午2点30分(美东时间)。
我们关注的是传统格式(Legacy Format)的COT报告,汇总了期货和期权的持仓数据。
传统格式的COT报告包含以下数据:
- 商业持仓(Commercial): 产品制造商/销售商的期货持仓,划分为多头和空头,用期货来对冲价格波动的风险。
- 非商业持仓(Noncommercial): 对冲基金,投行和大型个人玩家的期货持仓,划分为多头和空头,简称"投机性头寸"。
- 多头持仓(Long): 多头合约的数量。
- 空头持仓(Short): 空头合约的数量。
- 未平仓合约(Open Interest): 流通在外未交割的合约数量。
- 无需报备头寸(Non-reportable Position): 未达到CFTC要求的未平仓合约数量,指小玩家的持仓。
非商业持仓代表了大玩家对未来价格的预期,如果它们押注价格上涨,大额买入推动价格上涨,反之亦然。但我们从均值回归的角度解读这个指标,当非商业净多头头寸创新高,后续将缺乏足够的买盘支持价格的进一步上涨,价格有可能处于周期性顶部;相反当净空头创历史新高,表明多数投资者都押注价格下跌,这时候价格可能筑底。
import os
import time
import requests
import quandl
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use("ggplot")
1. 准备数据
从Quandl下载COT报告。
Quandl是金融数据提供商,有大量的免费数据集可以使用,用户需要先申请API密钥。
为了方便用Python获取数据,先安装三方库’quandl’.
codes = pd.read_csv("./cot.csv")
codes.head()
category | symbol | name | cnname | code_future | code | |
---|---|---|---|---|---|---|
0 | currency | ICE_DX | U.S. Dollar Index | 美元指数 | CHRIS/ICE_DX1 | CFTC/098662_FO_L_ALL |
1 | currency | CME_BT | Bitcoin CME Futures | 比特币 | NaN | CFTC/133741_FO_L_ALL |
2 | currency | CME_BP | British Pound | 英镑 | CHRIS/CME_BP1 | CFTC/096742_FO_L_ALL |
3 | currency | CME_CD | Canadian Dollar | 加元 | CHRIS/CME_CD1 | CFTC/090741_FO_L_ALL |
4 | currency | CME_JY | Japanese Yen | 日元 | CHRIS/CME_JY1 | CFTC/097741_FO_L_ALL |
quandl.ApiConfig.api_key = "your api key"
quandl.ApiConfig.api_key = os.getenv("QUANDL_API")
# 下载货币,指数,能源和金融期货的的COT报告
categories = ["currency", "energy", "index", "metal"]
cot_list = []
t0 = time.time()
for _, row in codes.loc[codes.category.isin(categories)].iterrows():
try:
symbol, code = row["symbol"], row["code"]
df = quandl.get(code)
df["symbol"] = symbol
cot_list.append(df)
print(f"{symbol}: download data success")
except Exception as e:
print(f"{symbol}: download failed {e}")
time.sleep(1)
# 下载完毕后先合并数据,然后保存在本地csv,方便后续使用
cot_joined = pd.concat(cot_list)
cot_joined.to_csv("./cot_history.csv", index=True)
elapsed = (time.time() - t0) / 60.0
print(f"tasks completed in {elapsed:.2f} minutes")
ICE_DX: download data success
CME_BT: download data success
CME_BP: download data success
CME_CD: download data success
CME_JY: download data success
CME_SF: download data success
CME_EC: download data success
CME_AD: download data success
CME_MP: download data success
CME_NE: download data success
CME_RA: download data success
CME_BR: download data success
CME_RU: download data success
CME_CL: download data success
CME_RB: download data success
CME_QG: download data success
CME_BZ: download data success
CME_EH: download data success
CME_ES: download data success
CME_NQ: download data success
CME_YM: download data success
CBOE_VX: download data success
CME_GC: download data success
CME_SI: download data success
CME_HG: download data success
CME_PL: download data success
CME_PA: download data success
tasks completed in 1.13 minutes
usecols = [
"Date", "Open Interest", "Noncommercial Long", "Noncommercial Short",
"Commercial Long", "Commercial Short", "symbol"<