自己做量化交易软件(42)小白量化实战15–自编股票软件公式历史与聚宽量化平台仿大智慧指标回测设计
在1997年以前,市面上已经出现了很多股票分析软件。大多数软件都集成好了一些常用指标,例如钱龙股票分析系统,海融股票分 析系统,汇金股票分析系统,操盘手等等,各式股票软件,用户在使用时可以简单设置参数后,进行股票分析。例如改变均线指标参数 进行分析。
这些有固定指标的股票软件,满足不了股市中精明投资者的分析方法。因此出现了一些允许用户自己编写股票自编分析指标的股票 软件。其中比较有名的能写自编公式的股票软件是《分析家》和《指南针》股票分析软件。这些软件一出现,聚集了大量用户,一些会 写股票分析指标的用户,根据自己的经验写成自编公式卖给其他投资者。以前很多《分析家》和《指南针》自编公式等,网上叫卖数万 人民币。
随着是时间的推移,股票行情接收卡(例如通视卡等)捆绑销售,以及破解原因,有大量的《分析家》软件用户。另外《分析家》 自编股票公式语法最简洁,因此有很多人在上面开发分析家公式。
由于分析家股票公式系统,支持C++公式扩展,因此有很多既会软件开发,又懂投资分析的人员,例如荷蒲(百度:荷蒲公式,貔貅 公式)等,用C++开发出的指标,远远超越分析家软件提供功能的股票分析应用,丰富了股票软件创新。其中现在股软所具备的基本功能 ,都是荷蒲在1999年以前所发明创造。例如股票文字提示,股票股评,信息雷达,横向统计,四方图分析,预测日周成交量,交易机器 人指标等等。这些新分析技术的发明与分析家所支持的C++指标扩展开发,必不可少。C++公式开发,增强了分析家现有的分析指标和分 析工具。
1999年底,《飞狐交易师》测试版发布,邀请荷蒲加入首席测试师,进行测试和提供改进意见。荷蒲提出分析家C++实现公式横向统 计很不方便,希望飞狐交易师固化成基本功能。《飞狐交易师》吸收了网上的全部分析家公式系统的创新功能,一些荷蒲所开发的C++公 式函数,也集成为基本功能。例如判断是否为最后一个周期ISLASTBAR,早期公式系统没有类似功能函数,荷蒲用C++公式函数来实现的 。荷蒲开发分析家节气函数,也包含在《飞狐交易师》函数。此外《飞狐交易师》还根据荷蒲等人建议,增加了自然日K线分析,周易分 析,农历日期坐标。此外根据荷蒲建议增加了指标函数双变参数建议,一般指标第一个参数是序列,第2个参数是固定数值。例如MA (C,N),N参数在分析家中为固定数值。在《飞狐交易师》中为变化序列。尽管荷蒲用C++也实现了第二变参,使用起来不够方便。《飞狐 交易师》一些函数可以使用第二变参,第三变参等等。例如MA(C,INT(C/10)),实现不定长均线。
《飞狐交易师》除了支持《分析家》公式源代码,还支持分析家的C++公式文件。因此荷蒲的分析家指标,能够完美移植到《飞狐交易师 》。《飞狐交易师》自己C++接口,支持公式函数第二变参,第三变参等等。
数据序列移动,在投资分析上称为“引用未来数据”,分析家原始函数只支持后引用REF(C,N)函数,荷蒲用C++开发了前引用REFX (C,N)函数,即今天指标值计算依赖明天其他指标计算数据。我初始设计不是为了所谓造假,因为我在分析家上利用此功能开发了一套“ 龙霸指标操盘系统”,大户庄家可用通过改变未来行情数值,预先看到未来行情指标走势,可以给“技术指标派”挖坑骗线。《分析家 》软件不能右移位画K线,《飞狐交易师》可以右移位画K线和指标。因此通过REFX()函数,预先设置未来几日行情数据,例如CLOSE、 HIGH、LOW、VOL等等,通过右移位画K线和指标,动态调整行情参数,可以看到用户自编指标在此行情下的指标变化。如果未来主力控 制好行情价格,指标交叉等结果,就是主力的设想。能够精确实现未来指标走势控制的能力。
2000年后又出现了一些支持用户自编指标公式的股票软件,例如《通达信》、《同花顺》、《大智慧》等软件。开始这些软件公司 的指标公式语法,都是自己新开发的,后来发现根本没法跟《分析家》公式语法可比,因此《通达信》和《同花顺》后来指标语法开始兼容《分析家 》公式。
《大智慧》软件公司于2006前后,收购了《分析家》,因此新一代大智慧就继承了分析家内核,完美支持分析家公式和分析家C++开发的 公式。因此至今只有《飞狐交易师》和《大智慧》完美支持荷蒲1997年之今开发的C++指标(https://mp.weixin.qq.com/s/c9J-d30haP5nonU3bjiwSg)。1999年开发的主力进出C++指标,至 今还能在大智慧软件中正常运行,指标算法,至今没几个人能破解。看我的博客https://blog.csdn.net/hepu8/article/details/111996255
2016年用Python开发的人工智能程序“阿法狗”围棋软件战胜了人类专业棋手。作者编写过围棋软件(百度:荷蒲围棋),以传统思路发展硬件和软件在100年内,电脑无法战胜人类,因为2的361次方递归计算是无法实现得的,电脑国际象棋依赖小型机的海量存储和巨大计算潜能,才战胜了人类优秀棋手。这些算法在围棋上不可复制。
2016年人工智能围棋软件战胜人类专业棋手,让作者看到了一道曙光,电脑人工智能能在围棋上战胜人类棋手,那么一定可以利用人工智能软件,编写出全自动交易的赚钱的“摇钱树”。
作者是仿分析家软件指标公式编写高手,自然想到将分析家软件指标公式语法格式移植到Python量化软件上了。因此由作者编写的小白Python量化系统,利用Python的一维数组,以及矢量数学计算的特性,实现了仿分析家公式指标计算。
利用小白量化股股票公式函数模块,很容易将仿分析家公式指标移植到Python量化环境中。除了在小白量化系统中使用仿分析家自编公式指标计算外,还可以用于其他量化平台。
移植步骤如下:
1、你的自编指标先在通达信软件或小白量化框架上回测调整到参数最优。2、你打算实战时,就可以把这个指标移植到其他量化平台了。3、把你的指标和指标所有的函数,都复制到你用户策略的开头,分析就可以采用仿分析家公式处理。4、在用户交易函数中,进行仿分析家公式处理,来获取买卖点。5、这种方式,可以把你的自编通达信指标,大智慧指标等,移植到任何量化平台。
下面我们给出聚款平台上的仿大智慧自编指标的回测代码。我们已自编公式KDJ指标为例子,读者可以把指标替换为自己的自编指标公式来在聚宽量化平台回测或实战交易。
聚宽量化平台回测仿大智慧指标回测代码如下:
#购买<零基础搭建量化投资系统>正版书,送小白量化软件源代码。
# https://item.jd.com/61567375505.html
#独狼荷蒲qq:2775205
#小白python量化群: 524949939
#小白python量化群2: 983815766
#电话微信:18578755056
#微信公众号:独狼股票分析# 导入函数库
from jqdata import *
import pandas as pd
import numpy as np##小白量化股票数据格式同ts旧版数据格式
## jqtots来源HP_data
def jqtots(df1): #聚宽格式转ts格式a=[x.strftime("%Y-%m-%d") for x in df1.index]df1.insert(0,'date',a)df1=df1.reset_index(level=None, drop=True ,col_level=0, col_fill='') return df1global CLOSE,LOW,HIGH,OPEN,VOL
##从小白量化公式函数库中复制.
## 函数来源 HP_formula
def MA(Series, N):return pd.Series.rolling(Series, N).mean()def HHV(Series, N=0):if N==0:return Series.cummax()else:return pd.Series(Series).rolling(N).max()def LLV(Series, N=0):if N==0:return Series.cummin()else:return pd.Series(Series).rolling(N).min()def EMA(Series, N):var=pd.Series.ewm(Series, span=N, min_periods=N - 1, adjust=True).mean()if N>0:var[0]=0#y=0a=2.00000000/(N+1)for i in range(1,N):y=pd.Series.ewm(Series, span=i, min_periods=i - 1, adjust=True).mean()y1=a*Series[i]+(1-a)*y[i-1]var[i]=y1return vardef CROSS(A, B):A2=np.array(A)var = np.where(A2<B, 1, 0)return (pd.Series(var, index=A.index).diff()<0).apply(int)##下面开始写用户自编股票公式
def KDJ(N=9, M1=3, M2=3):global CLOSE,LOW,HIGH,OPEN,VOL"""KDJ 随机指标"""RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100K = EMA(RSV, (M1 * 2 - 1))D = EMA(K, (M2 * 2 - 1))J = K * 3 - D * 2return K, D, J# 初始化函数,设定基准等等
def initialize(context):# 设定沪深300作为基准set_benchmark('000300.XSHG')# 开启动态复权模式(真实价格)set_option('use_real_price', True)# 输出内容到日志 log.info()log.info('初始函数开始运行且全局只运行一次')# 过滤掉order系列API产生的比error级别低的log# log.set_level('order', 'error')### 股票相关设定 #### 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)# 开盘前运行run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')# 开盘时运行run_daily(market_open, time='open', reference_security='000300.XSHG')# 收盘后运行run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')## 开盘前运行函数
def before_market_open(context):# 输出运行时间log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))# 给微信发送消息(添加模拟交易,并绑定微信生效)# send_message('美好的一天~')# 要操作的股票:(g.为全局变量)g.security = '600519.XSHG'## 开盘时运行函数
def market_open(context):global CLOSE,LOW,HIGH,OPEN,VOLcurrent_date = context.current_dt.date()# 取得当前的现金cash = context.portfolio.available_cashlog.info('函数运行时间(market_open):'+str(context.current_dt.time()))security = g.security# 获取股票的收盘价df = get_price(security, start_date='2020-11-01', end_date=current_date, fields=['open', 'close', 'low', 'high', 'volume'])mydf=jqtots(df)CLOSE=mydf['close']LOW=mydf['low']HIGH=mydf['high']OPEN=mydf['open']VOL=mydf['volume']mydf['s80']=80k,d,j=KDJ()mydf['k']=kmydf['d']=dmydf['j']=kmydf['buy']=CROSS(k,d) #k上穿dmydf['sell']=CROSS(mydf['s80'],k) #k下穿80log.info(mydf)buy=list(mydf['buy'])sell=list(mydf['sell'])if buy[-1]>0:log.info('买')if sell[-1]>0:log.info('卖')# 如果上一时间点价格高出五天平均价1%, 则全仓买入if (buy[-1]>0) and (cash > 0):# 记录这次买入log.info("价格高于均价 1%%, 买入 %s" % (security))# 用所有 cash 买入股票order_value(security, cash)# 如果上一时间点价格低于五天平均价, 则空仓卖出elif (sell[-1]>0) and context.portfolio.positions[security].closeable_amount > 0:# 记录这次卖出log.info("价格低于均价, 卖出 %s" % (security))# 卖出所有股票,使这只股票的最终持有量为0order_target(security, 0)## 收盘后运行函数
def after_market_close(context):log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))#得到当天所有成交记录trades = get_trades()for _trade in trades.values():log.info('成交记录:'+str(_trade))log.info('一天结束')log.info('##############################################################')
程序运行结果如下图。
此篇文章,说明小白量化的金融模块的广泛用途,如果有空,我再给出其他量化平台依赖小白量化模块实现仿大智慧和仿通达信指标的实现示例代码。
请持续关注我的博客,我的进步,就是你的进步!