由于钢材市场价格波动较大,因此公司在采购钢材时面临较大的风险。通过螺纹钢期货可以提前锁定钢材价格,从而为公司管理决策减少未知和不确定性。

import openpyxl
import pandas as pd
pd.set_option('display.max_columns', None)# 显示所有列
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif']=['simhei']#用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用于正常显示负号
import matplotlib
matplotlib.use('Agg')
import datetime,time
import numpy as np
import re
import os
list_type_iron=['20MM','12MM','8MM','average']#所有螺纹钢类型#读取期货价格数据
data_future=pd.read_excel('原始数据/期货价格数据.xlsx',index_col='时间').ix[:,'收盘价']#读取期货数据#读取钢铁价格数据
dict_type_price_iron={}#按照螺纹钢类型保存的钢铁价格数据字典
for type_iron in list_type_iron:data_price_iron=pd.read_excel('原始数据\钢铁价格数据.xlsx',sheet_name=type_iron,index_col='指标名称').dropna()dict_type_price_iron[type_iron]=data_price_ironclass HedgeFunc():def __init__(self,type_iron,periods_hedge,data_order):self.data_order = data_orderself.ph=periods_hedge#对冲间隔天数self.ti=type_iron#对冲所用螺纹钢类型self.__data()self.__basic_parameters()#数据处理def __data(self):self.data_price_iron=dict_type_price_iron[self.ti]#获得指定类型的螺纹钢价格数据self.data_price_iron = self.__combine(self.data_price_iron, data_future,col='期货价格')  # 将期货价格拼接至钢铁价格后面self.data_future_diff=data_future.diff().dropna()#计算期货价格变动值self.data_price_iron_diff=self.data_price_iron.diff().dropna()#计算钢铁价格变动值self.data_price_diff=self.__combine(self.data_price_iron_diff,self.data_future_diff,col='期货价格变化')#将期货价格变化拼接至钢铁价格后面#定义基本变量def __basic_parameters(self):self.list_date = list(self.data_price_iron.index)#钢铁价格数据有效日期,用于全局使用的日期列表self.list_date_all = pd.date_range(str(data_future.index.min()), str(data_future.index.max())).astype(str).tolist()  #所有日期,用于检索订单日数据self.cities=list(data_price_iron.columns)#所有城市名称self.ratio_promise=0.05#期货合约价值保证金比例self.rate=0.04#保证金利息率self.T_hedge=15#计算对冲比率的期间#绘制两个变量的散点图def __scatter_diff(self,y1,y2,xlabel='',ylabel=''):plt.figure(figsize=(10,10))plt.scatter(y1,y2)plt.xlabel=xlabelplt.ylabel=ylabel#将时间序列data2按照时间维度拼接到数据框data1中,缺失的地方用data2中下一个数补上def __combine(self,data1,data2,col):"""self.data_price_diff=self.__combine(self.data_price_iron_diff,self.data_future_diff,col='期货价格变化')#将期货价格变化拼接至钢铁价格后面"""data1[col]=0.000000for date in data1.index:if date not in data2.index:data1.ix[date,col]=data2[data2[data2.index > date].index[0]]else:data1.ix[date,col]=data2[date]return data1#通过最小二乘法计算数据data的T期最佳对冲比率hdef __h(self,data):"""self.__h(self.data_price_diff,40)"""T=self.T_hedgedata_h=data[self.cities]#生成一个表格用于存放生成的回归系数data.index=range(len(data))for i in data.index[T:]:y=data.ix[(i-T):i,'期货价格变化']for city in self.cities:x=data.ix[(i-T):i,city]coef=self.__OLS(x,y)#回归系数data_h.ix[i,city]=coefprint([i,city])return data_h#通过最小二乘法计算两个变量的一元回归系数def __OLS(self,x,y):"""self.__OLS(data_price_diff['期货价格'],data_price_diff['杭州'])"""x=np.array(x).reshape(-1, 1)y=np.array(y).reshape(-1, 1)model = LinearRegression(fit_intercept=False).fit(x, y)  # 拟合模型return   model.coef_[0,0]  # 查看拟合系数#将采购日现货价格添加至订单数据def __add_future(self):self.data_order[self.ti + '现货价格'] = 0.000000for i in self.data_order.index:date = self.data_order.ix[i, '结算单日期']  # 采购日期if date not in self.list_date:#如果日期不再目标列表,将取下一个值date=self.data_price_iron.ix[self.data_price_iron.index>date].index[0]city = self.data_order.ix[i, '采购地']self.data_order.ix[i,self.ti + '现货价格']=self.data_price_iron.ix[date,city]#计算每笔订单的采购数量(吨)self.data_order[self.ti + '采购吨数'] =self.data_order['税前结算金额']/self.data_order[self.ti + '现货价格']#将订单日的现货价格,期货价格,对冲比率添加至订单数据data_orderdef __add_order(self):"""self.__add_hedge(data_order)"""self.data_order[self.ti + '订单日现货价格' + str(self.ph)] = 0.000000self.data_order[self.ti + '订单日期货价格' + str(self.ph)] = 0.000000self.data_order[self.ti + '订单日对冲比率' + str(self.ph)]=0.0000for i in self.data_order.index:date=self.data_order.ix[i,'结算单日期']#采购日期date_order=self.list_date_all[self.list_date_all.index(date)-self.ph]#订单日日期if date_order not in self.list_date:#如果日期不再目标列表,将取下一个值date_order=self.data_price_iron.ix[self.data_price_iron.index>date_order].index[0]city = self.data_order.ix[i, '采购地']self.data_order.ix[i, self.ti + '订单日期货价格' + str(self.ph)] = self.data_price_iron.ix[date_order, '期货价格']  # 将螺纹钢订单日期货价格加入订单数据表self.data_order.ix[i, self.ti + '订单日现货价格' + str(self.ph)] = self.data_price_iron.ix[date_order, city]#将螺纹钢订单日现货价格加入订单数据表self.data_order.ix[i, self.ti + '订单日对冲比率' + str(self.ph)]=self.h.ix[date_order,city]#将订单日对冲比率加入订单数据表格print([date, city])return self.data_order#计算对冲详细过程def __hedge_data(self):#价格变化幅度self.data_order[self.ti + '价格变化幅度' + str(self.ph)]=(self.data_order[self.ti + '现货价格']-self.data_order[self.ti + '订单日现货价格' + str(self.ph)])/self.data_order[self.ti + '订单日现货价格' + str(self.ph)]self.data_order[self.ti + '期货合约数量' + str(self.ph)]=self.data_order[self.ti + '订单日对冲比率' + str(self.ph)]*self.data_order[self.ti + '采购吨数']#计算所需期货合约数量self.data_order[self.ti + '期货合约总额' + str(self.ph)] =self.data_order[self.ti + '期货合约数量' + str(self.ph)]*self.data_order[self.ti + '订单日期货价格' + str(self.ph)]#self.data_order[self.ti + '保证金' + str(self.ph)] =self.data_order[self.ti + '期货合约总额' + str(self.ph)]*self.ratio_promiseself.data_order[self.ti + '保证金利息' + str(self.ph)] =self.data_order[self.ti + '保证金' + str(self.ph)]*self.rate*self.ph/365self.data_order['期货价格变化' + str(self.ph)]=self.data_order['期货价格']-self.data_order[self.ti + '订单日期货价格' + str(self.ph)]self.data_order['期货收益' + str(self.ph)]=self.data_order['期货价格变化' + str(self.ph)]*self.data_order[self.ti + '期货合约数量' + str(self.ph)]self.data_order[self.ti + '总收益' + str(self.ph)]=self.data_order['期货收益' + str(self.ph)]-self.data_order[self.ti + '保证金利息' + str(self.ph)]self.data_order[self.ti + '真实结算金额' + str(self.ph)]=self.data_order['税前结算金额']-self.data_order[self.ti + '总收益' + str(self.ph)]#用期货的收益来抵消购买成本self.data_order[self.ti + '真实单价' + str(self.ph)] =self.data_order[self.ti + '真实结算金额' + str(self.ph)]/self.data_order[self.ti + '采购吨数']#对冲幅度self.data_order[self.ti + '对冲幅度' + str(self.ph)] =(self.data_order[self.ti + '真实单价' + str(self.ph)]-self.data_order[self.ti + '现货价格'])/self.data_order[self.ti + '现货价格']#data_order.fillna(method='bfill',inplace=True)#选取指定范围的数据def select_range(self,data,col,quantile,type='上'):"""col:列标题;quantile:分位数;type:大于或小于col='20MM对冲幅度60'"""number_quantile=np.quantile(data[col].tolist(),quantile)if type=='上':return data.ix[data[col]>number_quantile]elif type=='下':return data.ix[data[col]<number_quantile]#对冲结果分析def results_analyse(self,data):#计算在价格上涨的日子成功降价的比率self.data_up=data.ix[data[self.ti + '订单日现货价格' + str(self.ph)]<data[self.ti + '现货价格']]#价格上涨的样本数据self.len_up=len(self.data_up)#价格上涨的样本数据的个数self.data_up_sucess=self.data_up.ix[self.data_up[self.ti + '真实单价' + str(self.ph)] < self.data_up[self.ti + '现货价格']]#在价格上涨中对冲成功的数据self.len_up_sucess=len(self.data_up.ix[self.data_up[self.ti + '真实单价' + str(self.ph)]<self.data_up[self.ti + '现货价格']])#价格上涨的样本数据对冲成功的个数self.prob_up_sucess=self.len_up_sucess/self.len_up# 计算在价格下降的日子成功降价的比率self.data_down=data.ix[data[self.ti + '订单日现货价格' + str(self.ph)]>data[self.ti + '现货价格']]#价格下降的样本数据self.len_down=len(self.data_down)#价格下降的样本数据的个数self.data_down_sucess = self.data_down.ix[self.data_down[self.ti + '真实单价' + str(self.ph)] > self.data_down[self.ti + '现货价格']]  # 在价格上涨中对冲成功的数据self.len_down_sucess=len(self.data_down.ix[self.data_down[self.ti + '真实单价' + str(self.ph)]>self.data_down[self.ti + '现货价格']])#价格下降的样本数据对冲成功的个数self.prob_down_sucess=self.len_down_sucess/self.len_downreturn pd.DataFrame([[self.len_up,self.len_up_sucess,self.prob_up_sucess],[self.len_down,self.len_down_sucess,self.prob_down_sucess]],columns=['个数','成功个数','成功比率'],index=['上涨','下降'])#展示常用的数据def print_summary(self,data):self.cols_summary=[self.ti + '订单日现货价格' + str(self.ph),self.ti + '现货价格',self.ti + '真实单价' + str(self.ph),self.ti + '订单日期货价格' + str(self.ph),'期货价格',self.ti + '订单日对冲比率' + str(self.ph)]return data[self.cols_summary]#绘制对冲结果图:输入任意个列标题名称,绘制图形def  plot_hedge(self,data,title,*cols):"""col1=self.ti + '订单日现货价格' + str(self.ph)col2=self.ti + '现货价格'col3=self.ti + '真实单价' + str(self.ph)self.plot_hedge(self.data_up_sucess,col1,col2,col3)"""plt.figure(figsize=(20, 8))for col in cols:plt.plot(data[col], label=col)plt.legend()plt.xticks(rotation=270)plt.xlabel('订单号',fontsize=10)plt.ylabel('价格',fontsize=10)plt.grid(alpha=0.3,color='g')plt.title(title,fontsize=15)plt.savefig('生成数据/生成图片/{}.jpg'.format(title))# 计算不同的对冲比率期限下的成功对冲概率@classmethoddef select_T_periods(cls):data_T_hedge = pd.DataFrame(index=['上涨个数', '下跌个数', '上涨成功个数', '下跌成功个数', '上涨时期成功概率', '下跌时期成功概率'])for T_hedge in np.arange(10, 90, step=10):hedge = cls('20MM', 60)hedge.T_hedge = T_hedgehedge.run()data_prob = hedge.data_probdata_T_hedge[T_hedge] = [data_prob.ix[0, 0], data_prob.ix[1, 0], data_prob.ix[0, 1], data_prob.ix[1, 1],data_prob.ix[0, 2], data_prob.ix[1, 2]]data_T_hedge.to_excel('生成数据/各种对冲比率期限下的对冲成功概率.xlsx')#运行函数def run(self):self.h = self.__h(self.data_price_diff)self.__add_future()self.__add_order()self.__hedge_data()self.data_prob=self.results_analyse(self.data_order)#在价格上涨时期和下跌时期对冲成功的结果分析#绘制上涨时期或下跌时期的对冲结果图def plot_up_down(self):#绘制在价格上涨时期成功对冲的订单图col1=self.ti + '订单日现货价格' + str(self.ph)col2=self.ti + '现货价格'col3=self.ti + '真实单价' + str(self.ph)col4=self.ti + '订单日期货价格' + str(self.ph)col5='期货价格'col=self.ti + '对冲幅度' + str(self.ph)data_up = self.select_range(self.data_up_sucess,col=col, quantile=0.1, type='下')data_down = self.select_range(self.data_down_sucess,col=col, quantile=0.9, type='上')self.plot_hedge(data_up,'在价格上涨时期{}{}对冲图'.format(self.ti,self.ph),col1,col2,col3,col4,col5)self.plot_hedge(data_down, '在价格下跌时期{}{}对冲图'.format(self.ti,self.ph), col1, col2, col3,col4,col5)#各种示例def example(self):self.__scatter_diff(self.data_price_diff['期货价格变化'],self.data_price_diff['杭州'],'期货价格变化','杭州')#绘制杭州钢铁价格变化和期货价格变化之间散点图self.__scatter_diff(self.data_price_diff['期货价格变化'], self.data_price_diff['南京'], '期货价格变化', '南京')self.__OLS(self.data_price_diff['期货价格变化'],self.data_price_diff['杭州'])self.h=self.__h(self.data_price_diff,40)self.h = self.__h(self.data_price_diff)self.__add_future()self.__add_order()self.__hedge_data()self.data_prob=self.results_analyse(self.data_order)#在价格上涨时期和下跌时期对冲成功的结果分析self.plot_up_down()def main():for type_iron in list_type_iron:for periods_hedge in range(30, 100, 10):# 读取订单数据data_order = pd.read_excel('原始数据/订单数据.xlsx', sheet_name='20MM')[['结算单日期', '税前结算金额', '采购地', '星期', '期货价格']]data_order = data_order.ix[data_order['税前结算金额'] > 1]hedge = HedgeFunc(type_iron, periods_hedge,data_order)hedge.run()pd.DataFrame().to_excel('生成数据\对冲结果{}{}.xlsx'.format(type_iron, periods_hedge))  # 创建空白表格,准备填入数据wb = openpyxl.load_workbook('生成数据\对冲结果{}{}.xlsx'.format(type_iron, periods_hedge))  # 将空白表格指定为wbwriter = pd.ExcelWriter('生成数据\对冲结果{}{}.xlsx'.format(type_iron, periods_hedge),engine='openpyxl')  # 准备往空白表格写入数据writer.book = wb  # 执行写入目标为空白表格hedge.data_order.to_excel(writer, sheet_name='{}螺纹钢{}对冲总结果'.format(type_iron, periods_hedge))  # 将总对冲结果填入hedge.data_up.to_excel(writer, sheet_name='{}螺纹钢{}上涨时期数据'.format(type_iron, periods_hedge))  # 将总对冲结果填入hedge.data_down.to_excel(writer,sheet_name='{}螺纹钢{}下跌时期数据'.format(type_iron, periods_hedge))  # 将总对冲结果填入hedge.data_up_sucess.to_excel(writer, sheet_name='{}螺纹钢{}上涨时期对冲成功数据'.format(type_iron,periods_hedge))  # 将总对冲结果填入hedge.data_down_sucess.to_excel(writer, sheet_name='{}螺纹钢{}下跌时期对冲成功数据'.format(type_iron,periods_hedge))  # 将总对冲结果填入hedge.data_prob.to_excel(writer,sheet_name='{}螺纹钢{}对冲结果统计'.format(type_iron, periods_hedge))  # 将总对冲结果填入hedge.print_summary(hedge.data_up_sucess).to_excel(writer,sheet_name='{}螺纹钢{}上涨时期对冲成功简要数据'.format(type_iron,periods_hedge))  # 将总对冲结果填入hedge.print_summary(hedge.data_down_sucess).to_excel(writer,sheet_name='{}螺纹钢{}下跌时期对冲成功简要数据'.format(type_iron,periods_hedge))  # 将总对冲结果填入writer.save()writer.close()hedge.plot_up_down()print(type_iron, periods_hedge)if __name__ =='__main__':main()

