当前位置: 首页 > news >正文

【掘金量化使用技巧】用日线合成长周期k线

掘金API中的接口最长的周期是‘1d’的,因此周线/月线/年线等数据需要自己进行合成。

基本思路

用日线合成长周期的k线只需要确定好合成的周期以及需要的数据即可。
周期: 一般行情软件上提供年k、月k、周k,我也选择年、月、周再加一个季度频率。
数据: 开盘、收盘、最高、最低、成交额、成交量。
确定好周期和需要的数据以后,就可以开始写函数了。以周线为例,要想合成周线,主要有以下几步:
(1)将日线按照日期以周为频率进行分组
(2)计算开盘、收盘、最高、最低、成交额和成交量。

标的公式
开盘价该周第一天的开盘价
收盘价该周最后一天的收盘价
最高价该周所有最高价的最大值
最低价该周所有最低价的最小值
成交额该周全部成交额的总和
成交量该周全部成交量的总和

确定好基本思路,就可以开始编写函数了。

该函数共需要4个参数,分别为:股票代码、开始日期、结束日期、合成频率。这里面有个需要注意的点:输入的开始时间不一定是合成周期的第一天。(比如合成周线,开始日期输入的是周三,如果直接按照周合成,那么第一个合成的周线就是残缺的,这就需要进行调整,把起始日期前推到该周期的第一天)
按时间分组用到pandas库里面的resample函数,该函数可以按照指定频率对数据进行分组计算,用法如下:

