最近写股票投资策略的大作业写到头疼。
PS:我的学校只是把编程作为必修,但是我不是计算机系的,之前也没有编程底子。所以写起来大作业感觉很艰难。
以下是的作业要求的策略一:
(先前会获得一个csv文件,其中包括了时间倒序排列的股票收盘价,按照下文进行m,n的找寻。进行测试时,使用的是含有56条数据的格力电器近期股票,再次就认为是一个)
策略1:规定在第x天,从x-m+1到x天的收盘价的平均值为mx;在第y天,从第y-n+1到第y天的收盘价的平均值为ny。当mx-1-mx-20,也就是x-1天的m天平均值小于x-2天的m天平均值,而第x天的m天平均值大于x-1天的m天平均值,则按第x+1天的收盘价买入股票;之后,如果存在一个y>x,有ny-1-ny-2>0且 ny-ny-1<0时,按第y+1天的收盘价卖出股票。然后再向后找买入点、卖出点,直到文件记录结束。
规定初始金额10000元,股票数为0。每次都进行全额买卖,假设股票数量也可以是小数。
例如在m=2,n=3的条件下,2020/3/05符合第m天的条件,则在2020/3/06以18.25元买入,购入10000/ 18.25=547.9452股,接下来,以2020/3/06这一天开始,由于这一天符合第n天的条件,则以2020/3/09的收盘价卖出,547.9452*17.54=9610.959。接下来,从2020/3/09开始,找到符合m的日期2020/3/20,但之后找不到符合条件的y,则不再做交易,完成本次模拟。即买卖必需成对完成,每一次的买,要找到后续与之配对的卖,否则不进行交易。
如果有股票停牌,在文件中是以0表示收盘价,则忽略这一天。
只考虑交易日,不考虑非交易日(例如周末,节假日等文件中没有记录的时间)。
要求试探所有可能的m和n,找到最终剩余金额最大的m和n的组合,用上述网站上的实际数据测试你的程序。
下面是我的代码
import csv
content = []
contents = []
#读取表格
with open('C:\\Users\\86139\\Desktop\\课程作业、文件 大纲\\2019-2020大一\\大一下学期\\python\\大作业\\测试文件\\000651short.csv','r') as f:
row = csv.reader(f,delimiter = ',')
next(row)
for i in row:
content.append(i[3])#存储的是收盘价
f.close()
for i in content:
if eval(i) >0:
contents.append(eval(i))#将字符串转为数字
contents = contents[::-1]#时间顺序排列
#策略一
L = len(contents)#天数的最大值
mairu1 = []
maichu1 = []
maichu = []
for n in range(1,L):
for m in range(1,L):
benqian = 10000#本钱定为10000元
# 时间的第一个标记点
x = m + 1
while x < L-1:
x = x+1 #仍然存在问题的想法
# 边界确定的标准是不让所有的索引超出边界
if sum(contents[x-m-1:x-2]) > sum(contents[x-m:x-1]) < sum(contents[x-m+1:x]):
gupiaoshu = benqian / contents[x+!]
mairu1.append([m,n, benqian])
# 时间的第二个节点,以规定y的取值下界
for y in range(x + 1, L):
if sum(contents[y-n-2:y-3]) < sum(contents[y-n-1:y-2]) > sum(contents[y-n:y-1]) :
benqian = gupiaoshu * contents[y]
maichu1.append([m, n, benqian])
x = y + 1
# 把第一个节点的赋值刷新,这样可以使得x的下界换为卖出点的后一天
break
while len(mairu1) > len(maichu1):
mairu1 = mairu1[0:-1]
while len(mairu1) < len(maichu1):
maichu1 = maichu1[0:-1]
maichu.append(maichu1[-1])
zhi = []
for i in maichu:
zhi.append(i[2])
zuidazhi = max(zhi)
for i in maichu:
if zuidazhi == i[2]:
print('m=%d,n=%d,现有资金=%d'%tuple(i))
我的问题是,虽然按照答案给出的可以获得最多钱的m,n的结果运算,获得的钱款是正确的,但是仍然可以找到另外多组的m,n,使得钱款更多,对其他可以获得更多钱款的数据的debug运行看起来也没啥问题,但是后来我认为,边界的界定可能有疏漏,只是我真的不知道哪里有错误了qwq希望大佬帮忙qwq今天ddl了。