hqchartPy2指标选股 - KDJ选股

HQChartPy2

HQChart(C++)指标计算引擎-介绍
HQChart(C++)指标计算引擎-安装
HQChart(C++)指标计算引擎-py接口类FastHQChart介绍

前面几章教程我介绍了,如何把tushare的数据对接到hqchartPy2指标计算引擎中。
这章我们就实战KDJ选股

准备工作

  1. KDJ指标脚本, 我们使用通达信的KDJ指标脚本。 打开通达信软件把KDJ的指标和参数拷出来。
    在这里插入图片描述
  2. K线数据, 我们使用tushareK线数据, 你可以直接取官网注册就可以用了地址:https://waditu.com/
  3. 确定KDJ指标筛选范围, 加上我们要筛选KDJ超买信号: (K<10) and (D<20) and (J<0)
  4. 股票池 我使用的沪深300,成分可以去官网下载,地址:http://www.csindex.com.cn/

这样准备工作就完成了,可以开始写py脚本了。

py编写选股

1. 初始化hqchartPy2

2. 配置运行的指标信息(runConfig)

Script

分析家语法的指标脚本,就是上面我们从通达信软件里拷出来的指标脚本

Args

指标的参数, 这里我使用了通达信给的默认值, 你也可以修改参数值

Period

周期
0=日线 1=周 2=月 3=年
4=1分钟 5=5分钟 … 由于tushare分钟数据是要单独收费的, 我没有开通所有这里就使用日线来选股

Right

复权 0=不复权 1=前复权 2=后复权
这里我使用前复权

StartDate, EndDate

计算K线的范围, 这里我用最近1年的K线数据来计算指标

OutCount

返回数据个数,这里我就返回当天的K,D,J的值,所以设置了1,
如果要返回最后5天数据,设置为5,
如果要放回所有计算K线范围你的数据,设置为-1

Symbol

股票池。 这里用沪深300股票池

3. 创建tushare 数据类(TushareHQChartData)

TushareHQChartData 对tushare的数据进行了封装,计算指标过程中所有用到的数据都通过这个类来获取

4. 创建指标数据接收类(HQSelectResult)

hqchartPy2每计算完1只股票指标就会通知这个指标数据接收类,这样即时性比计算完了所有股票指标再返回快。 你可以再这个接收类里把所有的股票指标结构到保存起来,也可以把指标数据投递到其他的线程里面去处理后续的指标筛选(这样速度更高效)。这里我使用DataFrame, 把所有的股票的指标数据都保存到一个DataFrame里面, 计算完了直接对这个DataFrame进行筛选。

5. 小结

这样选股过程就完成了。 你也可以换其他的通达信指标, 或自己使用通达信语法写指标。hqchartPy2的优点就是省取了你把通达信的指标翻译成py的过程,极大的加快你验证指标的速度。另外可以结合HQChart网页插件进行可视化分析。
目前支持的语法函数列表 https://opensourcecdn.zealink.com/cache/webcache/hqfunctionhelp/index.html#/10
前端指标编辑界面
在这里插入图片描述

结果截图

demo里面的K线数据都是现取的,所有比较慢用了26s才算完, 如果把数据存数据库,启动的时候把所有股票K线数据都放内存里面,可以1s一下就完成整个选股过程
在这里插入图片描述

demo源码地址

https://github.com/jones2000/HQChart/tree/master/C++指标计算引擎/py版本

完整的例子代码


# 选股

from hqchartpy2_fast import FastHQChart,PERIOD_ID
from hqchartpy2_pandas import HQChartPy2Helper
from hqchartpy2_tushare import TushareHQChartData,HQResultTest 
from hqchartpy2_tushare_config import HQCHART_AUTHORIZATION_KEY,TUSHARE_AUTHORIZATION_KEY

import json
import time
import numpy as np 
import pandas as pd
import datetime
import uuid
import tushare as ts


