《Python量化代码(最新整理)》由会员分享,可在线阅读,更多相关《Python量化代码(最新整理)(9页珍藏版)》请在金锄头文库上搜索。
1、# coding: utf-8import numpy as np import pandas as pdimport matplotlib.pyplot as plt from futureimport 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 end
2、_date: 回测结束日期,例如2015-12-31:return: 函数返回其他函数的各参数序列# 此处为存放 csv 文件的本地路径,请自行改正地址.注意 windows 和 mac 系统,斜杠的方向不一样stock_data=pd.read_csv(rG:财通实习历史日线数据_样本%2820132014 年数据% 292all_trading_datastock datash600000.csv, parse_dates=date)benchmark=pd.read_csv(rG:财通实习历史日线数据_样本%2820132014 年数据% 292all_trading_dataindex
3、 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# 选取在日期范围内的指数数据序列并按日期排序date_lis
4、t = 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(stock_dataadjust
5、_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): :param date_line: 日期序列:pa
6、ram 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) # 计算年化收益率annual = pow(df.ixlen(df
7、.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, capital: capital_line) df.
8、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 = tempdd2hereend_date = tempdate# 计算开始时间df = dfdfda
9、te 0, rtn = 1# 收 益 率 大 于 0 的 记 为 1 df.ixdfrtn 0, up = 1df.ixdfrtn 0, up = 0 dfup.fillna(method=ffill, inplace=True)# 根据 up 这一列计算到某天为止连续上涨下跌的天数rtn_list = list(dfup)successive_up_list = num = 1for i in range(len(rtn_list): if i = 0:successive_up_list.append(num)else:if (rtn_listi = rtn_listi - 1 = 1)
10、or (rtn_listi = rtn_listi - 1 = 0): num += 1else:num = 1successive_up_list.append(num)# 将计算结果赋给新的一列successive_up dfsuccessive_up = successive_up_list# 分别在上涨和下跌的两个 dataframe 里按照successive_up的值排序并取最大值max_successive_up=dfdfup=1.sort_values(by=successive_up,ascending=False)successive_up.iloc0max_success
11、ive_down=dfdfup=0.sort_values(by=successive_up, ascending=False)successive_up.iloc0print 最大连续上涨天数为:%d最大连续下跌天数为:%d % (max_successive_up,max_successive_down)# 计算最大单周期涨幅和最大单周期跌幅def max_period_return(date_line, return_line): :param date_line: 日期序列:param return_line: 账户日收益率序列:return: 输出最大单周期涨幅和最大单周期跌幅df = pd.D