python训练——简单股票数据分析

本程序仅为个人学习测试使用,不做商业用途,据此操作,后果自负
主要的策略就是通过计算涨幅和平均值来判断买入与卖出的时机。
因为我自己本身对股票了解不多,所以我写的东西要为其他策略可能还是会有点困难的。

框架解释

  1. 获取数据
    用爬虫等相关操作获取到数据,并保存到本地,以避免重复爬取浪费时间与性能
  2. 将本地的数据导入我们的程序
  3. 通过保存的数据计算涨幅,并获取涨幅最大的股票
  4. 计算某段时间内的平均价格
  5. 实行买卖的判断
  6. 买操作
  7. 卖操作
  8. 画图,实现数据可视化

代码实现

做最开始的初始化
1. 输入参数的初始化
  1. codes
    传入所需要分析的代码
    列表格式,建议在定义对象之前就写好这个列表
    默认是空,也就是 “[]”
  2. in_date
    数据分析最开始的日期
    默认是2014-01-01
    这个日期在后续的计算中会一直后推,直到等于time
  3. time
    数据分析的截止日期
    默认是系统现在的日期,而且要格式化为“年-月-日”
  4. time_span_inc
    用于分析涨幅
    默认13,即求13天内的涨幅
  5. time_span_avg
    用于分析平均价格
    默认13,即求13天内的平均价格
  6. funds
    是你手上现有的资金
    默认为10w
  7. path
    传入保存地址
2. 全局变量的初始化
  1. self.df = None
    保存从本地文件中获取的数据
  2. self.the_code = {“code”: None, “price”: None}
    保存你手上持有的股票和买入的价格
    在后续中可以改为列表,然后再添加一个字典属性:持有量
  3. 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": []}
在互联网上获取数据

因为爬取的方法很多很多,我只用了最简单的方法
主要是通过循环获取传入的股票代码的相关信息,并格式化保存到本地
这个方法是只需要运行一次,把数据保存下来以后可以重复使用,方便改数据调整方案。

示例
  1. 获取的初步结果,所有相关数据都有,但是我们只要收盘的数据
    在这里插入图片描述
  2. 筛选并保存数据
    首先将“Close”这一列的标签索引重命名,然后只把这一列保存下来
    这个就是保存的格式
    在个别电脑上会出现只保留后面的数据,而不保存表头的情况,建议在保存到本地之后检查一下格式是否和下面是否相同
    在这里插入图片描述
  3. 相关代码
    # 获取相关数据
    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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值