class HQSelectResult():
    def __init__(self):
        self.dfResult=pd.DataFrame()      #保存所有的执行结果
        self.Error=[]
    
     # 执行成功回调
    def RunSuccess(self, symbol, jsData, jobID):
        log="[HQSelectResult::RunSuccess] {0} success".format(symbol)
        print (log)
        data=HQChartPy2Helper.JsonDataToPandas(jsData, symbol)
        # print (data)
        if (self.dfResult.empty==True):
            self.dfResult=data
        else:
            if (len(data)>0) :
                self.dfResult=pd.concat([self.dfResult,data], ignore_index=True)
           
        # print (self.dfResult)
        

    # 执行失败回调
    def RunFailed(self, code, symbol, error,jobID) :
        log="[HQSelectResult::RunFailed] {0}\n{1} failed\n{2}".format(code, symbol,error)
        self.Error.append(error)
        print(log)
        
class TushareSelect :
    def __init__(self):
        pass

    def Run(self, config):
        jsConfig = json.dumps(config)    # 运行配置项
        hqData=TushareHQChartData(TUSHARE_AUTHORIZATION_KEY,startDate=config["StartDate"], endDate=config["EndDate"])
        result=HQSelectResult()   # 实例计算结果接收类

        start = time.process_time()
        res=FastHQChart.Run(jsConfig,hqData,proSuccess=result.RunSuccess, procFailed=result.RunFailed)
    
        elapsed = (time.process_time() - start)
        log='''
---------------------------------------------------------------------------
TushareSelect::Run() 
Success:{4},
ID:{3}
执行时间:{0}s,
K线返回:{6}-{7},
股票个数:{1}, 
脚本:
{2}
参数:{5}
---------------------------------------------------------------------------
    '''.format(elapsed, len(config['Symbol']), config["Script"], config['JobID'], res, config["Args"],config["StartDate"],config["EndDate"])
        print(log)

        return result


# 沪深300股票
CSI_300 = [ 
    "600000.sh","600004.sh","600009.sh","600010.sh","600011.sh","600015.sh","600016.sh","600018.sh","600019.sh","600025.sh",
    "600027.sh","600028.sh","600029.sh","600030.sh","600031.sh","600036.sh","600048.sh","600050.sh","600061.sh","600066.sh",
    "600068.sh","600085.sh","600104.sh","600109.sh","600111.sh","600115.sh","600118.sh","600150.sh","600161.sh","600176.sh",
    "600177.sh","600183.sh","600196.sh","600208.sh","600233.sh","600271.sh","600276.sh","600297.sh","600299.sh","600309.sh",
    "600332.sh","600340.sh","600346.sh","600352.sh","600362.sh","600369.sh","600383.sh","600390.sh","600406.sh","600436.sh",
    "600438.sh","600482.sh","600487.sh","600489.sh","600498.sh","600519.sh","600522.sh","600547.sh","600570.sh","600584.sh",
    "600585.sh","600588.sh","600600.sh","600606.sh","600637.sh","600655.sh","600660.sh","600690.sh","600703.sh","600705.sh",
    "600741.sh","600745.sh","600760.sh","600763.sh","600795.sh","600809.sh","600837.sh","600845.sh","600848.sh","600872.sh",
    "600886.sh","600887.sh","600893.sh","600900.sh","600918.sh","600919.sh","600926.sh","600958.sh","600989.sh","600998.sh",
    "600999.sh","601006.sh","601009.sh","601012.sh","601021.sh","601066.sh","601077.sh","601088.sh","601100.sh","601108.sh",
    "601111.sh","601117.sh","601138.sh","601155.sh","601162.sh","601166.sh","601169.sh","601186.sh","601198.sh","601211.sh",
    "601216.sh","601225.sh","601229.sh","601231.sh","601236.sh","601238.sh","601288.sh","601318.sh","601319.sh","601328.sh",
    "601336.sh","601360.sh","601377.sh","601390.sh","601398.sh","601555.sh","601577.sh","601600.sh","601601.sh","601607.sh",
    "601618.sh","601628.sh","601633.sh","601658.sh","601668.sh","601669.sh","601688.sh","601696.sh","601698.sh","601727.sh",
    "601766.sh","601788.sh","601800.sh","601808.sh","601816.sh","601818.sh","601838.sh","601857.sh","601872.sh","601877.sh",
    "601878.sh","601881.sh","601888.sh","601899.sh","601901.sh","601916.sh","601919.sh","601933.sh","601939.sh","601985.sh",
    "601988.sh","601989.sh","601990.sh","601998.sh","603019.sh","603087.sh","603156.sh","603160.sh","603195.sh","603259.sh",
    "603288.sh","603369.sh","603392.sh","603501.sh","603658.sh","603799.sh","603833.sh","603899.sh","603986.sh","603993.sh",
    "688008.sh","688009.sh","688012.sh","688036.sh",
    "000001.sz","000002.sz","000063.sz","000066.sz","000069.sz","000100.sz","000157.sz","000166.sz","000333.sz","000338.sz",
    "000425.sz","000538.sz","000568.sz","000596.sz","000625.sz","000627.sz","000651.sz","000656.sz","000661.sz","000671.sz",
    "000703.sz","000708.sz","000723.sz","000725.sz","000728.sz","000768.sz","000776.sz","000783.sz","000786.sz","000858.sz",
    "000860.sz","000876.sz","000895.sz","000938.sz","000961.sz","000963.sz","000977.sz","001979.sz","002001.sz","002007.sz",
    "002008.sz","002024.sz","002027.sz","002032.sz","002044.sz","002049.sz","002050.sz","002120.sz","002129.sz","002142.sz",
    "002146.sz","002153.sz","002157.sz","002179.sz","002202.sz","002230.sz","002236.sz","002241.sz","002252.sz","002271.sz",
    "002304.sz","002311.sz","002352.sz","002371.sz","002384.sz","002410.sz","002414.sz","002415.sz","002422.sz","002456.sz",
    "002460.sz","002463.sz","002475.sz","002493.sz","002508.sz","002555.sz","002558.sz","002594.sz","002600.sz","002601.sz",
    "002602.sz","002607.sz","002624.sz","002673.sz","002714.sz","002736.sz","002739.sz","002773.sz","002812.sz","002821.sz",
    "002841.sz","002916.sz","002938.sz","002939.sz","002945.sz","002958.sz","003816.sz","300003.sz","300014.sz","300015.sz",
    "300033.sz","300059.sz","300122.sz","300124.sz","300136.sz","300142.sz","300144.sz","300347.sz","300408.sz","300413.sz",
    "300433.sz","300498.sz","300529.sz","300601.sz","300628.sz","300676.sz",
]


