Python 量化代码_第1页
Python 量化代码_第2页
Python 量化代码_第3页
Python 量化代码_第4页
Python 量化代码_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、# coding: utf-8import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom _future_ import division# 获取数据函数def get_stock_data(stock_code, index_code, start_date, end_date): :param stock_code: 股票代码,例如sz000002 :param index_code: 指数代码,例如sh000001 :param start_date: 回测开始日期,例如1991-1-30 :param

2、 end_date: 回测结束日期,例如2015-12-31 :return: 函数返回其他函数的各参数序列 # 此处为存放csv文件的本地路径,请自行改正地址.注意windows和mac系统,斜杠的方向不一样 stock_data = pd.read_csv(rG:财通实习历史日线数据_样本%282013 2014年数据%292all_trading_datastock datash600000.csv, parse_dates=date) benchmark = pd.read_csv(rG:财通实习历史日线数据_样本%282013 2014年数据%292all_trading_datai

3、ndex datash000001.csv, parse_dates=date) date = pd.date_range(2016-01-01,2016-03-15) # 生成日期序列 # 选取在日期范围内的股票数据序列并按日期排序 stock_data = stock_data.ixstock_datadate.isin(date), date, change, adjust_price stock_data = stock_data.ixstock_datadate.isin(date), date, change, adjust_price # 选取在日期范围内的指数数据序列并按日期排

4、序 date_list = list(stock_datadate) benchmark = benchmark.ixbenchmarkdate.isin(date_list), date, change, close benchmark.sort_values(by=date, inplace=True) benchmark.set_index(date, inplace=True) # 将回测要用到的各个数据序列转成list格式 date_line = list(benchmark.index.strftime(%Y-%m-%d) # 日期序列 capital_line = list(st

5、ock_dataadjust_price) # 账户价值序列 return_line = list(stock_datachange) # 收益率序列 indexreturn_line = list(benchmarkchange) # 指数的变化率序列 index_line = list(benchmarkclose) # 指数序列 return date_line, capital_line, return_line, index_line, indexreturn_line# 计算年化收益率函数def annual_return(date_line, capital_line): :pa

6、ram date_line: 日期序列 :param capital_line: 账户价值序列 :return: 输出在回测期间的年化收益率 # 将数据序列合并成dataframe并按日期排序 df = pd.DataFrame(date: date_line, capital: capital_line) df.sort_values(by=date, inplace=True) df.reset_index(drop=True, inplace=True) rng = pd.period_range(dfdate.iloc0, dfdate.iloc-1, freq=D) # 计算年化收益

7、率 annual = pow(df.ixlen(df.index) - 1, capital / df.ix0, capital, 250 / len(rng) - 1 print 年化收益率为:%f % annual# 计算最大回撤函数def max_drawdown(date_line, capital_line): :param date_line: 日期序列 :param capital_line: 账户价值序列 :return: 输出最大回撤及开始日期和结束日期 # 将数据序列合并为一个dataframe并按日期排序 df = pd.DataFrame(date: date_line

8、, capital: capital_line) df.sort_values(by=date, inplace=True) df.reset_index(drop=True, inplace=True) dfmax2here = pd.expanding_max(dfcapital) # 计算当日之前的账户最大价值 dfdd2here = dfcapital / dfmax2here - 1 # 计算当日的回撤 # 计算最大回撤和结束时间 temp = df.sort_values(by=dd2here).iloc0date, dd2here max_dd = tempdd2here end

9、_date = tempdate # 计算开始时间 df = dfdfdate 0, rtn = 1 # 收益率大于0的记为1 df.ixdfrtn 0, up = 1 df.ixdfrtn 0, up = 0 dfup.fillna(method=ffill, inplace=True) # 根据up这一列计算到某天为止连续上涨下跌的天数 rtn_list = list(dfup) successive_up_list = num = 1 for i in range(len(rtn_list): if i = 0: successive_up_list.append(num) else:

10、if (rtn_listi = rtn_listi - 1 = 1) or (rtn_listi = rtn_listi - 1 = 0): num += 1 else: num = 1 successive_up_list.append(num) # 将计算结果赋给新的一列successive_up dfsuccessive_up = successive_up_list # 分别在上涨和下跌的两个dataframe里按照successive_up的值排序并取最大值 max_successive_up = dfdfup = 1.sort_values(by=successive_up, as

11、cending=False)successive_up.iloc0 max_successive_down = dfdfup = 0.sort_values(by=successive_up, ascending=False)successive_up.iloc0 print 最大连续上涨天数为:%d 最大连续下跌天数为:%d % (max_successive_up, max_successive_down)# 计算最大单周期涨幅和最大单周期跌幅def max_period_return(date_line, return_line): :param date_line: 日期序列 :par

