pythonencoding etf-8_Python 量化分析ETF指数基金投资

本文通过Python的pandas库分析ETF指数基金510500,使用tushare获取数据,设置2日线和20日线策略,验证了通过均线穿越买卖策略可能获得约29%的年回报,从而探讨指数基金投资的有效性。
摘要由CSDN通过智能技术生成

Python 量化分析ETF指数基金.

标签(空格分隔): python 量化 ETF tushare pandas

文章目录

Python 量化分析ETF指数基金.

数据获取

数据分析

在喜马拉雅上听到一个炒股高手说过一个简单的指数基金的操作方法. 设置一条均线,该均线可以是20日线,30日线,60日线.当基金价格向上穿越该线时买入,在基金价格向下跌破该线时卖出. 如此操作,一年可以获取20%左右的回报,而且风险很小. 作为一个长期的股市老韭菜,想通过编程验证一下该方法是否靠谱. 下面选择ETF指数基金510500来测试一下.顺便熟悉一下python 的pandas的操作方法.

数据获取

采用tushare来获取数据.

import pandas as pd

import numpy as np

import tushare as ts

import seaborn

from matplotlib import pyplot as plt

import talib

plt.style.use('seaborn')

%matplotlib inline

with open('token.txt') as f:

token = f.readline()

ts.set_token(token)

tushare的最新版本,tushare pro需要注册用户,并设置token来连接. 通过pro.fund_daily来获取510500从2015年到现在的所有数据,返回的结果是一个pandas dataframe.

pro = ts.pro_api()

df = pro.fund_daily(ts_code='510500.SH', start_date='20150101', end_date='20191010')

数据分析

使用df.head()查看以下数据头,输出如下:

print(df.shape[0],df.shape[1]) #计算行数和列数

1000 11

tushare似乎一次最多只能获取1000条数据。如果想获取更长的数据,就需要多次调用pro.fund_daily然后再进行dataframe的合并。另外取出来的数据的时间是倒序的。数据信息量挺多,包含了开盘价,收盘价,最高价,最低价,成交量等数据.

etf500 = df.sort_values(by='trade_date')

etf500['trade_date'] = pd.to_datetime(etf500['trade_date'],format='%Y%m%d')

etf500.head()

按照时间排序,并把’trade_date’转为日期格式.

将trade_date 设置为索引.

etf500.set_index('trade_date',inplace=True)

etf500.head()

通过dataframe的describe()方法,大概了解一下数据.

etf500.describe()

从输出结果中看到,etf500的最高涨跌幅度为+/-8%左右.那对我们是一个好消息,至少没有涨停和跌停导致无法交易的时候.

print(etf500['close'].min(),etf500['close'].idxmin())

4.297 2018-10-18 00:00:00

获取一下最低收盘价的价格和日期.

print(etf500['close'].min(),etf500['close'].idxmin())

8.167 2015-11-25 00:00:00

获取一下最高收盘价的价格和日期,大家还记得2015年大牛市,大家爆炒中小盘股的情形吧 .

etf500[etf500['amount'].idxmin():etf500['amount'].idxmin()]

获取一下成交量最低的情况.这个应该是2016年1月"股灾3.0"时期的熔断股灾,成交量只有2000多万.

closed = etf500[['close']]

closed.plot()

获取收盘价,并画出图形.

closed['MA2'] = talib.SMA(closed.close,timeperiod=2)

closed['MA20']=talib.SMA(closed.close,timeperiod=20)

增加两列,分别是用talib计算2日和20日均线.

closed.plot(figsize=(20,5))

plt.title("STOCK:510500", weight='bold');

closed['pct_chg']=closed.close.pct_change()

pct_chang()计算出每天变化的百分比.

closed['pct_chg'].plot(figsize=(30,5))

每日收益变化曲线.

closed.loc[np.abs(closed['pct_chg']) >0.065 ] #算出收益率变化最大的几天

看看涨跌最大的几天,估计这些日子在老韭菜的心里是刻骨铭心的.

fig,axes = plt.subplots(1,2,figsize=(15,5))

axes[0].hist(closed['pct_chg'].dropna(),color='g',bins=50)

axes[1].hist(closed['close'].dropna())

看看收益率和收盘价的柱状图. 收益率基本在0%的位置成正态分布.

closed['log_ret'] = np.log(closed.close/closed.close.shift(1)) #计算对数收益率

closed['log_ret'].plot(figsize=(30,5),color='r') #输出对数收益率

cumulative_rets = closed.log_ret.cumsum().values #对数收益率进行累计求和,可以计算出从开始到每个时间点的收益率

plt.figure(figsize=(30, 5))

plt.plot(cumulative_rets)

diff_ma2_ma20 = closed.MA2-closed.MA20

closed['hold'] = np.where(closed.MA2 >closed.MA20,closed.MA2,None) #这里把赋值为None,下面画图好看一点

closed[['MA2','MA20','hold']].plot(figsize=(30,5))

plt.title("STOCK:510500", weight='bold'); #红色的线表示持股的时间

图中红色部分就是2日平均线高于20日均线的时间.

stragy_ret = np.where(closed.hold >0,closed.log_ret, 0)

stragy_ret= stragy_ret.cumsum()

plt.figure(figsize=(30, 5))

plt.plot(stragy_ret)

plt.plot(cumulative_rets)

我们的策略是当2日均线站上20均线后持有.跌破20日均线后卖出.上图就是使用我们的策略和一开始就持有的收益的对比.

print("strage= {},hold ={}".format(np.exp(stragy_ret[-1]),np.exp(cumulative_rets[-1])))

strage= 2.7722754256654154,hold =0.8373846153846146

就是一下使用策略的收益和一开始就持有的收益.使用策略的收益是270%, 而一开始就买入持有到今天只有83%的市值了.

closed.close[-1]/closed.close[0]

0.8373846153846153

确定一下计算结果是否正确?可见如果从2015年9月1日买入510500,并持有到2019年10月,是亏本.

year_ret = np.exp(stragy_ret[-1]/4)

year_ret

1.290354657748639#每年的回报是29%,相当牛逼了?

如果采用均线穿越的方法,能够实现29%的年回报.这个收益率已经能够打败巴菲特了!!!.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值