DataFrame. resample(rule, how=None, axis=0, fill_method=None,closed=None,label=None,convention='start, kind=None, loffset=None, limit=None, base=0)

其中freq参数设置可参照下表:
图片
其中我们还使用timedelta对象,可以计算未来和过去的时间。

datetime.timedelta函数用法

最终函数如下:

# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import datetime
import pandas as pd
def compose_bar(symbol,start_time,end_time,frequency):'''symbol:标的,start_time:开始时间,end_time:结束时间,frequency:频率'''# 合成周线if frequency == 'W':# 判断开始日期是否为周一start_time = datetime.datetime.strptime(start_time, '%Y-%m-%d')week_start = start_time.weekday() + 1#默认周一 = 0,周二 = 1,所以对得出的week进行调整,加一,使得周一等于1,便于后面正确的print日期# 如果不是周一,则将开始时间调整到该周周一if week_start != 1:print('输入的开始日期为周{},调整到该周周一'.format(week_start))start_time = start_time - datetime.timedelta(days = week_start - 1)# 合成月线if frequency == 'M':# 判断开始日期是否为月初day_start_1th = int(start_time[8:10])# 如果不是1号,则转为当月1号if day_start_1th != 1 :start_time = datetime.datetime.strptime(start_time, '%Y-%m-%d')start_time = start_time - datetime.timedelta(days = day_start_1th - 1)print('开始日期为该月{}号,调整到当月1号',format(day_start_1th))# 合成季线if frequency == 'Q':# 直接开始日期设置为季度初month = int(start_time[5:7])   # 看开始时间月份year = int(start_time[0:4])     # 看开始时间年份if month in range(1,3):start_time = datetime.date(year,1,1)if month in range(4,6):start_time = datetime.date(year,4,1)if month in range(7,9):start_time = datetime.date(year,7,1)if month in range(10,12):start_time = datetime.date(year,9,1)# 合成年线if frequency == 'A':# 将开始时间调整为年初year_start = int(start_time[0:4])  # 看开始时间年份start_time = datetime.date(year_start,1,1)# 订阅历史数据(注意要复权到当前日期才能和东方财富的数据对得上)data = history(symbol = symbol,frequency = '1d',start_time = start_time,end_time = end_time,fields = 'eob,open,close,high,low,amount,volume',df = True,skip_suspended = True,fill_missing = None, adjust=ADJUST_PREV,adjust_end_time = datetime.datetime.today())# 修改日期格式并变成索引data.eob = data.eob.apply(lambda x :datetime.datetime.strptime(str(x).split(' ')[0],'%Y-%m-%d'))data.set_index(data['eob'],inplace = True)data.drop(columns = ['eob'],inplace = True)data_index = data.resample(frequency,label = 'right').last().index# 结果返回成dataframe格式data_k = pd.DataFrame({'open':data.resample(frequency,label = 'right').first()['open'],'close': data.resample(frequency,label = 'right').last()['close'],'high': data.resample(frequency,label = 'right').max()['high'],'low': data.resample(frequency,label = 'right').min()['low'],'amount': data.resample(frequency,label = 'right').sum()['amount'],'volume': data.resample(frequency,label = 'right').sum()['volume'],'frequency':frequency})data_k.set_index(data_index,inplace = True)# 如果某周放假没有数据,则删除data_k.dropna(inplace = True)return data_k"""
参考history_n()函数建立一个周/月/季度/年 K线的数据获取函数
"""
def history_n_compose(symbol, count, end_time, frequency="W", fields = 'open,close,high,low,amount,volume', fill_missing="last", adjust=ADJUST_PREV, df=True):end_time = datetime.datetime.strptime(end_time, '%Y-%m-%d')end_time = end_time.strftime('%Y-%m-%d')coef = 1 #比例系数if frequency == "W":coef = 5if frequency == "M":coef = 23if frequency == "Q":coef = 90if frequency == "A":coef = 365start_time = get_previous_n_trading_dates(exchange='SHSE', date=end_time, n=count*coef)[0]data = compose_bar(symbol, start_time, end_time, frequency)fields = str(fields).split(',')data = data[fields] # 新建一个dataframe表格用于存储需要用到的数据return data# 测试一下
set_token("自己的token码")
data = history_n_compose('SHSE.510290',100,end_time='2024-09-20',frequency="M")
print(data)
# weekly_k = compose_bar('SHSE.510290','2023-03-05','2024-09-20','W')
# print(weekly_k)
# monthly_k = compose_bar('SHSE.510290','2023-03-05','2024-09-20','M')
# print(monthly_k)
# quarterly_k = compose_bar('SHSE.510290','2023-03-05','2024-09-20','Q')
# print(quarterly_k)
# yearly_k = compose_bar('SHSE.510290','2023-03-05','2024-09-20','A')
# print(yearly_k)

运行结果如下:
在这里插入图片描述
与东方财富给出的周线数据一致。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript发送邮件:实现前端触发的教程?
  • react的组件的概念和使用
  • C++——求3*3矩阵对角元素之和。
  • go语言 swagger 查询 json 字段注释
  • 教你用 python 在国内实现 openAi 的调用
  • 以小人之心度君子之腹
  • Go语言现代web开发14 协程和管道
  • QT中各数据基础类型互转方式有哪些?
  • Docker:简化应用部署与管理的神奇容器
  • 【Kubernetes】常见面试题汇总(二十三)
  • AI音乐创作带给音乐原创人的挑战和机遇
  • 深入浅出Docker
  • unity 高性能对象池解决方案
  • Uniapp 跨域
  • 冒泡排序,选择排序,插入排序,归并排序,快速排序五种排序方法
  • conda常用的命令
  • docker容器内的网络抓包
  • ES6--对象的扩展
  • Java多态
  • k8s如何管理Pod
  • SpiderData 2019年2月16日 DApp数据排行榜
  • spring security oauth2 password授权模式
  • 笨办法学C 练习34:动态数组
  • 复杂数据处理
  • 区块链将重新定义世界
  • 如何合理的规划jvm性能调优
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 智能合约开发环境搭建及Hello World合约
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #stm32驱动外设模块总结w5500模块
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (7)STL算法之交换赋值
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Java)【深基9.例1】选举学生会
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十)Flink Table API 和 SQL 基本概念
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)德国人的记事本
  • .chm格式文件如何阅读
  • .Net 6.0--通用帮助类--FileHelper
  • .net CHARTING图表控件下载地址
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .net core控制台应用程序初识
  • .NET Standard 的管理策略
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET值类型变量“活”在哪?