python量化低频策略——利用USDA数据、中国统计局PMI构建菜粕期货策略

python量化低频策略——利用USDA数据、统计局PMI数据构建菜粕期货策略

原创内容

笔者属于python初学者,本文所列代码大多内容也是清洗数据、筛选等内容,
各方面还有待提炼与深化。感兴趣的朋友,欢迎私信交流。

一.名词解释:
USDA,全称:United States Department of Agriculture。USDA每月上旬(一般在每月8日-12日之间)会公布World Agricultural Supply and Demand Estimates(全球农作物供需)报告。该报告会对世界多地区多种类主要农作物进行供需方面的预测。本策略主要利用该报告中,中国区域大豆供需数据。

中国统计局PMI:PMI指数全称为urchasing Managers’ Index,中文意思是采购经理指数。是能够反映宏观经济情况的重要指标。中国统计局每月初会公布上一月份的PMI指数。

菜粕期货:为国内郑州商品交易所(下称“郑商所”)的菜粕期货合约。菜粕是油菜籽压榨菜油所产生的副产品,主要用于饲料。

豆粕期货:为国内大连商品期货交易所(下称“大商所”)的豆粕期货合约。豆粕是大豆压榨豆油所产生的副产品,主要用于饲料。国内大豆近八成供应源于进口,同时豆粕与菜粕有一定替代关系,价格上存在强相关性。

二.构建方式
最初,笔者是想利用USDA报告数据及统计局PMI数据,进行多元线性回归分析,预估菜粕与豆粕之间的价差,然后进行跨品种套利操作,结果拟合出来的R^2参数非常低,不具有参考价值。后来,笔者转为利用数据进行多元线性回归分析,仅进行菜粕期货(05合约)单品种的预估,进行单边操作。通过sklearn多次进行训练集、测试集的拟合,R^2在0.4-0.6之间,具备一定参考价值。
由于USDA报告发布时间在国内期货夜盘收市之后,故以USDA报告发布后最近的国内开盘日为策略操作日。判断准则如下:
根据当月之前的各月数据进行回归分析,得出模型结合当月数据进行本月价格预测。
预测价格<开盘价-50(50为手工调参的数据,根据个人风险承受能力调整。该数据越大,入场操作次数会越少)入场做空,每月最后交易日平仓。
(考虑手续费、滑点等情况,交易成本估为20,对于小规模持仓来说,是一个偏高的参数)

三.软件及主要是用的库
本次使用python软件,主要使用的库有:
1.pandas,基于numpy的数据处理利器
2.sklearn,一个机器学习库,具备多种分类、回归和聚类算法。本次用到多元回归分析LinearRegression
3.os 操作系统访问的模块。
4.re 用于进行正则表达式的模块。
5.statsmodels 重要的统计模块包。

四.构建步骤
1处理USDA报告
USDA的月度报告可从以下地址下载:
https://usda.library.cornell.edu/concern/publications/3t945q76s?locale=en
关于中国大豆供需数据在excel的第28页,同时显示了当月及上月的数据,我们主要使用当月数据(请见下图)故读取文件后,进行re的正则表达式进行匹配工作。
在这里插入图片描述

笔者最初使用xlrd进行USDA报告excel文件的读取、处理,后来发现pandas的read_excel方式,效率更高,方便之后的处理工作。代码中,还可见最初xlrd的引用。另外,顺便批评一下USDA,报告excel在早期与近期,编排格式不一致(见下图)。笔者根据近期USDA报告excel编写代码后,用代码跑早期的报告excel,导致错误,故要结合dropna及切片等进行数据清洗。
在这里插入图片描述
(早期)
在这里插入图片描述
(近期)

USDA报告处理的完整代码:

// 
import xlwt
import xlrd
import os
import pandas as pd 
import re
pd.set_option('display.width', None)
data=os.listdir('E:\python\data\excel\\usda\month excel')
usda=xlwt.Workbook('E:\python\data\excel\\usda\\usda.xlsx')
usda.add_sheet('usda')
usda_pd=pd.DataFrame(columns=['Nationl','Date','month','Beginning Stocks','Production','Imports','Domestic Crush','Domestic Total','Exports','Ending Stocks'])
usda.save('E:\python\data\excel\\usda\\usda.xls')
for i in range(0,len(data)):
    path=os.path.join('E:\python\data\excel\\usda\month excel',data[i])
    rw=xlrd.open_workbook(path) #rw=read workbook
    rs=rw.sheet_by_name('Page 28') #rs=read sheet
    col=rs.col(0)
    pdd=pd.read_excel(path,"Page 28",header=None,skiprows=40).dropna(how='all').dropna(axis=1,how='all')  
    pdd.columns=['Nationl','month','Beginning Stocks','Production','Imports','Domestic Crush','Domestic Total','Exports','Ending Stocks']  
    bool=pdd['Nationl'].str.contains('\s{2}China', na=False,regex=True)
    data_index=pdd[bool].index[-1]
    t_pd=pdd.loc[data_index+1]
    t_pd['Nationl']='China'
    t_pd['Date']=data[i][:-4]
    t_pd.name=data[i]
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值