本程序仅为个人学习测试使用,不做商业用途,据此操作,后果自负
主要的策略就是通过计算涨幅和平均值来判断买入与卖出的时机。
因为我自己本身对股票了解不多,所以我写的东西要为其他策略可能还是会有点困难的。
框架解释
- 获取数据
用爬虫等相关操作获取到数据,并保存到本地,以避免重复爬取浪费时间与性能 - 将本地的数据导入我们的程序
- 通过保存的数据计算涨幅,并获取涨幅最大的股票
- 计算某段时间内的平均价格
- 实行买卖的判断
- 买操作
- 卖操作
- 画图,实现数据可视化
代码实现
做最开始的初始化
1. 输入参数的初始化
- codes
传入所需要分析的代码
列表格式,建议在定义对象之前就写好这个列表
默认是空,也就是 “[]” - in_date
数据分析最开始的日期
默认是2014-01-01
这个日期在后续的计算中会一直后推,直到等于time - time
数据分析的截止日期
默认是系统现在的日期,而且要格式化为“年-月-日” - time_span_inc
用于分析涨幅
默认13,即求13天内的涨幅 - time_span_avg
用于分析平均价格
默认13,即求13天内的平均价格 - funds
是你手上现有的资金
默认为10w - path
传入保存地址
2. 全局变量的初始化
- self.df = None
保存从本地文件中获取的数据 - self.the_code = {“code”: None, “price”: None}
保存你手上持有的股票和买入的价格
在后续中可以改为列表,然后再添加一个字典属性:持有量 - self.change = {“funds”: [], “date”: []}
获取所持有资金的变化数据,为后面 数据可视化做准备
3.示例
def __init__(self, codes=[], in_date="2014-01-01", time=time.strftime('%Y-%m-%d', time.localtime(time.time())),
time_span_inc=13, time_span_avg=13, funds=100000, path="D:/"):
self.codes = codes # 所需要获取的股票
self.in_date = in_date # 数据处理开始日期
self.time = time # 数据处理结束日期
self.time_span_inc = time_span_inc # 涨幅跨度
self.time_span_avg = time_span_avg # 平均值跨度
self.funds = funds # 现有资金
self.path = path # 获取股票数据保存的地址
self.df = None
self.the_code = {
"code": None, "price": None}
self.change = {
"funds": [], "date": []}
在互联网上获取数据
因为爬取的方法很多很多,我只用了最简单的方法
主要是通过循环获取传入的股票代码的相关信息,并格式化保存到本地
这个方法是只需要运行一次,把数据保存下来以后可以重复使用,方便改数据调整方案。
示例
- 获取的初步结果,所有相关数据都有,但是我们只要收盘的数据
- 筛选并保存数据
首先将“Close”这一列的标签索引重命名,然后只把这一列保存下来
这个就是保存的格式
在个别电脑上会出现只保留后面的数据,而不保存表头的情况,建议在保存到本地之后检查一下格式是否和下面是否相同
- 相关代码
# 获取相关数据
def get_all_data(self):
# 获取数据的时间段-结束时间
end = datetime.date.today()
for code in self.codes:
# 这个方法是pandas_datareader.data里面自带的,通过传入股票代码可以在相关网站获取对应数据
stock = web.DataReader(code, "yahoo", self.in_date, end)
# 将“Close”重命名为对应的code
stock.rename(columns={
"Close": code}, inplace=True)
stock[code].to_csv(self.path + code + ".csv") # 保存到本地
获取本地的数据
将本地的数据获取到目前的程序里面来
# 获取Excel中数据,并存到data列表中
def get_data(self):
# 直接将self.df初始化为第一支股票对应的数据,后面的数据只需要在这个基础上列相加就好了
self.df = pd.read_csv(self.path + self.codes[0] + ".csv")
# 通过循环获取所有的数据
for code in self.codes[1:]:
# 获取csv文件
df = pd.read_csv(self.path + code + ".csv")
# 数据合并
self.df = pd.merge(self.df, df, left_on="Date", right_on="Date", how="outer")
# 将索引设置为date
self.df.set_index('Date', inplace=True)
获取某一天之前n天前的数据
这里的n是前面初始化的时候定义的time_span_inc与time_span_avg中更大的那个,为了在后续的处理中可以有充足的数据
获取的方法最好用切片,效率高也看起来方便,但是我的返回值时用的numpy,后面的操作基本上是根据numpy来的,所以懒得改了
# 获取那n天的数据,格式是numpy
def get_n_day(self, in_data):
try:
# 获取输入那天的位置索引
position_index = self.df.index.get_loc(in_data)
# 如果位置索引小于计算所需要的数字,那么说明数据量不够,
if position_index>=max(self.time_span_avg, self.time_span_inc):
# 用于保存每支股票的数据
code_list = []
for code in range(len(self.codes)):
# 用于保存当前股票的数据
i_list = []
for i in range(max(self.time_span_avg, self.time_span_inc)):
# 获取数据
i_list.append(self.df.iloc[position_index - i - 1, code])
code_list.append(i_list)
# 这个地方应该要用切片来获取数据的,这么改虽然麻烦但是看得懂啊(其实就是懒得改了)
return np.array(code_list)
# 数据量不够,不能带入进行计算
else:
return np.array([0])
except Exception as e:
print("获取"+in_data+"的近日数据失败&#x