Python大数据分析10:案例-买卖股票能赚多少钱?

这次我们准备结合一个股票数据集合来检验下我们这段时间学习的数据分析方法。

我们首先需要的是一个股票数据集合,在互联网上有很多不错的股票数据获取方法,这里我们使用的是Tushare,它是一个免费开源的Python财经数据接口包,其中就包括了个股历史交易数据。

那么该如何使用呢?方法是一样的,就像以前使用Pandas一样,我们首先需要加载Tushare库,方法仍然是在文件菜单中选择设置,在打开的界面中,选择当前项目的项目解释器,点击右上角的加号,添加新的外来库。输入tushare查询,并点击左下角的安装包按钮,即可安装使用。如果期间有问题,不妨多试几次即可。

安装好后以后,就以首先测试下是否能正常使用。方法很简单:

import tushare as ts

frame = ts.get_k_data(‘600339′, start=’2010-01-01’)

print(frame)

这里的第一行仍然是导入库,并起个别名为ts。然后通过调用它的get_k_data方法就以得到指定股票在指定时间范围内的行情信息。这里的k是指k线图的意思,就是股票行情的意思。这里我们选择了600339代码的股票,时间从2010年初开始。该方法很好用,直接返回一个DataFrame,因此可以直接输入查看。此时应该可以看到完整的结果。

一般的股票行情数据包括四个重要数值,分别是开盘价、收盘价、最高价、最低价,这里还有交易量。

我们不妨对前段时间学习的内容做些练习。

比如查询收盘价大于11元的所有交易记录。这是一种行的选择,我们可以表达为:

print(frame[frame[‘close’] > 11])

这个条件很简单,就是直接比较close收盘价字段即可。

那么我们很关注股票是否盈利,因此我们更为常见的查询是查询收盘价是否大于开盘价,也就是股票价格在上涨。刚才是和11比,这里只需和开盘价比较即可:

print(frame[frame[‘close’] > frame[frame[‘open’]])

大家看到错误了吗?这是一个初学者写的代码,大家能看出哪里出问题了吗?

错误有很多种,这种错误其实比较简单,是一种语法错误,也就是说,在形式上就肯定错了,通常PyCharm会提示你,这是语法错误(invalid syntax)。你会注意到一个红色的波浪线,那就是错误的位置。不过,要想看清是什么错误,并不容易。一般而言,这里是结束括号的地方,可能是括号不对应。

这里有一个简单的方法。不妨利用鼠标点击错误前面的方括号,它会对等提示前面对应的括号,没有问题。我们再往后移一个方括号,对等提示的前面对应括号,也没有问题。我们再往后移到最后一个圆括号,对等提示的前面对应圆括号,似乎没有问题。但是你仔细看看,当我们选中条件所在的起始方括号时,发现少了个表达条件的对应的结束方括号。利用这种方法可以有效的定位括号的匹配错误。

print(frame[frame[‘close’] > frame[frame[‘open’]]])

于是我们增加了结束方括号,那么仍然还是有错误。很多数据分析就是这样不断的在错误中积累经验,大家遇到问题时,也千万不要随意抛弃和立刻询问别人,找错的能力本身就是一种必需的能力,也只有不断的自己排查错误才能越找越快。

根据错误信息,这次不是语法错误了,而是语句书写错误,我们不妨使用空格区分下:

print(frame[   frame[‘close’]   >   frame[frame[‘open’]]   ])

大家看出问题了吗?你会发现其实我们画蛇添足,在条件比较的第二个列表示中多了一个Frame,这种错误很隐蔽,但是根本上还是需要大家熟悉功能和相应的表达方式。

于是,我们得到了最终正确的写法:

print(frame[frame[‘close’] > frame[‘open’]])

千呼万唤始出来,我们终于看到了结果。这些方法不论功能如何,其实都是数据选择,而且只是行的选择,我们所需要做的就是提供一种条件,让满足条件的行出现即可。

我们发现这些天的行情中,确实是每天都在涨,如果每天都在开盘买进100股票,然后收盘再卖出100股,由于股票买卖当天不能买进即卖出,我们可以假设你一开始就已经持有100股。那么能赚多少钱呢?

这个数据分析其实表现为要对收盘价和开盘价进行一种相减的运算,我前面也介绍过,你怎么想,就怎么做,那么我就直接将两个列减一下:

print(frame[‘close’] – frame[‘open’])

这种写法没有问题,细心的同学会注意到,怎么会有负数?因为这里我们并没有限定条件,是所有交易日的收盘价减去开盘价。即使如此,我们好像还很难看出来最终结果。

我们大胆的使用一种汇总求和的方法。

print((frame[‘close’] – frame[‘open’]).sum())

这其实是指对刚才所有输出的结果列进行汇总,sum为求和,居然真的算出来了,当然只有24元。可见每天随时买卖肯定意义不大。但是这是不对的!别忘了,这只是买卖1单位股票的交易情况,事实上,股市最少也要100股才能买卖,因此还需乘以100:

print((frame[‘close’] – frame[‘open’]).sum() * 100)

那就乘呗,还不错,即使每天买卖,还能赚2400元多。

那么假设我们知道哪些天能涨,只在那些天买卖100股,看看能赚多少钱呢?

这里的关键是要在前面我们选择后的数据上在进行计算和汇总,为此,我们采用了保存上次选择后的数据,然后再进行计算汇总:

newFrame = frame[frame[‘close’] > frame[‘open’]]

print(newFrame[‘close’] – newFrame[‘open’])

结果都是正数。

这里大家也请注意变量名称命名的方法,一般不要顺意使用frame1、frame2之类的方法,那些名称不能很好的表达真实的含义。现在的名称很清楚,如果有两个单词,一般习惯把第二个单词大写开头,第一个还是小写,这是一种常见的写法。

我们再汇总下:

print((newFrame[‘close’] – newFrame[‘open’]).sum()*100)

这次结果不错,即使只有100股,还是能赚一万六千多元。

可能有同学会说,看来股市只要坚持买卖一定能赚钱啊?千万不能这样想,因为股票交易本身还需要手续费,常见的规则是印花税占交易总额的千分之一,佣金5元,过户费1元,这笔开支如果每天都买卖的话,我们来看看会怎么样?建议大家自己想一想,再看看这里的答案:

这是每天买卖100股的成本:

print(((frame[‘close’] – frame[‘open’]) * 100 * 0.001 + 6).sum())

居然是一万四千多,虽然只能赚2400多。

不过,如果我们要是能知道哪天能涨的话:

newFrame = frame[frame[‘close’] > frame[‘open’]]

print(((newFrame[‘close’] – newFrame[‘open’]) * 100 * 0.001 + 6).sum())

这次我们需要花费七千三百多,相对于一万六千多元的盈利,我们最终还是赚了三千元左右。大家觉得可能吗?很简单,除非你知道每天一定是涨还是跌,我们想想还是老老实实去学Python大数据分析吧!

这个练习很有意思,希望大家多结合自己的专业和工作内容,有选择的针对自己的问题,尝试着利用Python数据分析方法来解决。

发表评论

邮箱地址不会被公开。 必填项已用*标注