请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  源码分享 帖子:3351408 新帖:26

如何在K线中展示回测的下单位置

有事您说话发表于:5 月 10 日 01:13回复(1)

有些时候想看回测下单的位置,总是需要去下单记录里面然后打开股票软件进行对照,比较麻烦,正好看到社区暂时没有下单内容图形展示相关的帖子,就试着借助已有大神写的K线的帖子基础上写了下。
整个过程的思路就是

step1 在研究中获取回测函数的下单信号

step2 画出涉及到的股票的K线图

step3 将下单信号在K线图中进行展示

#取股票数据进行K线绘制,并将下单信号加入其中
##先导入各种库
import datetime
import jqdata
import time
import pandas as pd
import talib
import matplotlib.pyplot as plt
import matplotlib.finance as fin

#获取下单信号
##取的回测策略的ID
##具体的内容请参考https://www.joinquant.com/api#研究中获取回测信息
##我用的是新建策略里面的模板策略
algorithm_id='0cf797d9a92860fe3229ce0d8f6beea3'

#根据回测ID,在研究中创建策略回测的信息,输出created_bt_id
extra_vars = {}
initial_positions = [
    {
        'security':'000001.XSHE',
        'amount':'0',
    }
]
params = {
    "algorithm_id": algorithm_id,
    "start_date": "2016-10-1",
    "end_date": "2017-05-16",
    "frequency": "day",
    "initial_cash": "100000",
    "initial_positions": initial_positions,
    "extras": extra_vars,
}
created_bt_id = create_backtest(**params)

#这里可以进行结果打印以证实调用正常
print(created_bt_id)
f8bed99f77af29b4809211472d262d59
#获取下单信息
gt = get_backtest(created_bt_id)
dic = gt.get_orders()
#可以输出一个订单信息看下里面包括的内容,可以发现dic是一个元素为字典的列表
print(dic[:1])
[{'security_name': '平安银行', 'action': 'open', 'security': '000001.XSHE', 'commission': 30.0, 'amount': 10800, 'time': '2016-10-25 09:30:00', 'filled': 10800, 'price': 9.26}]
#创建两个用于存储买入和卖出的信号的列表
buy_list=[(i['price'],i['time'],'buy') for i in dic if i['action']=='open']
sell_list=[(j['price'],j['time'],'sell') for j in dic if j['action']=='close']
#输出验证是否正确
print(buy_list[:2])

#获取交易日日期
trade_date=list(jqdata.get_trade_days(start_date='2016-10-1',end_date='2017-5-17'))

#获取这段时间内股票的数据
df=get_price('000001.XSHE',start_date='2016-10-1',end_date='2017-5-17',frequency='daily',fields=['open','high','low','close'])

#进行K线绘制
##由有画图函数的需要将index更改为数字
t=range(len(df))
df['t']=pd.Series(t,index=df.index)
df=df.set_index('t')

#将获取到的下单列表里面的时间与df的index对应
##定义一个进行index转换的函数
def order_trans(L):
    out_list=[]
    for order in L:
        t0 = time.strptime(order[1][:10],'%Y-%m-%d')
        y,m,d = t0[0:3]
        t1=datetime.date(y,m,d)
        out_list.append((order[0],trade_date.index(t1),order[2]))
    return out_list
order_buy_list=order_trans(buy_list)
order_sell_list=order_trans(sell_list)

#开始绘图
plt.close()
fig = plt.figure(figsize(100,50),dpi=800,frameon=True)

ax1=plt.subplot2grid((18,6),(0,0),rowspan=3,colspan=1)
ax1.set_xlim(0,len(df))
o = list(df['open'].values)
h = list(df['high'].values)
l = list(df['low'].values)
c = list(df['close'].values)
for i,j,k in order_buy_list:
    ax1.annotate(k,xy=(j,c[j]-0.1),xytext=(j,c[j]-0.3),arrowprops=dict(facecolor='red',shrink=0.2),horizontalalignment='left',verticalalignment='top')
for i,j,k in order_sell_list:
    ax1.annotate(k,xy=(j,c[j]+0.1),xytext=(j,c[j]+0.3),arrowprops=dict(facecolor='green',shrink=0.2),horizontalalignment='left',verticalalignment='top')
quotes = zip(t, o, h, l, c)
df['ma10'] = pd.Series(talib.MA(df['close'].values,10),index=df.index.values)
df['ma10'].plot(ax=ax1, legend=False)
fin.candlestick_ohlc(ax1,quotes, width=0.6, colorup='r', colordown='g')
plt.show()
[(9.26, '2016-10-25 09:30:00', 'buy'), (9.35, '2016-11-23 09:30:00', 'buy')]

全部回复

0/140

量化课程

    移动端课程