欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → For 循环中,出现不同的结果

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有2498人关注过本帖树形打印复制链接

主题:For 循环中,出现不同的结果

帅哥哟,离线,有人找我吗?
rockyan
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:611 积分:0 威望:0 精华:0 注册:2015/9/11 9:51:55
For 循环中,出现不同的结果  发帖心情 Post By:2021/3/27 21:59:13 [显示全部帖子]

为了计算年末各股票的总市值,所以必须计算出年末的总股本,因此写了一个模块来解决这个问题

在个股运行的时候,测试下来都没有问题

但在循环中,如希望一次性计算所有沪深300股票的个股总股本时,出现了问题

源码,如1楼,原来定义的def ZGB()是放在我的模块里,单独开来的,在这里为了方便,合并进策略里

回测的时候,需要注意每次把生成的TXT文件删除,以免第二次回测时出错,即可

1楼运行的结果,在SZ000002时,出现问题,只有两年的数据,然后,后面就没有数据了

因此,为了测试到底哪里出了问题,把“沪深300”替换成单股票SZ000002,进行对比结果,发行,一切正常

不能理解为什么如此,请予解决谢谢


 回到顶部
帅哥哟,离线,有人找我吗?
rockyan
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:611 积分:0 威望:0 精华:0 注册:2015/9/11 9:51:55
  发帖心情 Post By:2021/3/27 22:01:19 [显示全部帖子]

# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。

#比较简单的根据市值前五买入的策略,只选取排名前5的进行轮动调仓。
#使用前注意补充好300样本股历史数据及专业财务数据
#推荐使用000001上证指数做基准合约

import time
import os
import csv
import numpy as np
import talib as ta
import math


# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    #买入的股票数
    context.num = 5
    context.code = []
   
# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
    #选取300成份样本股作为股票池
    try:
        context.code = get_blocks("沪深300样本股",1)

    except:
        pass

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新


def handle_bar(context):
    # 开始编写你的主要的算法逻辑
    try:
   
        usercode = []
        #dd = ['sz000002']
        for i in context.code:
           
            zgb80 = get_finance(i,1,3,4,0)  #总股本
            #print([zgb8[-1].values,zgb8[-2].values,zgb8[-3].values])
            #print(i)
            if len(zgb80)>2:
                usercode.append(i)
                print(111)

                zgb8 = ZGB([i],context.now.year)              
                zgb1 = zgb8[-1] #a股总股本,万股
                zgb2 = zgb8[-2]
                zgb3 = zgb8[-3]
                print(zgb8)

    except:
        pass

 

 

def ZGB(x,ye):
    main_path = "d:/jztuser/"
    if not os.path.exists(main_path):
        os.mkdir(main_path)
    yFilename = 'd:\\jztuser\\' +'year' + x[0] +  '.txt'   
    yFile = open(yFilename,'a+')
    yFile.writelines(str(ye)+"\n")
    yearlist=[]
    f=open(yFilename,'r')

    yearlist = f.readlines()
    yearlist = [int(x)for x in yearlist]
   
    zgb8 = get_finance(x[0],1,3,4,0)  #a股总股本
    if len(yearlist)>1 and len(zgb8)>0:

        if ye > yearlist[-1]:

            zFilename ='d:\\jztuser\\'+ 'zgb' + x[0]  + '.txt'
            zFile0 = open(zFilename,'a+')
            zFile0.writelines(str(zgb8[-1].values)+"\n")
            zFile = open(zFilename,'r')

            zgblist=[]
            zgblist = zFile.readlines()
            #print(zgblist0)
            zgblist = [float(y)for y in zgblist]
            #for y in zgblist0:
                #   zgblist.append(float(y))
            zgblist.append(zgb8[-1].values)   
       
    return zgblist  #返回总股本数据列表

 

 

# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
   
    pass


 回到顶部
