Skip to content

Commit

Permalink
增加script目录,修改setup.py
Browse files Browse the repository at this point in the history
  • Loading branch information
vnpy-dev-01 committed Jun 2, 2017
1 parent 2100318 commit c9c5f42
Show file tree
Hide file tree
Showing 28 changed files with 195 additions and 282 deletions.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
13 changes: 13 additions & 0 deletions examples/runCtaBacktesting/loadCsv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# encoding: UTF-8

"""
导入MC导出的CSV历史数据到MongoDB中
"""

from vnpy.trader.app.ctaStrategy.ctaBase import MINUTE_DB_NAME
from vnpy.trader.app.ctaStrategy.ctaHistoryData import loadMcCsv


if __name__ == '__main__':
loadMcCsv('IF0000_1min.csv', MINUTE_DB_NAME, 'IF0000')

42 changes: 42 additions & 0 deletions examples/runCtaBacktesting/runBacktesting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# encoding: UTF-8

"""
展示如何执行策略回测。
"""

from __future__ import division


from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME


if __name__ == '__main__':
from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy

# 创建回测引擎
engine = BacktestingEngine()

# 设置引擎的回测模式为K线
engine.setBacktestingMode(engine.BAR_MODE)

# 设置回测用的数据起始日期
engine.setStartDate('20120101')

# 设置产品相关参数
engine.setSlippage(0.2) # 股指1跳
engine.setRate(0.3/10000) # 万0.3
engine.setSize(300) # 股指合约大小
engine.setPriceTick(0.2) # 股指最小价格变动

# 设置使用的历史数据库
engine.setDatabase(MINUTE_DB_NAME, 'IF0000')

# 在引擎中创建策略对象
d = {'atrLength': 11}
engine.initStrategy(AtrRsiStrategy, d)

# 开始跑回测
engine.runBacktesting()

# 显示回测结果
engine.showBacktestingResult()
52 changes: 52 additions & 0 deletions examples/runCtaBacktesting/runOptimization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# encoding: UTF-8

"""
展示如何执行参数优化。
"""

from __future__ import division


from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME, OptimizationSetting


if __name__ == '__main__':
from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy

# 创建回测引擎
engine = BacktestingEngine()

# 设置引擎的回测模式为K线
engine.setBacktestingMode(engine.BAR_MODE)

# 设置回测用的数据起始日期
engine.setStartDate('20120101')

# 设置产品相关参数
engine.setSlippage(0.2) # 股指1跳
engine.setRate(0.3/10000) # 万0.3
engine.setSize(300) # 股指合约大小
engine.setPriceTick(0.2) # 股指最小价格变动

# 设置使用的历史数据库
engine.setDatabase(MINUTE_DB_NAME, 'IF0000')

# 跑优化
setting = OptimizationSetting() # 新建一个优化任务设置对象
setting.setOptimizeTarget('capital') # 设置优化排序的目标是策略净盈利
setting.addParameter('atrLength', 12, 20, 2) # 增加第一个优化参数atrLength,起始12,结束20,步进2
setting.addParameter('atrMa', 20, 30, 5) # 增加第二个优化参数atrMa,起始20,结束30,步进5
setting.addParameter('rsiLength', 5) # 增加一个固定数值的参数

# 性能测试环境:I7-3770,主频3.4G, 8核心,内存16G,Windows 7 专业版
# 测试时还跑着一堆其他的程序,性能仅供参考
import time
start = time.time()

# 运行单进程优化函数,自动输出结果,耗时:359秒
#engine.runOptimization(AtrRsiStrategy, setting)

# 多进程优化,耗时:89秒
engine.runParallelOptimization(AtrRsiStrategy, setting)

