用STU 02里面的代码回测时,QA_Performance.pnl的结果是空的,应该如何解决
发布于 2 个月前 作者 loverubywithout 110 次浏览 来自 问答

我正在看STU 02,跟着里面的代码写了个策略,risk的分析都是正常的,也能看到acc.history_table,但是当我performance = QA.QA_Performance(acc),performance.pnl是空的情况.

%load_ext autoreload
%autoreload 2
import QUANTAXIS as QA
import QAPUBSUB
from QAPUBSUB.producer import publisher, publisher_routing
from QAPUBSUB.consumer import subscriber, subscriber_routing
import threading
import json
import pandas as pd
pub = publisher(exchange='x1')
sub = subscriber(exchange='x1')

user = QA.QA_User(username='admin', password='admin')
port = user.new_portfolio('x1')
acc = port.new_account('test1', market_type=QA.MARKET_TYPE.FUTURE_CN, init_cash=1e5)
acc.save()

market_data = []
def on_data(a,b,c,data):
    bar = json.loads(json.loads(data))
    market_data.append(bar)
    print('receive data')
    x1 = pd.DataFrame(market_data)
    
    ind = QA.QA_indicator_MA(x1, 2, 4)
    try:
        if ind.iloc[-1]['MA2'] > ind.iloc[-1]['MA4']:
            print('signal ==> buy')
            # acc.hold_avilable is a dict
            # 空仓开多单
            if acc.hold_available.get(bar['code'], 0) == 0:
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price=bar['close'],
                    trade_amount=1,
                    trade_towards=QA.ORDER_DIRECTION.BUY_OPEN,
                    trade_time=bar['date'], # 日线
                )
            # 已有多头持仓, 不再开仓, 如果另有加仓逻辑, 再说
            elif acc.hold_available.get(bar['code'], 0) > 0:
                print('already buy open')
            # 空头头寸需要 买入平仓
            elif acc.hold_available.get(bar['code'], 0) < 0:
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price=bar['close'],
                    trade_amount=1,
                    trade_towards=QA.ORDER_DIRECTION.BUY_CLOSE,
                    trade_time=bar['date'], 
                )
        elif ind.iloc[-1]['MA2'] < ind.iloc[-1]['MA4']:
            print('signal ==> sell')
            if acc.hold_available.get(bar['code'], 0) == 0:
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price=bar['close'],
                    trade_amount=1,
                    trade_towards=QA.ORDER_DIRECTION.SELL_OPEN,
                    trade_time=bar['date'], # 日线
                )
            # 
            elif acc.hold_available.get(bar['code'], 0) > 0:
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price=bar['close'],
                    trade_amount=1,
                    trade_towards=QA.ORDER_DIRECTION.SELL_CLOSE,
                    trade_time=bar['date'], 
                )
            
            # 已有空头持仓, 不再开仓, 如果另有加仓逻辑, 再说
            elif acc.hold_available.get(bar['code'], 0) < 0:
                print('already sell open')
                
    except:
        pass
sub.callback = on_data

threading.Thread(target=sub.start).start()
fd = QA.QA_fetch_get_future_day('tdx', 'RB2009', '2020-01-01', '2020-02-29')
for idx, item in fd.iterrows():
    pub.pub(json.dumps(item.to_json()))
	
acc.history_table
risk = QA.QA_Risk(acc)
risk.plot_assets_curve();
acc.save()
risk.save()
performance.pnl
  • 回测结果截图

001.png 002.png 003.png 005.png 004.png

=======================================

  • 论坛的一些可以改进的地方
  1. 搜索的关键字是匹配大小写,输入stu和STU得到不同的搜索结果,建议不要匹配大小写;
  2. 帖子预览的时候,代码没有变色(我以为我的语法有问题),其他的markdown效果是正常的,不过这个可能是预览插件的问题,可以不用改吧;
  3. 可以添加黑色主题,虽然我已经用浏览器扩展实现了
  4. 论坛也不支持一些html的样式,比如下面这个折叠功能
<details>
<summary>Title</summary>

content!!!
</details>
回到顶部