这是我的第32篇文章

。最近要开始研究期货上的机器学习(Machine Learning)策略了。相信关注我的朋友已经多多少少知道一些有关机器学习的基础知识了,对于机器学习的基础知识我这边不会介绍,只会简单的提一下,不懂的朋友自行网上搜索资料学习。未来一段时间里,我将会利用所学的知识开发一个期货上的ML策略。

策略思路如下:交易时间内每分钟从主力合约(可以理解为交易活跃的股票)中选取未来几分钟内极大可能有较大的涨幅或跌幅的合约,对他们进行做多或做空。非常像我之前做的股票策略一样,挑一只未来很大可能上涨的股票对它进行买入操作(

送你一份年化100%+的策略)。

那我需要如何实现这个策略呢。主要分为四个步骤:(1)获取期货主力合约数据;(2)构建机器学习模型,利用数据训练机器学习模型;(3)回测检验模型;(4)模拟盘检验模型。我大概会分4块部分写期货策略的文章,并且我会开源自己的期货ML策略代码,但是核心内容我不会分享,我只会分享我的策略框架。

今天这篇文章将会讲如何获取期货主力合约数据。对于一个ML策略来说,历史数据一定要获取下来存本地,这样才会方便我们的训练。可能有些策略并不需要将数据存本地,但是我们这个ML策略是必须的。

但是期货数据的获取里面有很多坑。首先,期货的数据不像股票,期货的合约经常是变化的,每个合约大概只有1年不到的数据,而大部分股票数据基本都是有好几年或是几十年。其次,不同合约的交易时间也不同,有些合约是有夜盘交易时间,有些则没有。总之,期货的数据获取还是有很多坑的。接下来我将告诉大家如何进行获取数据。

1 主力合约基本信息获取

首先我们需要知道不同时间段哪些合约是主力合约。这里tushare提供了很好的接口获取。我们可以利用fut_basic接口获取有哪些合约类别,然后利用fut_mapping接口获取不同合约类别下不同时间内的主力合约名称。核心代码如下:

# 获取各个时段主力合约df_list = []for exchange in ['DCE', 'CZCE', 'SHFE', 'INE']:df = pro.fut_basic(exchange=exchange, fut_type='2', fields='ts_code,symbol,name')df['is_zhuli'] = df['name'].apply(myfun1)df = df[df['is_zhuli'] == True]df['exchange'] = exchangedf_list.append(df[['ts_code', 'symbol', 'name', 'exchange']])df_list = pd.concat(df_list).reset_index(drop=True)df_zhuli = []for i in tqdm(range(len(df_list))):code = df_list['ts_code'][i]exchange = df_list['exchange'][i]symbol = df_list['symbol'][i]# 获取主力合约TF.CFX每日对应的月合约df = pro.fut_mapping(ts_code=code)df['trade_date'] = pd.to_datetime(df['trade_date'], infer_datetime_format=True)# 筛选到制定时间段df = df[(df['trade_date'].dt.date >= trade_date_min) & (df['trade_date'].dt.date <= trade_date_max)]# 获得成为主力合约的时间段df = df.groupby('mapping_ts_code')['trade_date'].agg({'max', 'min'}).reset_index()df['exchange'] = exchangedf['symbol'] = symbol# df.columns = ['code', 'date_max', 'date_min', 'exchange', 'symbol']df = df.rename(columns={'mapping_ts_code': 'code', 'max': 'date_max', 'min': 'date_min'})df_zhuli.append(df)df_zhuli = pd.concat(df_zhuli).reset_index(drop=True)

2 主力合约日线行情获取

主力合约获取完成之后我们就可以获取其对应主力合约日线信息(开盘价,收盘价等信息)。这个信息同样可以利用tushare获取。核心代码如下:

def get_day(df_zhuli):for i in tqdm(range(len(df_zhuli))):# if i < 299: continueday1 = df_zhuli['date_max'][i]et = str(day1.year) + str(day1.month).zfill(2) + str(day1.day).zfill(2)day2 = df_zhuli['date_min'][i]st = str(day2.year) + str(day2.month).zfill(2) + str(day2.day).zfill(2)num = myfun2(df_zhuli['code'][i])symbol = df_zhuli['symbol'][i]exchange = df_zhuli['exchange'][i]#if exchange != 'CZCE':code = exchange + '.' + symbol.lower() + numsave_path = os.path.join('data/day', code + ".csv")else:code = exchange + '.' + symbol + num[1:]save_path = os.path.join('data/day', code + ".csv")code = df_zhuli['code'][i]df = pro.fut_daily(ts_code=code, start_date=st, end_date=et)df.to_csv(save_path)time.sleep(0.3)

