金字塔决策交易系统

标题: python一次最多能测试多少个品种? [打印本页]

作者: 逍遥    时间: 2023-3-3 11:33
标题: python一次最多能测试多少个品种?
python简单均线策略多品种测试,5日大于20日做多,5日小于20日平多,每次买一手,测试资金1000万,20150103-20170101测试了28个品种包括螺纹钢,但是测试结果没有螺纹钢交易明细,把测试品种缩小到6个就有螺纹钢的交易明细

作者: admin    时间: 2023-3-3 12:54
你看下py的委托明细是不是资金不足造成的。或者吧你认为有问题的测试报告传给我们看下

作者: 逍遥    时间: 2023-3-3 13:05
我导出了报告,怎么传给你
作者: 技术010    时间: 2023-3-3 13:06
上传到论坛就可以,点击如下,上传附件。

作者: 逍遥    时间: 2023-3-3 13:14
28个品种这段时间都没有螺纹钢交易
作者: 逍遥    时间: 2023-3-3 13:18
我把螺纹钢的测试顺序排第一就有交易明细了,排后面几个品种没有交易,难道只能遍历前面五六个品种?
作者: admin    时间: 2023-3-3 13:20
测试报告导出后压缩上穿
作者: 逍遥    时间: 2023-3-3 13:31


作者: admin    时间: 2023-3-3 14:26
你监控的品种中苹果是2017年12月22号上市的。而你测试的时段范围苹果没有数据。直接到return跳出循环了。


作者: 逍遥    时间: 2023-3-3 16:36
是不是股票池按上市顺序排列就解决问题了?

作者: 技术010    时间: 2023-3-3 16:41
也可以啊,品种是按顺序从前往后执行的,或者把你的代码中判断数据长度小于20就return那段代码去掉。
作者: 逍遥    时间: 2023-3-6 12:04
Python多品种交易,能记录单个品种的交易次数吗?
作者: 技术010    时间: 2023-3-6 12:39
可以啊,通过代码编写来实现。
作者: 逍遥    时间: 2023-3-6 12:53
        for j in symbols2:
            CCPZ = get_portfolio_book(2)
            if j not in CCPZ  and len(CCPZ)<9:                                                                                                        
                buy_open(j,'market',amount=20000,serial_id = 2)
                context.jycs = 1
            if j in CCPZ  and len(CCPZ)<9 and context.jycs<5:  
                buy_open(j,'market',amount=20000,serial_id = 3)
                context.jycs += 1

作者: 逍遥    时间: 2023-3-6 12:55
前面是我写的代码,多品种交易,单个品种加仓次数控制5次以内,但没有效果

作者: admin    时间: 2023-3-6 13:00
你可以通过品种名称+其他字符串保证全局变量的名称时唯一的就行。

全局变量的函数说明
https://www.weistock.com/docs/Py ... 8F%98%E9%87%8F.html


作者: 逍遥    时间: 2023-3-6 13:35
谢谢,另一个问题,Python遍历多品种交易如何获取单个品种持仓数量,代码如何表达?
作者: 技术010    时间: 2023-3-6 13:49
本帖最后由 技术010 于 2023-3-6 13:51 编辑

参考如下,可以获取单个品种的持仓信息。https://www.weistock.com/docs/Py ... html#get-portfolio-投资组合信息

作者: 逍遥    时间: 2023-3-6 13:55
是这两个全局变量吗,是只用一个,还是两个前后呼应都要用?
作者: 技术010    时间: 2023-3-6 13:59
这个是字符串方式的,用数值方式的就可以,一个是写全局变量,一个是读全局变量,是要在一起使用的。

作者: 逍遥    时间: 2023-3-6 16:05
get_portfolio (j, 2)打印出来的提示是什么?
16:02:09 > 品种信息:<__main__.portfolio object at 0x00000000370CB908>


补充内容 (2023-3-6 16:11):
没有显示持仓信息?
作者: 技术010    时间: 2023-3-6 16:13
你完整代码发下啊。
作者: 逍遥    时间: 2023-3-6 16:18
# 本Python代码主要用于策略交易        



# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
from PythonApi import *
import numpy as np
import talib
import math        


#  在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。--(必须实现)
def init(context):
    #入场周期
    context.X = 20
    #出场周期
    context.Y = 10
    #记录建仓的atr
    context.entry = 0
    #记录交易次数
    context.num = 0
    #交易标的
    context.s = context.run_info.base_book_id
    #记录上次开仓价
    context.enterprice = 0        


# 你选择的品种的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新。--(必须实现)
def handle_bar(context):
    close = history_bars(context.s,context.X+2, '1d','close')
    high = history_bars(context.s,context.X+2, '1d','high')
    low = history_bars(context.s,context.X+2, '1d','low')  
    if len(close) == context.X+2:
        #atr的计算参考这个帖子http://www.weistock.com/bbs/dispbbs.asp?boardid=10&Id=173300
        tr = talib.TRANGE(high,low,close)
        atr = talib.SMA(tr[1:],context.X)
        logger.info('波幅'+str(atr))
        unit = int((get_account(6)*0.01) / (atr[-2] * get_dynainf(context.s,209)))
        #X天的高低点(不包含当天)
        X周期高点 = high[:-1].max()
        X周期低点 = low[:-1].min()
        
        #建立头寸,根据唐奇安通道创新高入场,关键点就是利用波动atr计算仓位数量,portfolio用来进行仓位的控制
        
        portfolio=get_portfolio (context.s, 2)
        print('品种信息:'+str(portfolio)) #############################
        
        if high[-1]>=X周期高点 and portfolio.buy_quantity==0 and portfolio.sell_quantity==0:
            buy_open(context.s, "Market",0 ,unit,serial_id = 1)
            context.entry = atr[-2]
            context.num = 1
            context.enterprice = close[-1]
        if low[-1]<=X周期低点 and portfolio.sell_quantity==0 and portfolio.buy_quantity==0:
            sell_open(context.s, "Market",0 ,unit,serial_id = 2)
            context.entry = atr[-2]
            context.num = 1
            context.enterprice = close[-1]
            
        #加仓,最高价比上次开仓价多0.5个atr(盈利加仓)
        if portfolio.sell_quantity ==0 and portfolio.buy_quantity>0 and high[-1]>context.enterprice + 0.5*context.entry and context.num<4:
            buy_open(context.s, "Market",0 ,unit,serial_id = 3)
            context.num+=1
            context.enterprice = close[-1]
        if portfolio.buy_quantity==0 and portfolio.sell_quantity>0 and low[-1]<context.enterprice - 0.5*context.entry and context.num<4:
            sell_open(context.s, "Market",0 ,unit,serial_id = 4)
            context.num+=1
            context.enterprice = close[-1]
            
        #出场,跌破短周期低点平多
        Y周期高点 = high[-context.Y-1:-1].max()
        Y周期低点 = low[-context.Y-1:-1].min()
        if portfolio.buy_quantity>0 and low[-1] < Y周期低点:
            sell_close(context.s,"Market",0,portfolio.buy_quantity,serial_id = 5)
        if portfolio.sell_quantity>0 and high[-1] > Y周期高点:
            buy_close(context.s,"Market",0,portfolio.sell_quantity,serial_id = 6)
            
        #止损,亏损幅度超过开仓2个atr幅度止损
        if portfolio.buy_quantity>0 and low[-1] < context.enterprice - 2*context.entry:
            sell_close(context.s,"Market",0,portfolio.buy_quantity,serial_id = 7)
        if portfolio.sell_quantity>0 and high[-1] > context.enterprice + 2*context.entry:
            buy_close(context.s,"Market",0,portfolio.sell_quantity,serial_id = 8)
作者: admin    时间: 2023-3-6 16:46
get_portfolio返回是个对象。你对象名是portfolio,你应该对获取的对象进行再次处理。


例如
print('品种信息:'+str(portfolio.pnl))




欢迎光临 金字塔决策交易系统 (https://www.weistock.com/BBS/) Powered by Discuz! X3.4