Python基础学习:股票爬虫练习

指标要求:

• 按周定投(每周四定投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%
......

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值