RT。
我想把策略回测时的,
K线时间,价格序列,技术指标值 打印输出到文件,以便检查自己写的指标是否正确 (策略移植中)
我的jupyter notebook里,
with open('./log.txt','wt') as f:
print(data['Close'],',',data['MA'],file=f)
这样是可以的,
但写在策略文件的 def on_5min_bar(self, bar: BarData): 里(策略逻辑所在的部分)
写在指标计算结果 的下行,策略回测一遍,找不到这个文件呢。
请问正确打印想观察变量的值的方式是如何 的?
这个值得关注。
不过,我觉得还是先教授一下,从零开始写指标比较好。举几个例子,不要直接调用talib的。
策略,自带的Rsi_atr ,参数默认
品种rb2010
今天发现螺纹有一个开多信号,之前是平仓
但平仓发单是以3615的涨停价来发出的,这是正常的吗?
elif self.pos < 0:
self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
self.intra_trade_high = bar.high_price
short_stop = self.intra_trade_low * \
(1 + self.trailing_percent / 100)
self.cover(short_stop, abs(self.pos), stop=True)
这段代码怎么也看不出来是要涨停价发单呢?
好的,谢谢老大回复我这么小白的问题……
补充更正一下,
这里的问题 ,应该是策略运行发单的触发,与回测不一致。偏离很大 不是滑点能够解释的。
很关键的问题,请各位大佬指点一下,问题出现在什么地方呢
以自带的atr_rsi策略为例,默认参数,品种为rb2010.
vnpy 2.1.2 ctp 的simnow 模拟账户。
if self.atr_value > self.atr_ma:
if self.rsi_value > self.rsi_buy:
self.buy(bar.close_price + 5, self.fixed_size)
elif self.rsi_value < self.rsi_sell:
self.short(bar.close_price - 5, self.fixed_size)
9点开盘立即发单(我理解是上周收盘时就满足了条件)
不过对照文华的1分钟数据,看到Atr(22)与atr_ma(10)满足条件,但RSI(5)并不满足条件>66。(只对监临近的几根Bar,这里假设文华与vnpy里的行情数据一致)
【问题1】如果是这样,那天9点开盘时,不应该发出 多开指令!除非不是next bar模式。因为高开后,rsi是立即满足了。那么是否存在信号闪烁的问题?
【问题2】假设条件逻辑没问题,进场指令都是限价指令,bar.close加减5。
17日最后一个1分钟Bar,收盘价3381,那我理解发出买单应该是3386。但回测来看,不论是否设置滑点,回测里的价格都是 3387。
然后策略实际跑的情况是以3404发单,成交3401。不是应该是限价单吗?这个是我的主要困惑。
问题3,策略运行的委托结果,与回测偏很大是如何产生的,尤其是 后面的翻空操作
5_-957772934_4那个委托,是手动测试交易模块的手动下单(不知道最近老是不成功,订阅不了,下单也老是提交中)
手动委托也 一直提示委托中,但策略买卖可以成交
CTP 模拟账户
通过加载运行策略,可以订阅到行情,会在行情列表显示相应的品种;
但在左侧的交易模块,输入品种代码,如交易所SHFE, 品种代码 rb2010.SHFE , 无法获取盘口信息,也无法订阅行情到 行情模块。
感谢老大指点,的确是这样的原因!
再次拜谢。
用Python的交易员 wrote:
运行目录的查找,基于当前启动目录下是否存在.vntrader文件夹,如果有就用当前启动目录为运行目录,否则用系统用户目录。
我将ipynb文件放在 vnpy运行目录下(与实际的.vntrader并列),这样数据是可以正常载入了,但策略回测过程出现意外,试了好几个策略,在vnpy都可以正常运行的,但在notebook提示如下错误。
2020-04-17 13:56:58.837202 历史数据加载完成,数据量:348976
2020-04-17 13:56:58.848174 策略初始化完成
2020-04-17 13:56:58.848174 开始回放历史数据
2020-04-17 13:56:58.852153 触发异常,回测终止
2020-04-17 13:56:58.854149 Traceback (most recent call last):
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\backtesting.py", line 304, in run_backtesting
func(data)
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\backtesting.py", line 750, in new_bar
self.strategy.on_bar(bar)
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\strategies\boll_channel_strategy.py", line 76, in on_bar
self.bg.update_bar(bar)
File "d:\vnstudio\lib\site-packages\vnpy\trader\utility.py", line 282, in update_bar
self.on_window_bar(self.window_bar)
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\strategies\boll_channel_strategy.py", line 96, in on_15min_bar
self.buy(self.boll_up, self.fixed_size, True)
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\template.py", line 155, in buy
return self.send_order(Direction.LONG, Offset.OPEN, price, volume, stop, lock)
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\template.py", line 189, in send_order
self, direction, offset, price, volume, stop, lock
File "d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\backtesting.py", line 954, in send_order
price = round_to(price, self.pricetick)
File "d:\vnstudio\lib\site-packages\vnpy\trader\utility.py", line 126, in round_to
rounded = float(int(round(value / target)) * target)
decimal.DivisionByZero: [<class 'decimal.DivisionByZero'>]
有些指标用talib实现不太了。
指标含义大概是这样的,回溯过去几根bar,如果依次走高是上升,返回0,否则 返回1
主要问题是,我需要对返回的结果 进行回溯,不一定是使用最新(最后一个)的结果。
mc代码,接近自然语言,应该比较好理角,供参考
inputs:
InputData( numericseries ),
BarCount( numericsimple ),
NotStrict( truefalse );
vars:
result( 0 ), PrevValue(0), CurrValue(0), Index(0);
PrevValue = InputData[BarCount-1];
result = 0;
For Index = 1 to BarCount-1 begin
CurrValue = InputData[BarCount - 1 - Index];
If (CurrValue < PrevValue) then begin
// indicator is falling, not rising
result = 0;
break;
end;
if(NotStrict = false and CurrValue = PrevValue) then begin
result = 0;
break;
end;
if(CurrValue > PrevValue) then begin
result = 1;
end;
PrevValue = CurrValue;
end;
rising = result;
我尝试的python代码
def IsRisingFunc(self, arrayvalue, barcount: int, NotStrict: bool=True,
array: bool = False
) -> Union[int, np.ndarray]:
""""
判断是上涨趋势,回溯barcount个价格序列,从左向右循环比较,均大为上升
"""
PreValue = arrayvalue[-barcount]
result = []
for num in range(-(barcount-1),0):
CurrValue = arrayvalue[num]
if CurrValue < PreValue:
result.append(0)
break
if NotStrict == False and CurrValue == PreValue:
result.append(0)
break
if CurrValue > PreValue:
result.append(1)
PreValue = CurrValue
resultarray = np.array(result)
if array:
return resultarray
return resultarray[-1]
修改了一下,应该是可以运行了,之前的错误是均线指标调用时,返回序列,直接当数值来比较了,加个[-1]就好了。
现在能回测,但就是返回一个错误提示
File "D:\Tmp\vnpy\strategies\ma_bo_v1.py", line 111, in on_Xmin_bar
array =False
File "d:\vnstudio\lib\site-packages\vnpy\app\xtool\XQuantTool.py", line 219, in SQ_IsRising
return resultarray[-1]
IndexError: index -1 is out of bounds for axis 0 with size 0
在策略文件是这样写的
self.ma_fast = am.sma(self.ma_f_len, array=True)
self.ma_slow = am.sma(self.ma_s_len, array=False)
self.IsRising = am.SQ_IsRising(self.ma_fast,5,NotStrict=True,
array =False
)
# longcond = self.ma_fast > self.ma_slow
longcond = self.IsRising == 1 and self.ma_fast[-1] > self.ma_slow
shortcond = self.ma_fast[-1] < self.ma_slow
...
尝试看ta_lib的源码,看看有没有启示,但C实在太难了。
因为经常使用其他指标值 作为参数输入,所以最后还是方法化了他。
请大家帮帮忙,如果把这个改写到符合vnpy, arraymanager的要求。
谢谢!
谢谢,这块儿已经很清晰了
好像是这样的原因,
我把数据库文件复制到用户目录下的.vntrader下,有一次是成功的。
不过现在运行也是空的。
既然json文件里可以记录 运行目录 的设定,为什么不让vnpy根据这个设定却寻找目录呢?
感谢指点,测试可行。
我还在傻啦吧唧的,在扩展ArrayManager里,使用字典去映射那些价格序列,好作为参数输入……虽然可行,但却是多此一举的感觉
RT。显示在加载数据,但最终是 空 的。 好奇怪
2020-04-14 21:23:26.781135 开始加载历史数据
2020-04-14 21:23:26.781135 加载进度: [2%]
2020-04-14 21:23:26.781135 加载进度: [4%]
2020-04-14 21:23:26.781135 加载进度: [6%]
2020-04-14 21:23:26.781135 加载进度: [8%]
2020-04-14 21:23:26.781135 加载进度: [10%]
2020-04-14 21:23:26.781135 加载进度:# [12%]
2020-04-14 21:23:26.781135 加载进度:# [13%]
2020-04-14 21:23:26.781135 加载进度:# [15%]
2020-04-14 21:23:26.781135 加载进度:# [17%]
2020-04-14 21:23:26.781135 加载进度:# [19%]
2020-04-14 21:23:26.781135 加载进度:## [21%]
2020-04-14 21:23:26.782105 加载进度:## [23%]
2020-04-14 21:23:26.782105 加载进度:## [25%]
2020-04-14 21:23:26.782105 加载进度:## [27%]
2020-04-14 21:23:26.782105 加载进度:## [29%]
2020-04-14 21:23:26.782105 加载进度:### [31%]
2020-04-14 21:23:26.782105 加载进度:### [33%]
2020-04-14 21:23:26.782105 加载进度:### [35%]
2020-04-14 21:23:26.782105 加载进度:### [37%]
2020-04-14 21:23:26.782105 加载进度:### [38%]
2020-04-14 21:23:26.782105 加载进度:#### [40%]
2020-04-14 21:23:26.782105 加载进度:#### [42%]
2020-04-14 21:23:26.782105 加载进度:#### [44%]
2020-04-14 21:23:26.782105 加载进度:#### [46%]
2020-04-14 21:23:26.782105 加载进度:#### [48%]
2020-04-14 21:23:26.782105 加载进度:#### [50%]
2020-04-14 21:23:26.782105 加载进度:##### [52%]
2020-04-14 21:23:26.782105 加载进度:##### [54%]
2020-04-14 21:23:26.782105 加载进度:##### [56%]
2020-04-14 21:23:26.782105 加载进度:##### [58%]
2020-04-14 21:23:26.782105 加载进度:##### [60%]
2020-04-14 21:23:26.782105 加载进度:###### [61%]
2020-04-14 21:23:26.782105 加载进度:###### [63%]
2020-04-14 21:23:26.782105 加载进度:###### [65%]
2020-04-14 21:23:26.782105 加载进度:###### [67%]
2020-04-14 21:23:26.782105 加载进度:###### [69%]
2020-04-14 21:23:26.782105 加载进度:####### [71%]
2020-04-14 21:23:26.782105 加载进度:####### [73%]
2020-04-14 21:23:26.782105 加载进度:####### [75%]
2020-04-14 21:23:26.782105 加载进度:####### [77%]
2020-04-14 21:23:26.782105 加载进度:####### [79%]
2020-04-14 21:23:26.783187 加载进度:######## [81%]
2020-04-14 21:23:26.783187 加载进度:######## [83%]
2020-04-14 21:23:26.783187 加载进度:######## [85%]
2020-04-14 21:23:26.783187 加载进度:######## [86%]
2020-04-14 21:23:26.783187 加载进度:######## [88%]
2020-04-14 21:23:26.783187 加载进度:######### [90%]
2020-04-14 21:23:26.783187 加载进度:######### [92%]
2020-04-14 21:23:26.783187 加载进度:######### [94%]
2020-04-14 21:23:26.783187 加载进度:######### [96%]
2020-04-14 21:23:26.783187 加载进度:######### [98%]
2020-04-14 21:23:26.783187 加载进度:######### [100%]
2020-04-14 21:23:26.783187 加载进度:########## [100%]
2020-04-14 21:23:26.783187 历史数据加载完成,数据量:0
2020-04-14 21:23:26.783187 策略初始化完成
2020-04-14 21:23:26.783187 开始回放历史数据
2020-04-14 21:23:26.783187 历史数据回放结束
2020-04-14 21:23:26.783187 开始计算逐日盯市盈亏
2020-04-14 21:23:26.788089 成交记录为空,无法计算
2020-04-14 21:23:26.788089 开始计算策略统计指标
2020-04-14 21:23:26.788089 ------------------------------
2020-04-14 21:23:26.788089 首个交易日:
2020-04-14 21:23:26.788089 最后交易日:
2020-04-14 21:23:26.788089 总交易日: 0
2020-04-14 21:23:26.788089 盈利交易日: 0
2020-04-14 21:23:26.788089 亏损交易日: 0
2020-04-14 21:23:26.788089 起始资金: 1,000,000.00
2020-04-14 21:23:26.788089 结束资金: 0.00
2020-04-14 21:23:26.788089 总收益率: 0.00%
2020-04-14 21:23:26.788089 年化收益: 0.00%
2020-04-14 21:23:26.788089 最大回撤: 0.00
2020-04-14 21:23:26.788089 百分比最大回撤: 0.00%
2020-04-14 21:23:26.788089 最长回撤天数: 0
2020-04-14 21:23:26.788089 总盈亏: 0.00
2020-04-14 21:23:26.788089 总手续费: 0.00
2020-04-14 21:23:26.788089 总滑点: 0.00
2020-04-14 21:23:26.788089 总成交金额: 0.00
2020-04-14 21:23:26.788089 总成交笔数: 0
2020-04-14 21:23:26.788089 日均盈亏: 0.00
2020-04-14 21:23:26.788089 日均手续费: 0.00
2020-04-14 21:23:26.788089 日均滑点: 0.00
2020-04-14 21:23:26.788089 日均成交金额: 0.00
2020-04-14 21:23:26.788089 日均成交笔数: 0
2020-04-14 21:23:26.788089 日均收益率: 0.00%
2020-04-14 21:23:26.788089 收益标准差: 0.00%
2020-04-14 21:23:26.788089 Sharpe Ratio: 0.00
2020-04-14 21:23:26.788089 收益回撤比: 0.00
2020-04-14 21:23:26.789086 策略统计指标计算完成
前面的设置应该没错
engine = BacktestingEngine()
engine.set_parameters(
vt_symbol="rb88.SHFE",
interval="1m",
start=datetime(2016, 1, 1),
end=datetime(2020, 4, 10),
rate=1.0/10000,
slippage=1,
size=1,
pricetick=0,
capital=1_000_000,
)
engine.add_strategy(AtrRsiStrategy, {})
好像载入数据有点问题,这个数据可以正常csv_loader进vnpy,
engine.load_data("D:\Tmp\rb_hot_1min.txt", names = [
"datetime",
"open_price",
"high_price",
"low_price",
"close_price",
"volume",
#"open_interest",
])
TypeError Traceback (most recent call last)
<ipython-input-22-2da52defcc9d> in <module>
5 "low_price",
6 "close_price",
----> 7 "volume"
8 #"open_interest",
9 ])
d:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\csv_backtesting.py in load_data(self, filename, names, compression, parse_dates, skiprows)
154 end = min(end, self.end) # Make sure end time stays within set range
155
--> 156 df = pd.read_csv(filename, compression, parse_dates, skiprows, names,)
157 # Generate
158 symbol, exchange = self.vt_symbol.split(".")
d:\vnstudio\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
700 skip_blank_lines=skip_blank_lines)
701
--> 702 return _read(filepath_or_buffer, kwds)
703
704 parser_f.name = name
d:\vnstudio\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
427
428 # Create the parser.
--> 429 parser = TextFileReader(filepath_or_buffer, **kwds)
430
431 if chunksize or iterator:
d:\vnstudio\lib\site-packages\pandas\io\parsers.py in init(self, f, engine, **kwds)
888 # might mutate self.engine
889 self.engine = self._check_file_or_buffer(f, engine)
--> 890 self.options, self.engine = self._clean_options(options, engine)
891
892 if 'has_index_names' in kwds:
d:\vnstudio\lib\site-packages\pandas\io\parsers.py in _clean_options(self, options, engine)
976 " sep=None with delim_whitespace=False")
977 engine = 'python'
--> 978 elif sep is not None and len(sep) > 1:
979 if engine == 'c' and sep == r'\s+':
980 result['delim_whitespace'] = True
TypeError: object of type 'bool' has no len()
数据格式是这样的
"Datetime","Open","High","Low","Close","Volume"
2013/4/15 09:01:00,3800,3800,3785,3791,113892
2013/4/15 09:02:00,3791,3792,3783,3788,56304
2013/4/15 09:03:00,3788,3791,3781,3783,48004
2013/4/15 09:04:00,3783,3795,3783,3794,42608
2013/4/15 09:05:00,3793,3793,3788,3788,27592
譬如,均线指标,
SMA(real[, timeperiod=?])
Simple Moving Average (Overlap Studies)
Inputs:
real: (any ndarray)
Parameters:
timeperiod: 30
Outputs:
real
我看vnpy里的指标,都是在定义里面写成固定的,直接传了self.close, self.high等进去。
如果我想使用 SMA(high,20), SMA(low,20)这类的,难道要为此单独定义一个指标出来?
不太懂编程,尤其是在面对对象这种,类内外,分不清哪个变量对应哪个变量。
请问哪位可以指点一下,提供个范例呢?谢谢!
1、有两个问题请教。
请问这个gui回测策略,
K线周期是原始数据的周期框架?譬如我导入是1分钟数据,这是选是1m。这是标识是原始数据的周期,不是指策略回测时使用的周期?
2、
另外搜索看到boll那个策略,可以实现从1分钟合成高级别,譬如15分钟的周期框架,
但如果我想测试30分钟周期,或者2小时周期框架上,好像不能即时刷新呀,需要关闭vn,然后再打开才能生效。
1,数据文件,必要是要有列名;列的内容对应要一致;
2,日期时间格式要对。