3 主力合约分时行情获取

日线行情获取完之后,我们就需要获取分时数据。分时数据,我们可以利用天勤的api获取。因为后续会进行一系列的匹配问题,所以我们需要确定比较精确的主力合约分时行情的起始时间和终止时间(起始时间是前一个交易日的21:00,终止时间是当个交易日的15:00)。这样的话当后面匹配出问题时也能知道哪块出问题了。具体,大家自己看代码吧,我就不多说了。这里需要注意一下,我在获取数据的时候发现CZCE.JR003这个合约数据获取不到,不知道为什么,不过问题不大。

def get_1min(df_zhuli, day2idx, idx2day):# # 1分钟k线数据下载for i in tqdm(range(len(df_zhuli))):# if i >= 173:# continue# breakday1 = df_zhuli['date_max'][i]et = datetime.datetime(day1.year, day1.month, day1.day, 16)# 获取分时数据时,要从前一个交易日的21点开始day2 = df_zhuli['date_min'][i]st = day2.year*10000 + day2.month*100 + day2.dayidx = day2idx[st]if idx == 0:st = datetime.datetime(st // 10000, st % 10000 // 100, st % 10000 % 100, 8)else:st = idx2day[idx-1]st = datetime.datetime(st//10000, st % 10000//100, st % 10000 % 100, 20)num = myfun2(df_zhuli['code'][i])symbol = df_zhuli['symbol'][i]exchange = df_zhuli['exchange'][i]#if exchange != 'CZCE':code = exchange + '.' + symbol.lower() + numelse:code = exchange + '.' + symbol + num[1:]if code == 'CZCE.JR003': continue # 这个文件有问题# print(code, st, et)save_path = os.path.join('data/1minute', code+".csv")# if code not in ['CZCE.JR009', 'SHFE.cu1902', 'SHFE.wr2005', 'SHFE.wr2101']:# continuekd = DataDownloader(api, symbol_list=code, dur_sec=60,start_dt=st, end_dt=et, csv_file_name=save_path)try:while not kd.is_finished():api.wait_update()# print("progress: kline: %.2f" % (kd.get_progress()))kd.get_progress()except Exception as e:print(code)print(e)

4 指数行情合成

在股票投资的过程中,如果大盘行情好的话个股基本都好。期货应该也一样(我不太清楚),那如何获取一个期货对应的指数呢?有一些财经软件会有自己的一个指数,比如文华财经会有文华指数。这些不同软件的指数数据只能在各自软件上使用,且实盘或模拟盘的过程中不好取指数数据,因此我们需要自己合成一个指数行情。具体计算公式如下:

当日指数涨幅=SUM(主力合约涨幅*主力合约当日累计成交量)/SUM(主力合约当日累计成交量)

这个公式计算可能不太合理,大家自己有更好的想法可以用自己的指数计算公式,也可以添加更多的非主力合约一起计算。

核心代码如下:

def get_cumvol(x):x = x.sort_values('datetime', ascending=True).reset_index(drop=True)x['cumvol'] = x['volume'].cumsum()return x[['datetime', 'cumvol']]tmp_df = df_min.groupby(['trade_date', 'ts_code']).apply(get_cumvol).reset_index()df_min = df_min.merge(tmp_df[['datetime', 'ts_code', 'cumvol']], on=['datetime', 'ts_code'], how='left')def get_index(x):index_rate = np.sum(x['rate'] * x['cumvol']) / np.sum(x['cumvol'])return index_rateindex = df_min.groupby('datetime').apply(get_index).reset_index()index.columns = ['datetime', 'rate']

以上就是数据获取的全部内容。

所有代码均已上传至github:

https://github.com/wbbhcb/futures_strategy/tree/master/ML_Strategy

