一、init(必须实现)
init(context)
context对象是全文对象,我也不懂是啥意思,以前学掘金量化也有这个,大概是连接上下文通用的意思吧。
用法是context.xx,整个函数都可以调用这个东西,可以是对象,方法,属性。
按金字塔的话说这个是各种初始化配置,方便算法中所有方法之间传递。
注意事项:
1、在回测模式backtest和实盘模式paper_trading中回测和实时交易都只会在启动时触发一次,仅一次!
2、pel_call被pel公式调用时,在公式初次加载时被触发一次。
例子:
def init(context):
context.cash.limit = 5000
你可以定义各种初始对象,属性,方法。
反正记住这个基本方法是初始化用的就行。
二、handle_bar(必须实现)
bar数据更新,就会自动触发这个方法的调用。
策略的具体逻辑就在这个方法内实现,在实时交易中,该函数在交易时间内会更具选择运行模式被触发。
注意事项:
尽量不要在这个方法底下放入查询类函数,因为可能会不断被触发,我的理解是有bar更新就会触发。
api说查询类逻辑尽量在init()中执行
总的来说,把策略整体比作文章,那这个方法底下写的就是主段落,写的是策略本身逻辑。
必须实现的基本方法就两个,一个是init(context),另一个就是handle_bar(context)
其他的方法都可以选择实现,可选。
三、before_trading(选择实现)
before_trading(context)
这个函数在基准合约开盘前30分钟会被调用,不能在这个函数中发送订单。
注意事项:
这个函数的触发时间取决于用户当前基准合约的交易时间。只有在交易状态下有效,如backtest和paper_trading下。
我不太懂基准合约是指什么,可能是要交易的那个合约。后面再看吧。
这个方法,可以在开盘前调用,但是不能发订单,也就是不能用交易指令,应该可以用来算一些东西吧。我也不懂
啊!
例子:
def before_trading(context):
#获取平安银行EPS财务字段数据
detaval = fin_indicator('SZ000001','EPS',1,0,0)
#将查询的财务数据保存到context对象中
context.eps = dataval
看了这个例子,大概知道,可以用这个函数,在开盘前调取一些数据,做一些初始化,或者属性更新。
原来context.xx这个函数,在全文都是可以用的,无论什么基本方法下,但是应该有先后顺序吧。
后面再看。
四、after_trading(选择实现)
after_trading(context)
这个函数,不用看就知道了吧!
意思是在交易后实现。字面意思哈哈哈,怎么用还没看,现在我们来看看。
这个基本方法呢,每天在基准合约收盘后5分钟被调用。那就是说3点收盘,15:05被触发。
同样的,不能在这个函数中发送订单,也就是不能用交易函数。
它说我可以在这个方法下进行当日收盘后的一些计算。也只能在回测backtest和paper_trading下能用。
这个函数下没有例子。一脸懵逼。
大概知道就行了吧。这个函数当日只会被调动一次。我不理解,早盘收盘算不算呢?再看吧。
五、order_status(选择实现)
order_status(context,order)
这个函数,除了context外,还有一个order,第一次见哦,啥意思呢。
它说当委托下单,成交,撤单等与下单有关动作时,该方法就会被调用。仅在回测backtest和paper_trading下可以。
context对象我们知道了,那么order对象是什么呢。这里说用于捕获处理交易过程中产生的各种下单动作,根据捕获的信息,进行相应的处理。
不懂,我们先看看例子。
def order_status(context,order):
#判断柜台汇报信息,是否为全部成交。
if order.status == 'filler':
pring('全部成交')
原来这个是成交状态,下单状态的意思哦。
这个order对象有很多属性,这里不列出来,我看了一下。
order.status属性有7个:
submitted 订单状态,已报单但是未成交
tradeing 已成交(ps:妈的怎么这样写单词呢,直接加个ing,秀啊!)
filled 全部成交
cancelled 已撤单
inactive 无效单(可能是不在开盘时间,资金不足之类的导致无效)
connected 已连接(应该是连接柜台)
disconnected 连接断开
六、order_action(选择实现)
order_action(context,type,account,datas)
第二次看到属性方法超过一个的了。
注意事项:
这个函数只在融资融券,新股申购操作刷新动作时才会触发,一般账户无效。
也就是股票账户才有的。
type是int类型,这里返回的是数字
type = 1 表示科荣券品种查询完成
type = 2 表示当日可申购新股查询完成
type = 3 表示中签查询完成
account是str,输入的是账户名
datas是int,type=1时是可融券品种数量,2是新股数量,3是中签新股数量
这个没有例子,不懂怎么用。
七、exit(选择实现)
exit(context)
用户可以在这个函数中处理一些退出后需要做的事情,比如记录一些变量到硬盘等。
注意事项:
1、backtest回测模式下,当评测结束时,这个函数被调用
2、paper_trading下,停止策略运行是,该函数被调用
3、pel_call被pel公式调用时,在pel公式关闭时被调用
我看了一个策略,这个函数的作用可以画图,在这个方法下,画曲线图啊,分布图之类的。高级哦!
def exit(context): test_report_none() #读取数据文件 #data = pd.read_csv(r'C:\a\201808.csv') data = context.data data.drop(data.columns[0], axis=1,inplace=True) plt.figure(figsize=(5,5)) plt.imshow(data.corr(), cmap=plt.cm.hot, vmin=0, vmax=1) plt.xticks(np.arange(19),data.columns,rotation=60) plt.yticks(np.arange(19),data.columns) plt.colorbar() plt.show()
我就不懂,反正用法是那样。
八、parameter(选择实现)
parameter()
最后一个基本方法了。
这个是参数定义区,这里定义的参数,可以直接在context对象中获取。(选择实现)
注意事项:
1、参数定义区定义的变量,可以用于策略运行中动态调整参数。(不懂)
2、必须使用iput_par函数,定义变量,并且此函数仅支持在parameter()方法内使用。
3、parameter方法仅对backtest回测和paper_trading模式有效。
第一点应该是说,可以在handle_bar之类的方法中修改这个参数区,或者获取参数区的参数。
例子:
def parameter():
#使用input_par函数定义变量'myvalues1',默认值5,最小值1,最大值100,步长1
input_par("myvalues1",5,1,20,1) #玩我呢,这不是最大值20吗。它上面应该写错了
# 使用input_par函数定义变量"myvalues2",默认值10,最小值1,最大值100,步长1。
input_par("myvalues2",10,1,20,1)
……
def handle_bar(context):
print(context.myvalues1+context.myvalues2)
噢,原来是可以在其他方法下调用呢,实际上就是设置参数的基本方法,牛哦。
应该在其他方法下也可以修改这些参数的。
九、模式说明
金字塔中的Python策略分为三类:Python策略、Python引用、Python模块
Python策略:Python运行策略(支持paper_trading,backtest)
Python引用:编写可用于PEL调用Python的模块(支持pel_call,仅此模式支持pel_history,log_debug_info,settimer,killltimer这四个函数的调用,其他的API函数均不可以)
Python模块:供Python调用的用户模块或供VBA调用的模块
不太懂,反正用第一个就行了。
我看到很多策略范例中都有自己写的函数,自己定义的函数,可是我不会写啊,Python没学完,一直停留在类似于学英语abandon的状态,就很离谱!
不打算又从头学了,因为大概率又是abandon。
就这样一边看一边学吧,学到不会的,什么迭代器,什么什么器之类的再去翻廖雪峰看看算了。