《中文Python穿云箭量化平台二次开发技术01》设计本地化自动交易策略

117 篇文章 122 订阅
116 篇文章 46 订阅

《中文Python穿云箭量化平台》是纯Python开发的量化平台,因此其中很多Python模块,我们可以自己设计新的量化工具,例如自己新的行情软件、新的量化平台、以及各种量化研究工具。
《中文Python穿云箭量化平台》的特点和功能如下。
1、中文Python穿云箭量化平台。支持中文Python语法,提供了完整的Python股票软件开发源代码。新版本支持自编指标公式脚本编写策略回测,并有一键生成Python股票和期货交易策略功能。
2、支持股票、期货、外汇、现货、彩票等各种量化分析交易。例如提供支持国内股票和期货,期货CTP接口,提供MetaTrader5交易接口,提供miniQMT接口,富途证券交易、盈透TWS交易接口以及彩票模块。
3、新增抄底雷达,波动线,超短线函数,提供各种独创功能。提供多空雷达,响尾蛇导弹,巡航到导弹等交易技术。新增股票和期货大中小多周期共振策略模板,
支持发邮件,支持语音报盘,微信通知等。并提供多个实盘策略等,例如:miniQMT抄底雷达交易策略,MetaTrader 5核聚变策略。
4、支持sklearn机器学习、pytorch深度学习等量化策略。支持可视化机器学习Python程序设计。
5、软件只有260M大小,每个账户只能一台电脑使用,同一个电脑下不同目录启动软件次数不受限制,可同时完成无数个功能,例如同时回测或实盘多个不同策略。
6、新版本支持量化平台合伙人计划。量化开发研究员可以将自己研究的金融投资工具,金融投资模块,量化数据,以及有自主版权专利的赚钱策略,集成到中文Python穿云箭量化平台中,允许用户可以通过修改配置方式,实现更改软件名称、开发人、宣传文字等信息,免去开发定制费用。
7、量化平台支持策略源码加密功能,也支持用户自行加密核心代码模块,如DLL文件或pyd文件。
《中文Python穿云箭量化平台》目录下包含全部Python量化平台的调用模块,利用这些模块设计自己所需的新的量化工具。
《中文Python穿云箭量化平台》是Python自带Tkinter设计的量化平台,总大小只有260MB。软件界面如下。
在这里插入图片描述
《中文Python穿云箭量化平台》允许用户通过修改【cyj2.cfg】文件,来修改软件品牌,名称,开发人和宣传信息。
 (通过修改配置文件来修改软件品牌,名称,开发人和宣传信息)
在《中文Python穿云箭量化平台》1.28版本以上,同时支持聚宽、Ptrader和QMT的策略框架。用户可以参考聚宽、Ptrader和QMT策略开发说明来设计策略。
聚宽、Ptrader策略框架如下:


##策略初始化函数,例如股票池,初始资金,交易费用,公式算法等。
def initialize(context):
    #设置策略信息
    #设置费用信息
    #设置股票池
    #获取柜台资金信息
    #获取柜台持仓信息,如果持仓,增加到股票池中。
    #设置固定的g.带头变量初始化值,例如g.gs
    pass

##开盘前处理函数,该函数会在每天开始交易前被调用一次, 
##您可以在这里添加一些每天都要初始化的东西.
def before_trading_start(context):
    #开盘前需要处理的工作
    #启动用户多线程函数或多进程程序,例如行情处理,交易处理等。
    pass

##盘中运行函数,每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def market_open(context):
    #获取机器时间,根据需要设置是否继续运行
    #获取柜台资金信息,并同步到策略资金信息
    #获取委托信息,并处理,例如撤单处理。
    #获取持仓信息,并通过策略持仓数据。
    #循环处理持仓数据,根据策略要根据最新行情,计算止盈或止损。
    #策略主要逻辑:循环处理股票池,并获取股票行情,根据策略指标计算信号,进行交易。
    #如果【实盘周期】选择【连续】,循环体外必须增加延迟函数,例如time.sleep(1)
    #time.sleep(1)  #暂停1
    pass

##策略结束前处理函数
def after_trading_end(context):
    #收盘后,或策略自动运行结束后,处理一些工作。如强制【终止实盘】,此函数不会运行。
    #保存策略数据。
    #关闭策略多线程程序或多进程程序。
    pass

QMT的策略框架如下:

##策略初始化函数,例如股票池,初始资金,交易费用,公式算法等。
##类QMT策略
def init(context):
    #设置策略信息
    #设置费用信息
    #设置股票池
    #获取柜台资金信息
    #获取柜台持仓信息,如果持仓,增加到股票池中。
    #设置固定的g.带头变量初始化值,例如g.gs
    pass


##盘中运行函数,每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
##类QMT策略
def Handlebar(context):
    #获取机器时间,根据需要设置是否继续运行
    #获取柜台资金信息,并同步到策略资金信息
    #获取委托信息,并处理,例如撤单处理。
    #获取持仓信息,并通过策略持仓数据。
    #循环处理持仓数据,根据策略要根据最新行情,计算止盈或止损。
    #策略主要逻辑:循环处理股票池,并获取股票行情,根据策略指标计算信号,进行交易。
    #如果【实盘周期】选择【连续】,循环体外必须增加延迟函数,例如time.sleep(1)
    #time.sleep(1)  #暂停1
    pass