利用螺纹钢期货对钢材采购成本做对冲_2020_10_24相关推荐

  1. 期货策略matlab,code 一个利用MATLAB编写的螺纹钢期货高频交易套利策略 联合开发网 - pudn.com...

    code 所属分类:金融证券系统 开发工具:matlab 文件大小:506KB 下载次数:398 上传日期:2013-10-09 14:14:53 上 传 者:huangxiao 说明:  一个利用M ...

  2. 获取铁矿石和螺纹钢期货数据。对收益率序列进行描述性统计、jb检验,反正是否符合分形市场假说。计算Hurst指数,制定跨品种套利策略,并进行回测,对跨品种套利效果进行评估。寻求改进空间。

    源码已上传至github 项目简介 获取铁矿石和螺纹钢期货数据.对收益率序列进行描述性统计.jb检验,反正是否符合分形市场假说.计算Hurst指数,制定跨品种套利策略,并进行回测,对跨品种套利效果进行 ...

  3. iacr crypto 级别_混沌看盘:23~24日螺纹钢期货 多头震荡时间延长,级别加大

    结论 调整还会进行,在一两天内不会结束,下调的空间依然有限,先看356x附近的半日生命线,趋势上还是需要对3544的周线箱体进行一次到位的回踩.目前3580~3594的过渡型日线级别的箱体也已经失去技 ...

  4. 2020年数维杯国际大学生数学建模A题中国螺纹钢需求预测求解全过程文档及程序

    2020年数维杯国际大学生数学建模 A题 中国螺纹钢需求预测 原题再现:   螺纹钢是我国产量最大的钢铁产品之一.钢筋广泛应用于房屋.桥梁.道路等土木工程建设中.它是基础设施建设不可缺少的结构材料.合 ...

  5. 基于python的螺纹钢28分钟策略

    自己的一个小团队, 用python从头到尾搭了一个交易平台, 从数据到回测,到模拟仿真到实盘交易, 折腾了大半年, 基本该填的坑都填上了. 小团队做自动化交易,不容易,跟大家分享一下: 先别想着策略, ...

  6. 从传统采购向SRM数字采购转型,大宗商品企业实现采购成本有效控制

    据有关数据显示,全球每年大宗商品的产出值大约在10-20万亿美元,占世界GDP的20%.主流大宗商品中,中国基本占据全球大宗消费比例的50%以上.今年1月,中国大宗商品价格指数更是达到152.53点, ...

  7. 汽车汽配行业电子采购系统降低采购成本,增强企业竞争优势

    汽车产业作为国民经济支柱产业,其采购管理有其特有的结构和特点,零部件通常有几万个,不同的车型要求跟标准都不一样,汽车总成本的约70%来源于汽车零部件采购环节,因此没有强大的汽车汽配行业电子采购系统,汽 ...

  8. 智邦国际ERP改善传统采购管理模式 降低采购成本

    信息化时代下,利用ERP系统能够进行几乎全部的采购管理活动,即企业从开始的采购计划的制定,一直到寻找供应商.供应商谈判.在线收付款.开据发票.物流配送.库存的控制.商品的管理以及价格的管控等环节都是通 ...

  9. 采购招投标系统-高效管控招采流程-降低采购成本

    项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求.在企业里建立一个公平.公开.公正的采购环境,最大限度控制采购成本至关重要.符合国家电子招投标法律法规 ...

  10. 企业如何利用生产制造业ERP管理系统做好采购管理?

    采购对生产制造业企业而言,至关重要!采购成本能够占到很多企业经营成本的60%左右,而所采购物料的质量直接决定了产品的质量. 而在生产制造企业的采购工作中,经常会出现一些问题,比如:采购成本难控.采购流 ...