12、am return_line: 账户日收益率序列 :return: 输出最大单周期涨幅和最大单周期跌幅 df = pd.DataFrame(date: date_line, rtn: return_line) # 分别计算日收益率的最大值和最小值 max_return = dfrtn.max() min_return = dfrtn.min() print 最大单周期涨幅为:%f 最大单周期跌幅为:%f % (max_return, min_return)# 计算收益波动率的函数def volatility(date_line, return_line): :param date_line:

13、日期序列 :param return_line: 账户日收益率序列 :return: 输出回测期间的收益波动率 from math import sqrt df = pd.DataFrame(date: date_line, rtn: return_line) # 计算波动率 vol = dfrtn.std() * sqrt(250) print 收益波动率为:%f % vol# 计算贝塔的函数def beta(date_line, return_line, indexreturn_line): :param date_line: 日期序列 :param return_line: 账户日收益率

14、序列 :param indexreturn_line: 指数的收益率序列 :return: 输出beta值 df = pd.DataFrame(date: date_line, rtn: return_line, benchmark_rtn: indexreturn_line) # 账户收益和基准收益的协方差除以基准收益的方差 b = dfrtn.cov(dfbenchmark_rtn) / dfbenchmark_rtn.var() print beta: %f % b# 计算alpha的函数def alpha(date_line, capital_line, index_line, ret

15、urn_line, indexreturn_line): :param date_line: 日期序列 :param capital_line: 账户价值序列 :param index_line: 指数序列 :param return_line: 账户日收益率序列 :param indexreturn_line: 指数的收益率序列 :return: 输出alpha值 # 将数据序列合并成dataframe并按日期排序 df = pd.DataFrame(date: date_line, capital: capital_line, benchmark: index_line, rtn: ret

16、urn_line, benchmark_rtn: indexreturn_line) df.sort_values(by=date, inplace=True) df.reset_index(drop=True, inplace=True) rng = pd.period_range(dfdate.iloc0, dfdate.iloc-1, freq=D) rf = 0.0284 # 无风险利率取10年期国债的到期年化收益率 annual_stock = pow(df.ixlen(df.index) - 1, capital / df.ix0, capital, 250 / len(rng)

17、- 1 # 账户年化收益 annual_index = pow(df.ixlen(df.index) - 1, benchmark / df.ix0, benchmark, 250 / len(rng) - 1 # 基准年化收益 beta = dfrtn.cov(dfbenchmark_rtn) / dfbenchmark_rtn.var() # 计算贝塔值 a = (annual_stock - rf) - beta * (annual_index - rf) # 计算alpha值 print alpha:%f % a# 计算夏普比函数def sharpe_ratio(date_line,

18、capital_line, return_line): :param date_line: 日期序列 :param capital_line: 账户价值序列 :param return_line: 账户日收益率序列 :return: 输出夏普比率 from math import sqrt # 将数据序列合并为一个dataframe并按日期排序 df = pd.DataFrame(date: date_line, capital: capital_line, rtn: return_line) df.sort_values(by=date, inplace=True) df.reset_ind

19、ex(drop=True, inplace=True) rng = pd.period_range(dfdate.iloc0, dfdate.iloc-1, freq=D) rf = 0.0284 # 无风险利率取10年期国债的到期年化收益率 # 账户年化收益 annual_stock = pow(df.ixlen(df.index) - 1, close / df.ix0, close, 250 / len(rng) - 1 # 计算收益波动率 volatility = dfrtn.std() * sqrt(250) # 计算夏普比 sharpe = (annual_stock - rf)

20、/ volatility print sharpe_ratio: %f % sharpe# 计算信息比率函数def info_ratio(date_line, return_line, indexreturn_line): :param date_line: 日期序列 :param return_line: 账户日收益率序列 :param indexreturn_line: 指数的收益率序列 :return: 输出信息比率 from math import sqrt df = pd.DataFrame(date: date_line, rtn: return_line, benchmark_r

21、tn: indexreturn_line) dfdiff = dfrtn - dfbenchmark_rtn annual_mean = dfdiff.mean() * 250 annual_std = dfdiff.std() * sqrt(250) info = annual_mean / annual_std print info_ratio: %f % info# 计算股票和基准在回测期间的累计收益率并画图def cumulative_return(date_line, return_line, indexreturn_line): :param date_line: 日期序列 :pa

22、ram return_line: 账户日收益率序列 :param indexreturn_line: 指数日收益率序列 :return: 画出股票和基准在回测期间的累计收益率的折线图 df = pd.DataFrame(date: date_line, rtn: return_line, benchmark_rtn: indexreturn_line) dfstock_cumret = (dfrtn + 1).cumprod() dfbenchmark_cumret = (dfbenchmark_rtn + 1).cumprod() # 画出股票和基准在回测期间的累计收益率的折线图 dfstock_cumret.plot(style=k-, figsize=(12, 5) dfbenchmark_cumret.plot(style=k-, figsize=(12, 5) plt.show()# 调用get_stock_data函数读取数据date_line, capital_line,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论