python获取期货数据_【python量化】期货ML策略(一)数据获取相关推荐

  1. python获取同花顺数据_开启量化第一步!同花顺iFinD数据接口免费版简易操作教程...

    金融市场波动频繁,投资往往会夹杂非理性的情绪.而量化交易,旨在以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种"大概率"事件以制定策略, ...

  2. python获取交易软件数据_几行Python代码,轻松获取美股阿里巴巴的交易数据

    原创: 野马 菜鸟学Python 学Python可以干很多事情,比如爬虫,数据分析,机器学习,但是有一个非常小众的分支,不仅结合了两大高薪行业,而且还薪水非常诱人,就是量化金融岗位.目前Python已 ...

  3. python获取摄像头数据_用Python获取摄像头并实时控制人脸 !

    实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不断 ...

  4. 如何用python爬取图片数据_“python爬取微博图片教程“用Python爬虫爬取的图片怎么知道图片有没有水印...

    怎样用python爬新浪微博大V所有数据 我是个微博重度,工作之余喜欢刷刷timeline看看有什么新鲜事发也因此认识了高质量的原创大V,有分享技术资料的,比如好东西传送门:有时不时给你一点人生经验的 ...

  5. python爬虫筛选数据_[python爬虫]使用beautifulsoup库的select方法对网页内容进行筛选...

    from bs4 import BeautifulSoup html = """ The Dormouse's story The Dormouse's story On ...

  6. python 通达信数据_[python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上...

    1 #coding=utf-8 2 3 #读取'[paint]'开头的csv文件 4 #copyright @ WangXinsheng 5 #http://www.cnblogs.com/wangx ...

  7. python处理期货数据_获取和讯期货数据(Python版本)

    获取和讯期货数据(Python版本) 获取和讯期货数据(Python版本) Author: edwardgyw, Date: 2016-11-28 14:38:44 Tags: Python 扩展 商 ...

  8. python自动获取天气_用python获取天气数据,并作定时播报

    原标题:用python获取天气数据,并作定时播报 数据挖掘入门与实战 公众号: datadw 思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早 ...

  9. MapBox离线地图+python获取瓦片数据

    工作中需要使用离线地图. 使用工具:MapBox离线地图+python获取瓦片数据 前端页面: <!DOCTYPE html> <html> <head><m ...

  10. Python 获取接口数据,解析JSON,写入文件

    Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而 ...

最新文章

  1. python中如何定义一个数组_Python数组定义方法
  2. 资源 | Deeplearning.ai课程与笔记汇总
  3. 基于Asp.Net Core打造轻量级内部服务治理RPC(二 远程服务设计)
  4. Python数据挖掘-相关性-相关分析
  5. getmany返回值 gjson_序列化多个模型并在一个JSON响应中发送所有Django Rest框架
  6. 《软件测试与质量保证》期末复习重点
  7. 区块链如何赋能车联网-Higgs Chain
  8. Python:获取命令行参数
  9. [转载] python--isalnum()函数
  10. yandex安装插件教程,研究了一下午终于可以用了
  11. Ubuntu永久修改IP、临时修改IP
  12. 一次内存泄露的分析及总结
  13. 一键去“码”的AI,还能认出带上口罩的脸
  14. 分集增益的不同合并方式的性能分析
  15. 技术人员如何创业(2)---合伙人的模式
  16. Cesium开发:简单箭头画法
  17. luogu P5320 [BJOI2019]勘破神机
  18. doe报告模板_DMAIC六西格玛项目报告模板.ppt
  19. 我的java学习之路之Spring MVC
  20. 明孝陵的石象道:南京最美600米

热门文章

  1. 数据分析 - 数据可视化图表 适用场景(学习笔记)
  2. Excel的N函数和VALUE函数的使用和区别
  3. SDRAM内存的接口和设计方法(并行输送接口)
  4. 千万千万别裸辞,否则你已经死了
  5. XP 删除微软拼音 3.0
  6. 美团“猜你喜欢”深度学习排序模型实践
  7. vscode顶部菜单栏不见了,怎么办?
  8. 2014年中国行地产排行
  9. 今日凌晨Vue3 beta版震撼发布,竟然公开支持脚手架项目!
  10. 【入门】QQ聊天机器人--HelloWorld篇