“Financial document futures”版本间的差异
来自cslt Wiki
| 第62行: | 第62行: | ||
#程序的交易没有使用滑点 | #程序的交易没有使用滑点 | ||
| − | + | ||
=测试Demo= | =测试Demo= | ||
#-*- coding: utf-8 -*- | #-*- coding: utf-8 -*- | ||
| 第134行: | 第134行: | ||
captial_base=500006 | captial_base=500006 | ||
simulation(start,end,universe,captial_base) | simulation(start,end,universe,captial_base) | ||
| + | |||
| + | =附录手册:= | ||
| + | ## 程序流程图 | ||
| + | ##:[http://cslt.riit.tsinghua.edu.cn/mediawiki/images/5/5d/Futures.pdf] | ||
2015年12月5日 (六) 09:43的版本
期货虚拟交易平台使用手册
- 创建平台
- 先到目录下/nfs/disk/work/users/tanghui/platform/platform-and-data-api/future_platform/test_platform,把main.py文件拷贝到自己的文件夹下。至此,我们的回测系统已经创建好了
- 使用平台
- 总体介绍
- 首先导入了几个包,它主要是python库和使用这个平台所依赖的包。
- 然后有三个函数,分别是 'main','simulation','daily_run','handle_data':
- main包含需要使用的回测的基本信息。有起始日期(start),截止日期(end),所用的股票(universe),起始资金(captial_base)
- simulation主要是根据输入的信息,初始化account虚拟账户类,然后主要负责每天运行,主要执行的是daily_run()。
- daily_run主要是每分钟运行程序,主要执行的是account.update_minute()
- handle_data是开发者需要编写程序的地方。这个里面有很有用的东西,我们接下来会慢慢介绍它。
- mian函数使用
- 在main函数中,开发者可以选择起始日期(start),截止日期(end)。日期的格式为‘%Y-%m-%d’,比如:‘2014-01-01’,但不要出现错误日期如:'2014-02-30'。
- 所选的股票(universe),可以选择自己所选的期货合约经行回测,比如 universe= ["IF","cu"]
- 起始资金(captial_base)是你的启动资金
- simulation函数使用
- 这个主要是初始化相关的类,使日期在设定的起始日期和截止日期之间运行,并且每天调用daily_run函数。
- daily_run函数的使用
- 从每个交易日的开始日期到截止日期之间进行回测。然后在每分钟都计算一下当前的总价值。
- handle_date函数使用
- 这个里面主要使用的是account类,这个类中有很多信息供开发者去使用,接下来将会给大家来介绍如何去编写程序回测
- account.current_day:
- 该变量是模拟测试中今天的日期,string类型的。
- account.get_attribute_minute_history(attribute, range) :
- 这个函数是获取最近几天的信息,比如:
- his = account.get_attribute_minute_history("OPEN",2)
- 结果: his = array([11,12])
- 这个是获得最近2天的收盘价
- 具体的信息还有'HIGH'(最高价),'LOW'(最低价),'VOLUME'(成交量),'VALUE'(成交额),'OPEN'(开盘价),'CLOSE'(收盘价)。
- 这个函数是获取最近几天的信息,比如:
- account.order(secID,num,ways='1')
- 这个函数是指定某只股票的买,卖。
- account.order('IF',300,ways='1') 表示IF合约买300只
- account.order('IF',-300,ways='1') 表示IF合约卖300只
- ways='1'表示优先平今 ,其他值表示为优先平仓。默认为‘1’
- 这个函数是指定某只股票的买,卖。
- account.order_close_today(secID,num)
- 这个函数表示优先平今,如果能够平掉的话,使用的是开盘价
- 如果平掉的数量小于今天开仓的数量,就平掉对应数据的数量就行了。
- 如果平掉的数量大于今天开仓的数量,小于总的开仓数量;则先平掉今天的开仓,然后再平掉历史的开仓时数量
- 如果平掉的数量大于总的开仓量,则先平掉所有的开仓量,然后再开仓剩下的数量
- account.order_close(secID,num)
- 这个函数表示优先平仓,如果能够平掉的话,使用的是开盘价
- 如果平掉的数量小于历史的开仓的数量,则首先平掉历史开仓的数量
- 如果平掉的数量大于历史开仓的数量,小于总的开仓数量;则首先平掉历史的开苍量,然后再平掉今天的开仓量
- 如果平掉的数量大于总的开仓量,则先平掉所有的开仓量,然后再开仓剩下的数量
- account.calculate_close_today_position(self,secID,num,way="1"):
- 这个执行平仓的函数
- way='1' 表示的优先平今,其他值为优先平仓,默认值为1
- 表示secID该合约对应平仓的手数
- account.calculate_open_position(self,secID,num):
- 这个是执行开仓的程序
- 表示secID该合约对应的开仓的手数
- 函数calculate_close_today_position(self,secID,num,way="1")和calculate_open_position(self,secID,num) 都是通过order函数来调用的
- account.record_trade(self,secID,num,count,operation):
- 这个函数表示的是,在每一次交易成功之后都会记录一次该交易的运行结果。
- secID:合约编号,num:交易数量,count:该分钟交易的次数,operation:这次交易的方式
- account.record_minute(self):
- 这个函数表示的是
- 总体介绍
程序交易规则:
- 程序的买和卖都是都是有手续费的。不同的合约使用的手续费不一样
- 程序的买和卖使用的都是昨天的信息,其中买用的是昨天的开盘价,卖用的是昨天的收盘价
- 程序的交易没有使用滑点
测试Demo
#-*- coding: utf-8 -*-
#coding = utf-8
import datetime,time
import numpy as np
import os,sys
sys.path.append("/raw/sidhome/fin/future_platform")
from Account import Account
#order ("IF",-4,"1")
#IF:合约名称;
#-4:对该合约操作的手数 ,正数为买入,负数为卖出
#"1" :表示优先平今,"0" 表示优先平仓 默认为优先平今
def handle_data(account,day,min):
num = 10
his = account.get_attribute_minute_history("OPEN",2)
if not his:
return
for secID in account.universe:
if his[secID] is None:
continue
avr = his[secID].mean()
if avr > his[secID][-1]:
account.order(secID,day,min,num*2+5,"1")
else:
account.order(secID,day,min,-num,"1")
return
def daily_run(account,str_temp_date,day):
mins=0
str_start_time = str_temp_date + " " + "09:15:00"
str_end_time = str_temp_date + " "+ "16:00:00"
start_time=datetime.datetime.strptime(str_start_time,"%Y%m%d %H:%M:%S")
end_time = datetime.datetime.strptime(str_end_time,"%Y%m%d %H:%M:%S")
temp_date = start_time
while temp_date <= end_time:
str_temp_time = temp_date.strftime("%Y%m%d %H:%M:%S")
temp_date = temp_date + datetime.timedelta(minutes=1)
temp_day=str_temp_time[:8]
temp_time =str_temp_time[9:]
account.current_time = temp_time
account.current_day = temp_day
mins= account.update_minute(day,mins)
handle_data(account,day,mins)
account.record_minute()
if mins > 4:
return
def simulation(start,end,universe,captial_base):
account = Account()
account.init_all(universe,start,end,captial_base)
start_date = datetime.datetime.strptime(start,"%Y%m%d")
end_date = datetime.datetime.strptime(end,"%Y%m%d")
temp_date = start_date
day = 0
while temp_date <= end_date:
str_temp_date=temp_date.strftime("%Y%m%d")
account.current_day = str_temp_date
day = day+1
temp_date = temp_date + datetime.timedelta(days = 1)
daily_run(account,str_temp_date,day)
account.update_daily()
account.record_minute()
return
if __name__ == "__main__": start = "20150813" end = "20150814" universe=["IF"] captial_base=500006 simulation(start,end,universe,captial_base)
附录手册:
- 程序流程图