还有很多熟悉Python开发的用户对这个编辑器不太满意,想利用Vscode等第三方开发工具IDE来做模拟自动交易研究。
如果用户想在Vscode中执行策略,只需要在策略最后一段加上调用策略脚本文件的代码就可以实现。
如果策略文件为【高级_同花顺自编公式交易策略.py】,这个策略最后插入下面代码,就可以在任意Python开发工具中运行策略代码。

if __name__ == '__main__':
    hpq.usertrader('高级_同花顺自编公式交易策略.py',zq=6)  ##改为用户高级策略文件,zq周期

在这里插入图片描述
《中文Python穿云箭量化平台》支持自编指标公式源码计算功能,下面我们给出一个KDJ专家系统公式,通过同花顺自动交易的完成策略代码。

策略名='新策略'
import pandas as pd
import HP_tdx as htdx
import HP_global as hg   #建立全局数据域hg
from HP_formula import *
from HP_factor import *
import HP_formula as gs
import HP_quant as hpq
from HP_quant import *
import time

import HP_tdxgs as tgs  #公式运行模块

import easytrader

##初始化同花顺软件
ths = easytrader.use('ths')
ths.connect( "C:\\同花顺软件\\同花顺\\xiadan.exe")
ths.enable_type_keys_for_editor()
mygs=tgs.Tdxgs()


##策略初始化函数,例如股票池,初始资金,交易费用,公式算法等。
def initialize(context):
    #设置策略信息
    #设置费用信息
    #设置股票池
    #获取柜台资金信息
    #获取柜台持仓信息,如果持仓,增加到股票池中。
    #设置固定的g.带头变量初始化值,例如g.gs
    context.zh='xiaoba'      #账户
    context.zhlx='回测'   #账户类型,2个汉字
    context.firstcash=1000000.00  #初始现金
    context.cash=context.firstcash
    context.portfolio.available_cash=context.firstcash

    hpq.log.info('----策略环境信息-----')
    print('策略名:'+策略名)
    qhcsj2=time.strftime('%Y%m%d %H:%M:%S',time.localtime(time.time()))
    print('开始运行时间:'+qhcsj2)

    htdx.TdxInit(ip='124.232.142.29',port=7711)
    g.timea=time.perf_counter()
    g.cs=0  #策略运行册数
    g.MAX=2000 #最大持股数量
    g.hd=0.003 #滑点
    g.zsfd=-0.05  #止损幅度
    g.amount=400  #每次买入数量

    g.stocks=htdx.getzxgfile('A500.blk')  #获取自选股
    #g.stocks=htdx.getblock2a('近期强势') #返回板块中的股票


    资金状况=ths.balance
    context.cash=资金状况['资金余额']
    context.portfolio.available_cash=资金状况['可用金额']
    
    持仓= pd.DataFrame(ths.position)
    持仓信息={}
    for i in range(len(持仓)):
      code=str(持仓['证券代码'].iloc[i]).zfill(6)
      持仓信息[code]=int(持仓['股票余额'].iloc[i])
      if code not in g.stocks:
          m=htdx.get_market(code)  #获取通达信市场信息
          g.stocks.append((m,code))
          
    #context=hqcc(context,持仓)    
    g.gs='''{自编指标公式,最好用专家系统公式}
N:=9;
M1:=3;
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:=SMA(RSV,M1,1);
D:=SMA(K,M1,1);
J:=3*K-2*D;
ENTERLONG:CROSS(J,0);
EXITLONG:CROSS(100,J);

'''
    g.amount=400
    g.zsfd=-0.05
    

