zoukankan      html  css  js  c++  java
  • day04 股票分析器

    股票数据地址:https://cn.investing.com/equities/moutai-historical-data

    一.需要计算的

     最大回撤率:亏损比率,评估风险

     

     

    字符串转化为时间:

    pendulum库(字符串转时间,换算成周几)

    实现代码:

    import requests
    import re
    from datetime import datetime
    import pendulum
    #获取投入时的价格
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
    ,'X-Requested-With': 'XMLHttpRequest'#必须加这个,用来区分这是ajax请求还是普通请求,恰好这个是ajax请求
    }
    data={
    'curr_id': '100673'
    ,'smlID': '1437916'
    ,'header': '600519历史数据'
    ,'st_date': '2019/01/01'
    ,'end_date': '2019/12/31'
    ,'interval_sec': 'Daily'
    ,'sort_col': 'date'
    ,'sort_ord': 'DESC'
    ,'action': 'historical_data'
    }
    
    reqs=requests.post('https://cn.investing.com/instruments/HistoricalDataAjax',headers=headers,data=data)
    day=re.findall('class="first left bold noWrap">(.*?)年(.*?)月(.*?)日</td>',reqs.text,re.S)
    final_price=re.findall('class="first left bold noWrap">.*?class=".*?">(.*?)</td>',reqs.text,re.S)
    # print(day)
    # print(final_price)
    s=''
    capital=0#本金
    now_price=0#今日价格
    buy_count=0#购买次数
    price_list=[]
    day_list=[]
    max_draw_down=0
    temp_max_value=0
    for item in day:
        # print(item)
        for temp in item:
                if(len(temp)==1):
                    temp='0'+temp#如果是1月1日开始为11,这里转变为0101
                s=s+temp
        temp_index=day.index(item)
        #有了下标就可以获取当前下标下的价格
        #获取数据中1680.0为1,680.0因此应该去掉逗号
        now_price=re.sub(',','',final_price[temp_index],1)
        day_list.append(s)
        # print(s)
        week = datetime(int(s[0:4]), int(s[4:6]), int(s[6:8])).weekday() + 1
        '''
        判断周四的另一种方法:
        dt=pendulum.parse(item)
        if dt.say_of_week==4    
        '''
        if(week==4):#投入本金,每周四购买
             capital=capital+100*float(now_price)
             buy_count=buy_count+1
        s=''
    day_list.reverse()
    #获取现在的股价
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
    ,'X-Requested-With': 'XMLHttpRequest'#必须加这个,用来区分这是ajax请求还是普通请求,恰好这个是ajax请求
    }
    data={
    'curr_id': '100673'
    ,'smlID': '1437916'
    ,'header': '600519历史数据'
    ,'st_date': '2020/04/10'
    ,'end_date': '2020/04/10'
    ,'interval_sec': 'Daily'
    ,'sort_col': 'date'
    ,'sort_ord': 'DESC'
    ,'action': 'historical_data'
    }
    reqs=requests.post('https://cn.investing.com/instruments/HistoricalDataAjax',data=data,headers=headers)
    last_price=re.findall('class="first left bold noWrap">.*?class=".*?">(.*?)</td>',reqs.text,re.S)
    last_price=re.sub(',','',last_price[0],1)
    total_value=float(last_price)*buy_count*100#最后价值
    #先把所有价格放在一个列表
    for item in final_price:
        today_price=re.sub(',','',item,1)#或者用today.replace(',','')
        price_list.append(float(today_price))
    price_list.reverse()
    
    # 求最大回撤率
    for i in range(1,len(price_list)):
        temp_max_value=max(temp_max_value,price_list[i-1])
        max_draw_down=min(max_draw_down,price_list[i]/temp_max_value-1)
    #每日收益率计算(每日收益率=(总价值-总投资)/总投资)
    def profit(price_list,day_list):
        total_invest=0
        total_value=0
        stock_num=0
        profits=[]
        for item in price_list:
            profit = 0
            temp_index=price_list.index(item)
            s=day_list[temp_index]
    
            week = datetime(int(s[0:4]), int(s[4:6]), int(s[6:8])).weekday() + 1
            if week==4:
                stock_num=stock_num+1
    
                total_invest=total_invest+100*price_list[temp_index]*stock_num
            total_value=price_list[temp_index]*100*stock_num
            if total_invest!=0:
                profit=(total_value-total_invest)/total_invest
            profits.append(profit)
    
        return profits
    
    print("按周定投,购买{}次,本金为:{}".format(buy_count,capital))
    print('期末总资产为:{}'.format(float(last_price)*buy_count*100))
    print('期末总收益为:{}'.format(total_value-capital))
    print('定投收益率:{}'.format((total_value-capital)/capital*100))
    print('最大回撤率:{}%'.format(max_draw_down*100))
    print('每日收益率:')
    print(profit(price_list,day_list))

    结果:

  • 相关阅读:
    [转]当鼠标点击ListView下面的空白区域时,如何使ListView的原item选项仍然为选中状态
    [转]图像处理去噪的方法
    C# 图片上画连线时 自定义两点间的划线段样式
    C# WinForm (笨方法)根据不同的样式配置 设置窗体相关控件的背景 以改变窗体风格
    [转]sqlserver 数据类型 及使用考虑
    C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏
    [转]C# 画圆角矩形
    Ruby常用的内部变量
    document.getElementsByClassName的理想实现
    转:ie6与firefox操作iframe中DOM节点的一点不同
  • 原文地址:https://www.cnblogs.com/miaobo/p/12678401.html
Copyright © 2011-2022 走看看