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))

    结果:

  • 相关阅读:
    前后端分离基于Oauth2的SSO单点登录怎样做?
    Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定
    微服务业务监控和行为分析怎么做?试试日志埋点
    Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单
    Spring Cloud异步场景分布式事务怎样做?试试RocketMQ
    Apache RocketMQ 消息队列部署与可视化界面安装
    Spring Cloud同步场景分布式事务怎样做?试试Seata
    实施微服务架构的关键技术
    Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)
    独立博客,从零到千万访问,这三年我都做了什么
  • 原文地址:https://www.cnblogs.com/miaobo/p/12678401.html
Copyright © 2011-2022 走看看