##盘中运行函数,每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def market_open(context):
    #获取机器时间,根据需要设置是否继续运行
    #获取柜台资金信息,并同步到策略资金信息
    #获取委托信息,并处理,例如撤单处理。
    #获取持仓信息,并通过策略持仓数据。
    #循环处理持仓数据,根据策略要根据最新行情,计算止盈或止损。
    #策略主要逻辑:循环处理股票池,并获取股票行情,根据策略指标计算信号,进行交易。
    #如果【实盘周期】选择【连续】,循环体外必须增加延迟函数,例如time.sleep(1)
    #time.sleep(1)  #暂停1
    starttime = time.perf_counter()
    g.cs=g.cs+1
    if starttime-g.timea>20*60:
        资金状况=ths.balance
        context.cash=资金状况['资金余额']
        context.portfolio.available_cash=资金状况['可用金额']        
        持仓= pd.DataFrame(ths.position)
        持仓信息={}
        for i in range(len(持仓)):
          code=str(持仓['证券代码'].iloc[i]).zfill(6)
          持仓信息[code]=int(持仓['股票余额'].iloc[i])
        context=hqcc(context,持仓)      
        g.timea=time.perf_counter()
    
    for m,security in g.stocks:
        print(m,security,end='')
        if security not in context.portfolio.positions:
            context.portfolio.positions[security]=hpq.Position(security)
        df=tgs.get_security_bars(nCategory=4,nMarket = m,code=security,nStart=0, nCount=600) #获取日线  
        if len(df)<1:
            continue
        print('  行情数据长度:',len(df),'  可用资金:',round(context.portfolio.available_cash,2))
        price = df.close.iloc[-1]
        pre_close=df.close.iloc[-2]   #前收盘
        #value = context.portfolio.positions[security].value
        acc_avg_cost  = context.portfolio.positions[security].acc_avg_cost #买入成本价 
        amos=context.portfolio.positions[security].closeable_amount  #可卖数量
        amos2=context.portfolio.positions[security].total_amount   #总数量


        mydf=gs.initmydf(df)  ##初始化mydf表
        mygs.loaddf(mydf)  #加载行情数据
        mydf=mygs.execgs(g.gs)  #运行指标公式
        
        if 'ENTERLONG' in mydf.columns:
            BUY=mydf['ENTERLONG']  #买点


        if 'EXITLONG' in mydf.columns:
            SELL=mydf['EXITLONG']  #卖点

        if BUY.iloc[-1]>0 and (amos2==0 or amos==0) and context.portfolio.positions[security].isbuy==False:
            price2=round(price*(1+g.hd),2)
            x=order(security,g.amount,p=price2)
            ths.buy(security, price=price2, amount=g.amount) 
            context.portfolio.positions[security].isbuy=True
            hpq.log.info(context.current_dt+" 买入: %s ,数量:%d,买入价格:%.2f,成交资金:%0.2f"%(security,g.amount,price2,g.amount*price2))

        amos=context.portfolio.positions[security].closeable_amount  #可卖数量
        if SELL.iloc[-1]>0 and amos>0:
            price2=round(price*(1-g.hd),2)
            x=order(security,-amos,p=price2)
            ths.sell(security, price=price2, amount=amos)   
            context.portfolio.positions[security].issell=True
            hpq.log.info(context.current_dt+  " 卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,price2,amos*price2))


if __name__ == '__main__':
    hpq.usertrader('高级_同花顺自编公式交易策略.py',zq=6)  ##改为用户高级策略文件,zq周期

上述代码可以在Vscode,Pychram或IDLE中运行这个策略文件。
好了,欢迎继续关注我的博客。后面我们介绍更多的二次开发技术。

超越自己是我的每一步!我的进步就是你的进步!

小白量化学习-自创指标设计 一、准备工作 1、首先把“HP_formula.py”文件复制到自己的工程目录中。 2、在新文件开始增加下面4条语句。 import numpy as np import pandas as pd from HP_formula import * import tushare as ts 二、对数据预处理 我们采用与tushare旧股票数据格式。 #首先要对数据预处理 df = ts.get_k_data('600080',ktype='D') mydf=df.copy() CLOSE=mydf['close'] LOW=mydf['low'] HIGH=mydf['high'] OPEN=mydf['open'] VOL=mydf['volume'] C=mydf['close'] L=mydf['low'] H=mydf['high'] O=mydf['open'] V=mydf['volume'] 三、仿通达信或大智慧公式 通达信公式转为python公式的过程。 1.‘:=’为赋值语句,用程序替换‘:=’为python的赋值命令‘='。 2.‘:’为公式的赋值带输出画线命令,再替换‘:’为‘=’,‘:’前为输出变量,顺序写到return 返回参数中。 3.全部命令转为英文大写。 4.删除绘图格式命令。 5.删除掉每行未分号; 。 6.参数可写到函数参数表中.例如: def KDJ(N=9, M1=3, M2=3): 例如通达信 KDJ指标公式描述如下。 参数表 N:=9, M1:=3, M2:=3 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; # Python的KDJ公式 def KDJ(N=9, M1=3, M2=3): 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 return K, D, J #----------------------------------- #根据上面原理,我们把大智慧RSI指标改 # 为Python代码,如下。 def RSI(N1=6, N2=12, N3=24): """ RSI 相对强弱指标 """ LC = REF(CLOSE, 1) RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100 RSI2 = SMA(MAX(CLOSE - LC, 0), N2, 1) / SMA(ABS(CLOSE - LC), N2, 1) * 100 RSI3 = SMA(MAX(CLOSE - LC, 0), N3, 1) / SMA(ABS(CLOSE - LC), N3, 1) * 100 return RSI1, RSI2, RSI3 四、使用公式并绘图 #假定我们使用RSI指标 r1,r2,r3=RSI() mydf = mydf.join(pd.Series( r1,name='RSI1')) mydf = mydf.join(pd.Series( r2,name='RSI2')) mydf = mydf.join(pd.Series( r3,name='RSI3')) mydf['S80']=80 #增加上轨80轨迹线 mydf['X20']=20 #增加下轨20轨迹线 mydf=mydf.tail(100) #显示最后100条数据线 #下面是绘线语句 mydf.S80.plot.line() mydf.X20.plot.line() mydf.RSI1.plot.line(legend=True) mydf.RSI2.plot.line(legend=True) mydf.RSI2.plot.line(legend=True) 不懂就看我的博客 https://blog.csdn.net/hepu8/article/details/93378543
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荷蒲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值