以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  高级功能研发区  (http://222.73.7.161/bbs/list.asp?boardid=5)
----  For 循环中,出现不同的结果  (http://222.73.7.161/bbs/dispbbs.asp?boardid=5&id=184919)

--  作者:rockyan
--  发布时间:2021/3/27 21:59:13
--  For 循环中,出现不同的结果

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

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

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

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

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

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

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

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


--  作者:rockyan
--  发布时间: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
--  发布时间: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


--  作者:yukizzc
--  发布时间:2021/3/28 10:09:44
--  

# 可以自己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):
    # 开始编写你的主要的算法逻辑
    if 1:
        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 i==\'SZ000002\' and len(zgb80)>2:          
                zgb1 = zgb80[-1].values #a股总股本,万股
                zgb2 = zgb80[-2].values
                zgb3 = zgb80[-3].values
                print((context.now.year,i,zgb1,zgb2,zgb3))

 

 


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


--  作者:yukizzc
--  发布时间:2021/3/28 10:13:59
--  

 

用的月线测试的结果,可以看到是没问题的,你这个问题感觉可能和你逻辑处理上有关,这个可能需要您自己去处理了,这边工作人员没帮扶帮您理清你自己代码逻辑的

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:a.txt


--  作者:rockyan
--  发布时间:2021/3/29 9:46:12
--  

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

 

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

3楼的,可以没问题

 

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

 

 


--  作者:yukizzc
--  发布时间:2021/3/29 9:47:21
--  

你看我上面代码啊,只是改了你自己走def的过程,另外就是在00002时候判断

 


--  作者:rockyan
--  发布时间:2021/3/29 10:33:09
--  

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

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


--  作者:yukizzc
--  发布时间:2021/3/29 10:34:00
--  
021-20339087
--  作者:rockyan
--  发布时间:2021/3/29 10:34:37
--  
因为贵软件,不是开源的,我无法自己分析原因,只能求教