帅哥哟,离线,有人找我吗?
rockyan
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:611 积分:0 威望:0 精华:0 注册:2015/9/11 9:51:55
  发帖心情 Post By:2021/3/27 22:05:43 [显示全部帖子]

改了红色的部分,其他不动,发行SZ000002可以正常输出数据

# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。

#比较简单的根据市值前五买入的策略,只选取排名前5的进行轮动调仓。
#使用前注意补充好300样本股历史数据及专业财务数据
#推荐使用000001上证指数做基准合约

import time
import os
import csv
import numpy as np
import talib as ta
import math


# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    #买入的股票数
    context.num = 5
    context.code = []
   
# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
    #选取300成份样本股作为股票池
    try:
        context.code = get_blocks("沪深300样本股",1)

    except:
        pass

# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context):
    # 开始编写你的主要的算法逻辑
    try:
   
        usercode = []
        dd = ['sz000002']
        for i in dd:
           
            zgb80 = get_finance(i,1,3,4,0)  #总股本
            #print([zgb8[-1].values,zgb8[-2].values,zgb8[-3].values])
            #print(i)
            if len(zgb80)>2:
                usercode.append(i)
                print(111)

                zgb8 = ZGB([i],context.now.year)              
                zgb1 = zgb8[-1] #a股总股本,万股
                zgb2 = zgb8[-2]
                zgb3 = zgb8[-3]
                print(zgb8)

    except:
        pass

def ZGB(x,ye):
    main_path = "d:/jztuser/"
    if not os.path.exists(main_path):
        os.mkdir(main_path)
    yFilename = 'd:\\jztuser\\' +'year' + x[0] +  '.txt'   
    yFile = open(yFilename,'a+')
    yFile.writelines(str(ye)+"\n")
    yearlist=[]
    f=open(yFilename,'r')

    yearlist = f.readlines()
    yearlist = [int(x)for x in yearlist]
   
    zgb8 = get_finance(x[0],1,3,4,0)  #a股总股本
    if len(yearlist)>1 and len(zgb8)>0:

        if ye > yearlist[-1]:

            zFilename ='d:\\jztuser\\'+ 'zgb' + x[0]  + '.txt'
            zFile0 = open(zFilename,'a+')
            zFile0.writelines(str(zgb8[-1].values)+"\n")
            zFile = open(zFilename,'r')

            zgblist=[]
            zgblist = zFile.readlines()
            #print(zgblist0)
            zgblist = [float(y)for y in zgblist]
            #for y in zgblist0:
                #   zgblist.append(float(y))
            zgblist.append(zgb8[-1].values)   
       
    return zgblist  #返回总股本数据列表

# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
   
    pass


 回到顶部
帅哥哟,离线,有人找我吗?
rockyan
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:611 积分:0 威望:0 精华:0 注册:2015/9/11 9:51:55
  发帖心情 Post By:2021/3/29 9:46:12 [显示全部帖子]

不知道,您测试的是2楼全部沪深300数据吗?程序是没有提示出错的,但是实际上有问题。同样是月线。

 

2楼的,跑不完循环,在sz000002,卡壳

3楼的,可以没问题

 

是考虑过,自身逻辑的问题,但是如果是自身程序逻辑问题,没办法解释为什么3楼的可以,而2楼的不可以。这怎么解释呢?

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
rockyan
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:611 积分:0 威望:0 精华:0 注册:2015/9/11 9:51:55
  发帖心情 Post By:2021/3/29 10:33:09 [显示全部帖子]

你的代码,就没有调用DEF ZGB,和我的问题没关系啊。

我的问题的实质是,写好的模块,在循环中,如果被循环的是单股票数列,调用时候没问题,在引入板块进行循环就不行,是为什么?


 回到顶部
帅哥哟,离线,有人找我吗?
rockyan
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:611 积分:0 威望:0 精华:0 注册:2015/9/11 9:51:55
  发帖心情 Post By:2021/3/29 10:34:37 [显示全部帖子]

因为贵软件,不是开源的,我无法自己分析原因,只能求教

 回到顶部