print u'耗时:%s' %(time.time()-start)
1 change: 1 addition & 0 deletions examples/runVnTrader/VnTrader.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
python run.py
File renamed without changes.
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def getSubpackages(name):
setup(
name='vnpy',
version=vnpy.__version__,
description='A framework for dveloping quantitative trading strategy',
description='A framework for developing quantitative trading strategy',
long_description = long_desc,
author=vnpy.__author__,
author_email='vn.py@foxmail.com',
Expand All @@ -34,7 +34,7 @@ def getSubpackages(name):
'Programming Language :: Python :: 2.7',
'License :: OSI Approved :: MIT License'],
packages=getSubpackages('vnpy'),
package_data={'': ['*.json', '*.md',
package_data={'': ['*.json', '*.md', '*.ico',
'*.dll', '*.lib', '*.so', '*.pyd',
'*.dat', '*.ini', '*.pfx', '*.scc', '*.crt', '*.key']},
)
2 changes: 1 addition & 1 deletion vnpy/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# encoding: UTF-8

__version__ = '1.6.2'
__version__ = '1.6.2b'
__author__ = u'用Python的交易员'
42 changes: 4 additions & 38 deletions vnpy/trader/app/ctaStrategy/ctaBacktesting.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,12 @@ def setStartDate(self, startDate='20100416', initDays=10):
def setEndDate(self, endDate=''):
"""设置回测的结束日期"""
self.endDate = endDate

if endDate:
self.dataEndDate= datetime.strptime(endDate, '%Y%m%d')
self.dataEndDate = datetime.strptime(endDate, '%Y%m%d')

# 若不修改时间则会导致不包含dataEndDate当天数据
self.dataEndDate.replace(hour=23, minute=59)
self.dataEndDate = self.dataEndDate.replace(hour=23, minute=59)

#----------------------------------------------------------------------
def setBacktestingMode(self, mode):
Expand Down Expand Up @@ -947,40 +949,4 @@ def optimize(strategyClass, setting, targetName,
except KeyError:
targetValue = 0
return (str(setting), targetValue)


if __name__ == '__main__':
# 以下内容是一段回测脚本的演示,用户可以根据自己的需求修改
# 建议使用ipython notebook或者spyder来做回测
# 同样可以在命令模式下进行回测(一行一行输入运行)
from strategy.strategyEmaDemo import *

# 创建回测引擎
engine = BacktestingEngine()

# 设置引擎的回测模式为K线
engine.setBacktestingMode(engine.BAR_MODE)

# 设置回测用的数据起始日期
engine.setStartDate('20110101')

# 载入历史数据到引擎中
engine.setDatabase(MINUTE_DB_NAME, 'IF0000')

# 设置产品相关参数
engine.setSlippage(0.2) # 股指1跳
engine.setRate(0.3/10000) # 万0.3
engine.setSize(300) # 股指合约大小

# 在引擎中创建策略对象
engine.initStrategy(EmaDemoStrategy, {})

# 开始跑回测
engine.runBacktesting()

# 显示回测结果
# spyder或者ipython notebook中运行时,会弹出盈亏曲线图
# 直接在cmd中回测则只会打印一些回测数值
engine.showBacktestingResult()


101 changes: 44 additions & 57 deletions vnpy/trader/app/ctaStrategy/ctaHistoryData.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from vnpy.trader.vtGlobal import globalSetting
from vnpy.trader.vtConstant import *
from vnpy.trader.vtObject import VtBarData

from vnpy.trader.app.ctaStrategy.datayesClient import DatayesClient


Expand Down Expand Up @@ -314,53 +313,53 @@ def downloadEquityDailyBar(self, symbol):

#----------------------------------------------------------------------
def downloadEquityDailyBarts(self, symbol):
"""
下载股票的日行情,symbol是股票代码
"""
print u'开始下载%s日行情' %symbol

# 查询数据库中已有数据的最后日期
cl = self.dbClient[DAILY_DB_NAME][symbol]
cx = cl.find(sort=[('datetime', pymongo.DESCENDING)])
if cx.count():
last = cx[0]
else:
last = ''
# 开始下载数据
import tushare as ts
"""
下载股票的日行情,symbol是股票代码
"""
print u'开始下载%s日行情' %symbol

# 查询数据库中已有数据的最后日期
cl = self.dbClient[DAILY_DB_NAME][symbol]
cx = cl.find(sort=[('datetime', pymongo.DESCENDING)])
if cx.count():
last = cx[0]
else:
last = ''
# 开始下载数据
import tushare as ts

if last:
start = last['date'][:4]+'-'+last['date'][4:6]+'-'+last['date'][6:]

if last:
start = last['date'][:4]+'-'+last['date'][4:6]+'-'+last['date'][6:]
data = ts.get_k_data(symbol,start)

if not data.empty:
# 创建datetime索引
self.dbClient[DAILY_DB_NAME][symbol].ensure_index([('datetime', pymongo.ASCENDING)],
unique=True)

for index, d in data.iterrows():
bar = VtBarData()
bar.vtSymbol = symbol
bar.symbol = symbol
try:
bar.open = d.get('open')
bar.high = d.get('high')
bar.low = d.get('low')
bar.close = d.get('close')
bar.date = d.get('date').replace('-', '')
bar.time = ''
bar.datetime = datetime.strptime(bar.date, '%Y%m%d')
bar.volume = d.get('volume')
except KeyError:
print d

data = ts.get_k_data(symbol,start)
flt = {'datetime': bar.datetime}
self.dbClient[DAILY_DB_NAME][symbol].update_one(flt, {'$set':bar.__dict__}, upsert=True)

if not data.empty:
# 创建datetime索引
self.dbClient[DAILY_DB_NAME][symbol].ensure_index([('datetime', pymongo.ASCENDING)],
unique=True)

for index, d in data.iterrows():
bar = VtBarData()
bar.vtSymbol = symbol
bar.symbol = symbol
try:
bar.open = d.get('open')
bar.high = d.get('high')
bar.low = d.get('low')
bar.close = d.get('close')
bar.date = d.get('date').replace('-', '')
bar.time = ''
bar.datetime = datetime.strptime(bar.date, '%Y%m%d')
bar.volume = d.get('volume')
except KeyError:
print d

flt = {'datetime': bar.datetime}
self.dbClient[DAILY_DB_NAME][symbol].update_one(flt, {'$set':bar.__dict__}, upsert=True)

print u'%s下载完成' %symbol
else:
print u'找不到合约%s' %symbol
print u'%s下载完成' %symbol
else:
print u'找不到合约%s' %symbol

#----------------------------------------------------------------------
def loadMcCsv(fileName, dbName, symbol):
Expand Down Expand Up @@ -432,15 +431,3 @@ def loadTdxCsv(fileName, dbName, symbol):
print u'插入完毕,耗时:%s' % (time()-start)


if __name__ == '__main__':
## 简单的测试脚本可以写在这里
#from time import sleep
#e = HistoryDataEngine()
#sleep(1)
#e.downloadEquityDailyBar('000001')
#e.downloadEquityDailyBarts('000001')

# 这里将项目中包含的股指日内分钟线csv导入MongoDB,作者电脑耗时大约3分钟
loadMcCsv('IF0000_1min.csv', MINUTE_DB_NAME, 'IF0000')
#导入通达信历史分钟数据
#loadTdxCsv('CL8.csv', MINUTE_DB_NAME, 'c0000')
2 changes: 1 addition & 1 deletion vnpy/trader/app/ctaStrategy/ctaTemplate.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

from vnpy.trader.app.ctaStrategy.ctaBase import *


########################################################################
class CtaTemplate(object):
"""CTA策略模板"""
Expand Down Expand Up @@ -172,7 +173,6 @@ def getEngineType(self):
return self.ctaEngine.engineType



########################################################################
class TargetPosTemplate(CtaTemplate):
"""
Expand Down
53 changes: 0 additions & 53 deletions vnpy/trader/app/ctaStrategy/strategy/strategyAtrRsi.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,56 +237,3 @@ def onTrade(self, trade):
# 发出状态更新事件
self.putEvent()

if __name__ == '__main__':
# 提供直接双击回测的功能
# 导入PyQt4的包是为了保证matplotlib使用PyQt4而不是PySide,防止初始化出错
from vnpy.trader.app.ctaStrategy.ctaBacktesting import *
from PyQt4 import QtCore, QtGui

# 创建回测引擎
engine = BacktestingEngine()

# 设置引擎的回测模式为K线
engine.setBacktestingMode(engine.BAR_MODE)

# 设置回测用的数据起始日期
engine.setStartDate('20120101')

# 设置产品相关参数
engine.setSlippage(0.2) # 股指1跳
engine.setRate(0.3/10000) # 万0.3
engine.setSize(300) # 股指合约大小
engine.setPriceTick(0.2) # 股指最小价格变动

# 设置使用的历史数据库
engine.setDatabase(MINUTE_DB_NAME, 'IF0000')

# 在引擎中创建策略对象
d = {'atrLength': 11}
engine.initStrategy(AtrRsiStrategy, d)

# 开始跑回测
engine.runBacktesting()

# 显示回测结果
engine.showBacktestingResult()

## 跑优化
#setting = OptimizationSetting() # 新建一个优化任务设置对象
#setting.setOptimizeTarget('capital') # 设置优化排序的目标是策略净盈利
#setting.addParameter('atrLength', 12, 20, 2) # 增加第一个优化参数atrLength,起始11,结束12,步进1
#setting.addParameter('atrMa', 20, 30, 5) # 增加第二个优化参数atrMa,起始20,结束30,步进1
#setting.addParameter('rsiLength', 5) # 增加一个固定数值的参数

## 性能测试环境:I7-3770,主频3.4G, 8核心,内存16G,Windows 7 专业版
## 测试时还跑着一堆其他的程序,性能仅供参考
#import time
#start = time.time()

## 运行单进程优化函数,自动输出结果,耗时:359秒
#engine.runOptimization(AtrRsiStrategy, setting)

## 多进程优化,耗时:89秒
##engine.runParallelOptimization(AtrRsiStrategy, setting)

#print u'耗时:%s' %(time.time()-start)
Loading

0 comments on commit c9c5f42

Please sign in to comment.