if __name__ == '__main__':
    # 初始化HQChartPy2
    FastHQChart.Initialization(HQCHART_AUTHORIZATION_KEY)

    # 通达信指标脚本
    script='''
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,M1,1);
D:SMA(K,M2,1);
J:3*K-2*D;
    '''
    # 指标参数
    args=[ { "Name":"N", "Value":9 }, { "Name":"M1", "Value":3 }, { "Name":"M2", "Value":3} ]

    period=PERIOD_ID.DAY_ID
    right=1 # 0=不复权 1=前复权 2=后复权

    # K线范围
    newDate=datetime.datetime.now()
    endDate=newDate.year*10000+newDate.month*100+newDate.day
    delta=datetime.timedelta(days=365)
    newDate=newDate-delta
    startDate=newDate.year*10000+newDate.month*100+newDate.day

    jobID=str(uuid.uuid1())
    symbols=CSI_300 # 沪深300成分股

    runConfig={
        "Script":script,
        "Args":args,
         # 周期 复权
        "Period":period, "Right":right,
        "Symbol":symbols,
        "StartDate":startDate, "EndDate":endDate,
        "JobID":jobID,
        "OutCount":1    # 输出最后一个数据
    }

    select=TushareSelect()
    result=select.Run(runConfig)
    print("指标计算结果:")
    print(result.dfResult)

    print("筛选KDJ超买信号: (K<10) & (D<20) & (J<0)")
    data=result.dfResult[(result.dfResult.K<10) & (result.dfResult.D<20) & (result.dfResult.J<0)]
    print(data)

交流QQ群

如果有什么问题或需求可以加交流QQ群: 950092318** 联系群主(QQ48274798)

hqchartPy动态库地址

https://github.com/jones2000/HQChart/tree/master/C++指标计算引擎/py版本

HQChart代码地址

地址:https://github.com/jones2000/HQChart

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HQChart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值