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

news2024/9/23 13:13:44

掘金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 = 5
    if frequency == "M":
        coef = 23
    if frequency == "Q":
        coef = 90
    if frequency == "A":
        coef = 365
    start_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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图纸加密防泄密软件 | 从设计到交付,2024年值得关注的图纸加密软件大盘点!

图纸者,匠心之凝聚,智慧之结晶。然,信息之海浩瀚无垠,暗流涌动,图纸之安全,实乃企业之头等大事。 故,择一良器,以密护图纸,实为当务之急。 以下,七款图纸加密…

Linux之实战命令01:xargs应用实例(三十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

高刷显示器哪个好?540Hz才有资格称高刷

高刷显示器哪个好?说实话,540Hz这些才能成为高刷显示器,什么200,240的,都不够高,什么是从容,有我不用才叫从容。下面我们一起来看看540Hz的高刷显示器都有哪些吧! 1.高刷显示器哪个好 - 蚂蚁电…

2024风湿免疫科常用评估量表汇总,附操作步骤与评定标准!

常笑医学整理了5个风湿免疫科常用的评估量表,包括类风湿关节炎患者病情评价(DAS28)、系统性狼疮活动性测定(SLAM)等。这些量表在常笑医学网均支持在线评估、下载和创建项目使用。 01 类风湿关节炎患者病情评价 &#x…

实践中如何选择o1或sonnet3-5?

简述 AI更新太快导致我们不知选择什么使用更好?本文对比了新模型o1系列和Claude-3.5-sonnet的一些特点,针对不同开发场景提供了选择建议,希望能为你提供一些模型选择的参考。 模型对比 o1系列: 优势: 推理能力非常强&#xff0…

【动态规划】两个数组的 dp 问题二

两个数组的 dp 问题 1.正则表达式匹配2.交错字符串3.两个字符串的最小ASCII删除和4.最长重复子数组 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1…

高德地图自定义点标记

const markerContent <div class"custom-content-marker"> <span>摄像机<span> <img src"//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png"> </div> marker.value new AMap.Marker({position:…

Ubuntu搭建java开发环境

一&#xff1a;Ubuntu安装 1、下载Ubuntu 24.04.1 LTS 官网下载地址&#xff1a;https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-desktop-amd64.iso 可以直接点击这里下载 2、使用VMware安装 新建虚拟机 之后一直下一步&#xff0c;到如下界面&#xff0c;选择 刚刚…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

战神5/战神:诸神黄昏/God of War Ragnarok(容量175GB)百度网盘下载

版本介绍 v1.0.612.4312|容量175GB|官方简体中文|支持键盘.鼠标.手柄|赠单板学习补丁 配置要求 战神5/战神&#xff1a;诸神黄昏/God of War Ragnarok 游戏介绍 不灭的北欧传奇 由Santa Monica Studio出品、Jetpack Interactive负责PC移植的佳作《God of War Ragnark》将带您…

python实现语音唤醒

1. 环境 python版本&#xff1a;3.11.9 2.完整代码 import sqlite3 import timefrom funasr import AutoModel import sounddevice as sd import numpy as np from pypinyin import lazy_pinyin# 模型参数设置 chunk_size [0, 10, 5] encoder_chunk_look_back 7 decoder_c…

气膜体育馆:低成本、高效益的体育空间解决方案—轻空间

随着全民健身和健康生活理念的兴起&#xff0c;各类体育场馆需求日益增加。在这样的市场背景下&#xff0c;气膜体育馆凭借其低成本、快速建造以及灵活多变的空间设计&#xff0c;成为现代体育场馆建设的新趋势。气膜技术为体育场馆提供了一种全新的解决方案&#xff0c;让运营…

Tomcat 漏洞复现

1、CVE-2017-12615 1、环境开启 2、首页抓包&#xff0c;修改为 PUT 方式提交 Tomcat允许适用put方法上传任意文件类型&#xff0c;但不允许isp后缀文件上传&#xff0c;因此需要配合 windows的解析漏洞 3、访问上传的jsp文件 4、使用工具进行连接 2、后台弱⼝令部署war包 1…

新建flask项目,配置入口文件,启动项目

pycharm新建flask项目时&#xff0c;会提供一个创建flask项目的导向&#xff0c;自动设置虚拟环境&#xff0c;并且安装flask及其依赖而vscode新建flask项目时&#xff0c;需要手动设置虚拟环境并安装flask&#xff0c;需要在终端使用pip install flask命令来安装flask及其依赖…

一文了解什么是大模型?到底大模型有什么用呢?

党中央、国务院面向未来准确把握时代大势&#xff0c;已于十三五期间部署推进数字中国建设&#xff0c;《国民经济和社会发展第十四个五年规划和2035年远景目标纲要》更是将“加快数字化发展&#xff0c;建设数字中国”单列成篇&#xff0c;要求“提高数字政府建设水平”&#…

Kettle的实战练习指南:从数据导入到ETL自动化

在数据集成和数据仓库建设中&#xff0c;Kettle作为一个强大的开源ETL工具&#xff0c;提供了灵活的数据抽取、转换和加载功能。本文将通过实战案例&#xff0c;详细介绍Kettle在数据导入、ETL流程设计、自动化任务调度等方面的应用。 一、数据导入 1. SQL语句导入 导入sql语…

机器人速度雅可比矩阵求解(2自由度平面关节机器人)

关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…

Openai gym environment for multi-agent games

题意&#xff1a;用于多智能体游戏的 OpenAI Gym 环境 问题背景&#xff1a; Is it possible to use openais gym environments for multi-agent games? Specifically, I would like to model a card game with four players (agents). The player scoring a turn starts the…

如何使用地图Picker快捷接入地图服务?

在移动互联网的浪潮中&#xff0c;地图能力的使用已成为应用开发的关键领域。对于依赖地理位置信息的应用而言&#xff0c;用好地图服务不仅是基本要求&#xff0c;更是提升用户体验、实现个性化服务的关键。 但是在使用地图服务过程中&#xff0c;地图组件提供的设置参数种类…

Python学习——【4.5】数据容器:set集合

文章目录 【4.5】数据容器&#xff1a;set集合一、集合的定义格式二、集合的特点三、集合的常见操作四、集合的遍历 【4.5】数据容器&#xff1a;set集合 一、集合的定义格式 为什么使用集合 我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景。为…