最新文章

  1. Compellent试用手记之二:系统连接
  2. 预编译、作用域链和闭包理解
  3. 配置文件加载位置||外部配置加载顺序||自动配置原理
  4. 常用的开始→运行→输入命令集锦
  5. Flume监听端口,输出端口数据案例
  6. arduino智能风扇系统
  7. java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...
  8. Unity打包APK细节(翻译自官网)
  9. 如何在SQL Server中创建视图
  10. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【六】设计人脸识别的识别类...
  11. 力扣-606. 根据二叉树创建字符串
  12. 阿里总裁马云对于第5个经济体技术有着独特的见解
  13. 2021全国研究生数学建模竞赛F题思路
  14. 通过简单的温湿度传感器进行简单的物联网设计(一)传感器列表
  15. lm75b 读取温度 c语言,STC单片机读取LM75A温度的代码,以及ADC读取电压。给大家分享一下把...
  16. 什么是“双重支付”,即“双花”
  17. 微信公众号怎么引流推广?分享6个实操方法给你!
  18. 输入文本的html,输入文本的步骤主要包括
  19. [Android]判断滑动是向左还是向右?
  20. 引入spring-boot-starter-redis包报错 :unknown

热门文章

  1. UTC时间转北京时间
  2. 深圳地铁五号线联网监控!
  3. 树莓派接3.5mm音响没有声音及音量调节
  4. c语言 析构函数,C++析构函数详解
  5. mybatis当传入数据类型为Int时并且值为0时,会判断为空字符串
  6. 测试在团队中有啥用?
  7. python学习笔记--3.函数
  8. 信息化和信息系统知识点总结
  9. 医疗常用信息化系统介绍
  10. Linux高清壁纸软件,十个小众的 Linux 桌面软件