【问题标题】:programmatically check if today is a market open trading day以编程方式检查今天是否是市场开放交易日
【发布时间】:2019-04-19 07:47:04
【问题描述】:

检查今天美国证券交易所是否开放交易的最简单方法是什么?

我希望避免的冗长方法是创建例程来解析带有日历信息的提要,例如https://business.nasdaq.com/trade/US-Options/Holiday-Trading-Hours.html

我更喜欢 Ruby,但即使是使用 curl 进行简单的 URL 查找以产生真/假或距离下一个市场开放的时间,也很棒。

可选

能够查找任意日期会更好,并且也可以解决这个问题。
IE。甚至来自 shell 的 curl google.com/search?q="Is the NYSE open on $(date +%Y-%m-%d)" 之类的东西。

【问题讨论】:

  • 已在此处找到相关(不相同)问题,但通常是特定领域(例如 Matlab、R、需要库、胖 API 或基础设施等)或没有得到充分解决。
  • 因此,鉴于目前给出的答案(用户 crappy_hacker),是否值得澄清今天是否会/不会在某个时候开放?我不知道在以下答案的情况下,当它是交易日但在交易时间之外,即市场关闭但是交易日时会发生什么。 如果今天美国证券交易所开放交易意味着只需要匹配就是当天应该发生的交易。
  • 因为您需要的是“今天”(而不是历史日期),您可以使用NYSE page for market holidays。在每年年初解析来年的holdiays。将其保存为您选择的可读格式的文件。然后检索该文件,除此之外,排除所有周末。这正是我使用 Apps 脚本所做的。

标签: stock algorithmic-trading


【解决方案1】:

我在我的 shell 脚本中使用 Tradier's API 执行此操作,然后使用 jq 获取特定日期的状态。

date="your date"
month=$(date -d $date +%-m)
year=$(date -d $date +%Y)
calendar=$(curl -H "Authorization: Bearer "$tradierApi"" -H "Accept: application/json" "https://production-api.tradier.com/v1/markets/calendar?month="$month"&year="$year)
marketStatus=$(echo $calendar | ./jq-linux64 '.calendar.days.day[] | select(.date == "'$date'") | .status')

【讨论】:

    【解决方案2】:

    MSN 报价包含一个属性,表明股票上市的市场是开市还是收市:

    https://www.msn.com/en-us/money/stockdetails/nas-aapl/fi-a1mou2?symbol=AAPL&form=PRMFPS

    以下是使用Beautiful Soup 解析器获取状态的示例 Python 脚本。

    如果您担心他们会更改 css,我想正则表达式可能更可靠,等等。

    
    from bs4 import BeautifulSoup
    
    import requests
    
    session = requests.session()
    
    response = session.get('https://www.msn.com/en-us/money/stockdetails/nas-aapl/fi-a1mou2?symbol=AAPL&form=PRMFPS')
    
    if response.status_code == 200:
    
        page = response.text
        
        soup = BeautifulSoup(page, "lxml")
    
        market = soup.find('span', attrs={'class': 'market-status-text'}).text
    
        if market == 'US Markets Closed':
    
           # do stuff
    
            print('closed')
    
        else:
    
            print('open')
    
            # do different stuff
    
    

    【讨论】:

      【解决方案3】:

      在出现更优雅和可靠的东西之前,我可能会使用

      curl -s "https://www.isthemarketopen.com/" |grep -c "** Stock market is closed"
      

      在今天的情况下(耶稣受难日)返回 1——我可以直接在条件代码中使用——但必须定期维护和检查该 URL 的基础 HTML 源可能发生的变化。

      【讨论】:

      • 复活节星期一早上,isthemarketopen.com 仍在发布美国市场因耶稣受难日而休市 :( 这在相反的情况下破坏了我的代码。寻找快速单行测试的替代方案。跨度>
      【解决方案4】:

      我发现了美国市场假期的Google Calendar,它会在接下来的几年内合理更新。

      尽管我讨厌添加单独的答案,但这是一个比之前脆弱的 URL 页面文本搜索器更好的解决方案(顺便说一句,两周后仍然返回“**股票市场关闭耶稣受难日 4/ 19/19”,而不是简单地在某处出现“市场今天开放”)。

      首先是代码:(带有嵌入式 Bash 的 Ruby)

      $marketCal = %x'curl -s "https://www.googleapis.com/calendar/v3/calendars/2jpqg4chp4djba5ea99b22b838@group.calendar.google.com/events?key=[YOUR GOOGLE API KEY]&maxResults=1&timeMin=#{today=`date +%Y-%m-%d`.chomp}T00%3A00%3A01%2B00%3A00&timeMax=#{today}T23%3A59%3A59%2B00%3A00&"'
      
      $isMarketOpenToday = $marketCal !~ /"status":/  # => true  when there exists event "id":, etc.
      

      由于存在资源限制,您需要前往创建自己的免费 API 密钥 https://console.developers.google.com/apis/credentials?

      如果今天没有市场假期,则全局变量 $isMarketOpenToday 产生 true,否则产生 false .请注意,它不考虑星期几,因此在周末它可能仍会产生 true。因此,如果需要,只需进行另一个简单的测试。例如。 [[ $(date +%u) < 6 ]] && echo "Weekday, yay!"

      编程标准可以改进很多;这里的目标只是用最少的代码行来测试 API,可以从脚本外部的 CLI 轻松检查,但是很讨厌。

      【讨论】:

        【解决方案5】:

        对于 Python,我发现最简单的方法是使用 pandas_market_calendars 库,它可以告诉您市场日期。

        import pandas_market_calendars as mcal
        nyse = mcal.get_calendar('NYSE')
        nyse.valid_days(start_date='2016-12-20', end_date='2017-01-10')
        

        将 start_date、end_date 替换为自己并生成跟随范围。

        DatetimeIndex(['2016-12-20 00:00:00+00:00', '2016-12-21 00:00:00+00:00',
                       '2016-12-22 00:00:00+00:00', '2016-12-23 00:00:00+00:00',
                       '2016-12-27 00:00:00+00:00', '2016-12-28 00:00:00+00:00',
                       '2016-12-29 00:00:00+00:00', '2016-12-30 00:00:00+00:00',
                       '2017-01-03 00:00:00+00:00', '2017-01-04 00:00:00+00:00',
                       '2017-01-05 00:00:00+00:00', '2017-01-06 00:00:00+00:00',
                       '2017-01-09 00:00:00+00:00', '2017-01-10 00:00:00+00:00'],
                      dtype='datetime64[ns, UTC]', freq='C')
        

        检查今天的日期。

        【讨论】:

          【解决方案6】:

          PowerShell:

          function isMarketOpen(){
              $url = "https://query2.finance.yahoo.com/v7/finance/quote?symbols=MSFT"
              try{
                  $response = Invoke-RestMethod $url
                  #return $response.quoteResponse.result[0]
                  if($response.quoteResponse.result[0].marketState -eq 'CLOSED'){
                      return $false
                  }else{
                      return $true
                  }
              }catch{
                  $_.exception | Write-Warning
                  return $null
              }
          }
          
          isMarketOpen
          

          【讨论】:

          • 好,所以这个 JSON 输出的市场状态在任何股票代码上。我还没有检查这是否会在交易日给出“开盘”,但在典型的市场时间之前或之后。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-13
          • 2011-11-08
          相关资源
          最近更新 更多