为了计算年末各股票的总市值,所以必须计算出年末的总股本,因此写了一个模块来解决这个问题
在个股运行的时候,测试下来都没有问题
但在循环中,如希望一次性计算所有沪深300股票的个股总股本时,出现了问题
源码,如1楼,原来定义的def ZGB()是放在我的模块里,单独开来的,在这里为了方便,合并进策略里
回测的时候,需要注意每次把生成的TXT文件删除,以免第二次回测时出错,即可
1楼运行的结果,在SZ000002时,出现问题,只有两年的数据,然后,后面就没有数据了
因此,为了测试到底哪里出了问题,把“沪深300”替换成单股票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 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
改了红色的部分,其他不动,发行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
# 可以自己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
用的月线测试的结果,可以看到是没问题的,你这个问题感觉可能和你逻辑处理上有关,这个可能需要您自己去处理了,这边工作人员没帮扶帮您理清你自己代码逻辑的
下载信息 [文件大小: 下载次数: ] | |
点击浏览该文件:a.txt |
不知道,您测试的是2楼全部沪深300数据吗?程序是没有提示出错的,但是实际上有问题。同样是月线。
2楼的,跑不完循环,在sz000002,卡壳
3楼的,可以没问题
是考虑过,自身逻辑的问题,但是如果是自身程序逻辑问题,没办法解释为什么3楼的可以,而2楼的不可以。这怎么解释呢?
你看我上面代码啊,只是改了你自己走def的过程,另外就是在00002时候判断
你的代码,就没有调用DEF ZGB,和我的问题没关系啊。
我的问题的实质是,写好的模块,在循环中,如果被循环的是单股票数列,调用时候没问题,在引入板块进行循环就不行,是为什么?