[bug fix] 股票引擎
This commit is contained in:
parent
4804d476e0
commit
db50cc11e4
@ -565,7 +565,7 @@ class BackTestingEngine(object):
|
|||||||
for vt_symbol, symbol_data in data_dict.items():
|
for vt_symbol, symbol_data in data_dict.items():
|
||||||
self.write_log(u'配置{}数据:{}'.format(vt_symbol, symbol_data))
|
self.write_log(u'配置{}数据:{}'.format(vt_symbol, symbol_data))
|
||||||
self.set_price_tick(vt_symbol, symbol_data.get('price_tick', 0.01))
|
self.set_price_tick(vt_symbol, symbol_data.get('price_tick', 0.01))
|
||||||
self.set_volume_tick(vt_symbol, symbol_data.get('min_volume', 10))
|
self.set_volume_tick(vt_symbol, symbol_data.get('min_volume', 100))
|
||||||
self.set_slippage(vt_symbol, symbol_data.get('slippage', 0))
|
self.set_slippage(vt_symbol, symbol_data.get('slippage', 0))
|
||||||
self.set_size(vt_symbol, symbol_data.get('symbol_size', 1))
|
self.set_size(vt_symbol, symbol_data.get('symbol_size', 1))
|
||||||
margin_rate = symbol_data.get('margin_rate', 1)
|
margin_rate = symbol_data.get('margin_rate', 1)
|
||||||
|
@ -402,8 +402,8 @@ class CtaEngine(BaseEngine):
|
|||||||
# strategy.pos -= trade.volume
|
# strategy.pos -= trade.volume
|
||||||
# 根据策略名称,写入 data\straetgy_name_trade.csv文件
|
# 根据策略名称,写入 data\straetgy_name_trade.csv文件
|
||||||
strategy_name = getattr(strategy, 'strategy_name')
|
strategy_name = getattr(strategy, 'strategy_name')
|
||||||
trade_fields = ['datetime', 'symbol', 'exchange', 'vt_symbol', 'tradeid', 'vt_tradeid', 'orderid', 'vt_orderid',
|
trade_fields = ['datetime', 'symbol', 'exchange', 'vt_symbol', 'name', 'tradeid', 'vt_tradeid', 'orderid', 'vt_orderid',
|
||||||
'direction', 'offset', 'price', 'volume', 'idx_price']
|
'direction', 'offset', 'price', 'volume']
|
||||||
trade_dict = OrderedDict()
|
trade_dict = OrderedDict()
|
||||||
try:
|
try:
|
||||||
for k in trade_fields:
|
for k in trade_fields:
|
||||||
@ -418,15 +418,6 @@ class CtaEngine(BaseEngine):
|
|||||||
else:
|
else:
|
||||||
trade_dict[k] = getattr(trade, k, '')
|
trade_dict[k] = getattr(trade, k, '')
|
||||||
|
|
||||||
# 添加指数价格
|
|
||||||
symbol = trade_dict.get('symbol')
|
|
||||||
idx_symbol = get_underlying_symbol(symbol).upper() + '99.' + trade_dict.get('exchange')
|
|
||||||
idx_price = self.get_price(idx_symbol)
|
|
||||||
if idx_price:
|
|
||||||
trade_dict.update({'idx_price': idx_price})
|
|
||||||
else:
|
|
||||||
trade_dict.update({'idx_price': trade_dict.get('price')})
|
|
||||||
|
|
||||||
if strategy_name is not None:
|
if strategy_name is not None:
|
||||||
trade_file = str(get_folder_path('data').joinpath('{}_trade.csv'.format(strategy_name)))
|
trade_file = str(get_folder_path('data').joinpath('{}_trade.csv'.format(strategy_name)))
|
||||||
append_data(file_name=trade_file, dict_data=trade_dict)
|
append_data(file_name=trade_file, dict_data=trade_dict)
|
||||||
@ -1164,7 +1155,7 @@ class CtaEngine(BaseEngine):
|
|||||||
if len(adj_list) > 0:
|
if len(adj_list) > 0:
|
||||||
self.write_log(f'需要对{vt_symbol}进行前复权处理')
|
self.write_log(f'需要对{vt_symbol}进行前复权处理')
|
||||||
for row in adj_list:
|
for row in adj_list:
|
||||||
row.update({'dividOperateDate': row.get('dividOperateDate')[:10] + ' 09:31:00'})
|
row.update({'dividOperateDate': row.get('dividOperateDate')[:10] + ' 09:30:00'})
|
||||||
# list -> dataframe, 转换复权日期格式
|
# list -> dataframe, 转换复权日期格式
|
||||||
adj_data = pd.DataFrame(adj_list)
|
adj_data = pd.DataFrame(adj_list)
|
||||||
adj_data["dividOperateDate"] = pd.to_datetime(adj_data["dividOperateDate"], format="%Y-%m-%d %H:%M:%S")
|
adj_data["dividOperateDate"] = pd.to_datetime(adj_data["dividOperateDate"], format="%Y-%m-%d %H:%M:%S")
|
||||||
|
@ -34,7 +34,7 @@ from vnpy.trader.utility import (
|
|||||||
extract_vt_symbol,
|
extract_vt_symbol,
|
||||||
get_csv_last_dt
|
get_csv_last_dt
|
||||||
)
|
)
|
||||||
|
from vnpy.data.common import stock_to_adj
|
||||||
from .back_testing import BackTestingEngine, stock_to_adj
|
from .back_testing import BackTestingEngine, stock_to_adj
|
||||||
|
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ class PortfolioTestingEngine(BackTestingEngine):
|
|||||||
if isinstance(last_dt, datetime):
|
if isinstance(last_dt, datetime):
|
||||||
if last_dt.strftime('%Y-%m-%d') < self.test_end_date:
|
if last_dt.strftime('%Y-%m-%d') < self.test_end_date:
|
||||||
self.write_log(f'加载数据[{vt_symbol}], 使用{fq_name}文件:{fq_bar_file}')
|
self.write_log(f'加载数据[{vt_symbol}], 使用{fq_name}文件:{fq_bar_file}')
|
||||||
symbol_df = pd.read_csv(bar_file, dtype=data_types)
|
symbol_df = pd.read_csv(fq_bar_file, dtype=data_types)
|
||||||
# 转换时间,str =》 datetime
|
# 转换时间,str =》 datetime
|
||||||
symbol_df["datetime"] = pd.to_datetime(symbol_df["datetime"], format="%Y-%m-%d %H:%M:%S")
|
symbol_df["datetime"] = pd.to_datetime(symbol_df["datetime"], format="%Y-%m-%d %H:%M:%S")
|
||||||
# 设置时间为索引
|
# 设置时间为索引
|
||||||
@ -139,7 +139,7 @@ class PortfolioTestingEngine(BackTestingEngine):
|
|||||||
for row in adj_list:
|
for row in adj_list:
|
||||||
d = row.get('dividOperateDate', "")[0:10]
|
d = row.get('dividOperateDate', "")[0:10]
|
||||||
if len(d) == 10:
|
if len(d) == 10:
|
||||||
row.update({'dividOperateDate': d + ' 09:31:00'})
|
row.update({'dividOperateDate': d + ' 09:30:00'})
|
||||||
# list -> dataframe, 转换复权日期格式
|
# list -> dataframe, 转换复权日期格式
|
||||||
adj_data = pd.DataFrame(adj_list)
|
adj_data = pd.DataFrame(adj_list)
|
||||||
adj_data["dividOperateDate"] = pd.to_datetime(adj_data["dividOperateDate"],
|
adj_data["dividOperateDate"] = pd.to_datetime(adj_data["dividOperateDate"],
|
||||||
|
@ -1092,6 +1092,10 @@ class CtaStockTemplate(CtaTemplate):
|
|||||||
symbol_tick.bid_volume_5]):
|
symbol_tick.bid_volume_5]):
|
||||||
market_ask_volumes = symbol_tick.ask_volume_1 + symbol_tick.ask_volume_2 + symbol_tick.ask_volume_3 + symbol_tick.ask_volume_4 + symbol_tick.ask_volume_5
|
market_ask_volumes = symbol_tick.ask_volume_1 + symbol_tick.ask_volume_2 + symbol_tick.ask_volume_3 + symbol_tick.ask_volume_4 + symbol_tick.ask_volume_5
|
||||||
market_bid_volumes = symbol_tick.bid_volume_1 + symbol_tick.bid_volume_2 + symbol_tick.bid_volume_3 + symbol_tick.bid_volume_4 + symbol_tick.bid_volume_5
|
market_bid_volumes = symbol_tick.bid_volume_1 + symbol_tick.bid_volume_2 + symbol_tick.bid_volume_3 + symbol_tick.bid_volume_4 + symbol_tick.bid_volume_5
|
||||||
|
# 乘以基本系数
|
||||||
|
market_ask_volumes = market_ask_volumes * symbol_volume_tick
|
||||||
|
market_bid_volumes = market_bid_volumes * symbol_volume_tick
|
||||||
|
|
||||||
org_sell_volume = sell_volume
|
org_sell_volume = sell_volume
|
||||||
if market_bid_volumes > 0 and market_ask_volumes > 0 and org_sell_volume >= 2 * symbol_volume_tick:
|
if market_bid_volumes > 0 and market_ask_volumes > 0 and org_sell_volume >= 2 * symbol_volume_tick:
|
||||||
sell_volume = min(market_bid_volumes / 4, market_ask_volumes / 4, sell_volume)
|
sell_volume = min(market_bid_volumes / 4, market_ask_volumes / 4, sell_volume)
|
||||||
|
Loading…
Reference in New Issue
Block a user