指标要求:
• 按周定投(每周四定投1手股票,股票当日收盘价*100)
• 投入周期:2019/01/01 - 2019/12/31 回测计算指标
• 投入本金
• 期末总资产(注意:期末资产按今天之前的最后一个交易日的价格计算)
• 期末总收益
• 定投收益率
• 最大回撤率
• 每日收益率曲线(注意:只计算投资期间的每日收益率)
注:最大回撤计算方法
returns = [1, 1.01, 1.02, 0.98, 1.0, 0.97]
max_draw_down = 0 # 最大回撤率
temp_max_value = 0 # 临时最大值
for i in range(1, len(returns)):
temp_max_value = max(temp_max_value, returns[i-1])
max_draw_down = min(max_draw_down, returns[i]/temp_max_value-1)
print(str(max_draw_down))
程序代码:
import requests
import re
from datetime import datetime
def web_crawler():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
data = {
'curr_id': '944897',
'smlID': '1562375',
'header': '000858历史数据',
'st_date': '2019/01/01',
'end_date': '2019/12/31',
'interval_sec': 'Daily',
'sort_col': 'date',
'sort_ord': 'DESC',
'action': 'historical_data',
}
url = 'https://cn.investing.com/instruments/HistoricalDataAjax'
resp = requests.post(url, data=data, headers=headers)
return resp.text
def deal_data(data):
result_date = re.findall('bold noWrap">(\d+)年(\d+)月(\d+)日<', data)
result_start = re.findall('"\w+Font".*?</td>.*?>(.*?)<', data, re.DOTALL)
result_end = re.findall('"\w+Font">(.*?)<', data)
result_date = result_date[::-1]
result_start = result_start[::-1]
result_end = result_end[::-1]
result_date = date_format(result_date)
return [result_date, result_start, result_end]
def date_format(date):
date_list = []
for i in range(len(date)):
date_item = date[i][0]
for j in range(1, 3):
if len(date[i][j]) == 1:
date_item = date_item + '0' + date[i][j]
else:
date_item = date_item + date[i][j]
week_index = datetime.strptime(date_item, "%Y%m%d").weekday()
date_list.append(week_index+1)
return date_list
count = 0
end_price = 0
def get_capital(data):
capital = 0
for i in range(len(data[0])):
if data[0][i] == 4:
capital += float(data[2][i])*100
global count
count += 1
global end_price
end_price = float(data[2][-2])
# print(end_price)
return capital
def get_end_total():
global count
global end_price
return (end_price * 100) * count
def get_end_income(capital, end_fund):
return end_fund - capital
def get_income_rate(capital, income):
return income/capital
def get_max_return_rate(data):
sample = []
num_count = 0
for idx in range(1, len(data[0])):
if data[0][idx] == 4:
num_count += 1
t = float(data[2][idx]) * 100 * num_count
sample.append(t)
else:
t = float(data[2][idx]) * 100 * num_count
sample.append(t)
max_draw_down = 0
temp_max_value = 0
for i in range(1, len(sample)):
temp_max_value = max(temp_max_value, sample[i-1])
max_draw_down = min(max_draw_down, sample[i]/temp_max_value - 1)
return max_draw_down
def get_day_income_rate(data):
day_income_rate = []
self_money = 0
num_count = 0
for idx in range(1, len(data[0])):
if data[0][idx] == 4:
self_money += float(data[2][idx]) * 100
num_count += 1
t = float(data[2][idx]) * 100 * num_count
day_income_rate.append((t-self_money)/self_money)
return day_income_rate
crawl_data = web_crawler()
data_list = deal_data(crawl_data)
my_capital = get_capital(data_list)
my_end_fund = get_end_total()
my_end_income = get_end_income(my_capital, my_end_fund)
my_income_rate = get_income_rate(my_capital, my_end_income)
print("一共投入本金:{}".format(my_capital))
print("期末总资产:{}".format(my_end_fund))
print("期末总收益:{}".format(my_end_income))
print("定投收益率:{}%".format(my_income_rate*100))
max_draw_rate = get_max_return_rate(data_list)
print("最大回撤率:{}%".format(max_draw_rate * 100))
day_income_ratio = get_day_income_rate(data_list)
date_data = re.findall('bold noWrap">(.*?)<', crawl_data)
date_data = date_data[::-1]
print("每日收益率:")
for idx in range(1, len(date_data)):
print(date_data[idx], end=':')
print("{:.4f}%".format(day_income_ratio[idx-1]*100))
运行结果:
一共投入本金:526796.0
期末总资产:650818.0
期末总收益:124022.0
定投收益率:23.54269964084769%
最大回撤率:-10.003907776475184%
每日收益率:
2019年1月3日:0.0000%
2019年1月4日:1.1846%
2019年1月7日:0.7149%
2019年1月8日:0.1225%
2019年1月9日:2.1855%
2019年1月10日:0.9107%
2019年1月11日:2.5906%
2019年1月14日:0.3643%
2019年1月15日:7.2050%
2019年1月16日:5.6466%
2019年1月17日:3.3302%
2019年1月18日:7.2310%
2019年1月21日:11.4502%
2019年1月22日:9.8779%
2019年1月23日:9.5993%
2019年1月24日:7.2157%
2019年1月25日:7.3128%
2019年1月28日:11.6247%
2019年1月29日:13.7807%
2019年1月30日:11.2557%
2019年1月31日:13.2437%
......