• 网站首页
  • 财经新闻
  • 独家看点
  • 股市动态
  • 企业讯息
  • 综合资讯
  • 新股推荐
  • 机构观点
  • 现货理财
  • LTR陈东阳:货币对的平均涨跌比

    发布时间: 2018-02-01 18:29首页:中国股市在线 > 财经新闻 > 阅读()

      【作者简介】陈东阳,LTR首席基金经理,拥有多年量化交易经验,尤其擅长R语言,并精通外汇、商品期货和美股ETF等市场运行机制。坚信数学和编程是打败市场的唯一方式,擅长时间序列分析和统计建模,使用自动化模型进行分析和交易,定期测试模型的预测能力和平稳性,及时进行订单管理及风险管理。

      预测股票价格波动通常被视为分类问题,研究员使用逻辑回归,支持向量机等模型预测未来k个交易日会“上涨”或“下跌”。假设我们建立了一个模型,能够在80%的概率下预测未来一个交易日的波动,这是否意味着找到了打败市场的圣杯?答案是否定的,举个简单的例子,假设预测精度达到80%,但平均涨幅与平均跌幅之比低于0.25,仍然会亏损。在已知胜率p的情况下,平均盈亏比(盈利交易均值/亏损交易均值)必须大于(1/p-1)才能盈利。

      很多分类模型会预测未来一个交易日的涨跌概率,本文研究货币对的平均涨幅和平均跌幅,如果两者之比接近1.0,胜率超过50%的分类模型就有望盈利。

      library(tidyverse)

      library(lubridate)

      读取数据。

      get_data <- function(file) {

      # file: string, file path

      # return a dataframe contains OHLC

      if(!file.exists(file)) {

      stop("file doesn't exist.")

      }

      df <- read_csv(file, col_types = "c_dddd_",

      col_names = c("date", "open", "high", "low", "close"),

      skip = 1) %>%

      mutate(date = ymd(date))

      return(df)

      }

      currencys <- c("AUDUSD", "EURGBP", "EURUSD", "GBPJPY", "GBPUSD", "USDCAD", "USDJPY")

      destfiles <- paste("daily forex/", currencys, ".csv", sep = "")

      results <- vector("list", length(currencys))

      for(i in seq_along(results)) {

      results[[i]] <- get_data(destfiles[i]) %>%

      mutate(currency = currencys[i])

      }

      df <- bind_rows(results)

      查看数据结构。

      str(df)

      ## Classes 'tbl_df', 'tbl' and 'data.frame': 16420 obs. of 6 variables:

      ## $ date : Date, format: "2010-01-01" "2010-01-02" ...

      ## $ open : num 0.897 0.897 0.898 0.913 0.914 ...

      ## $ high : num 0.897 0.897 0.914 0.917 0.917 ...

      ## $ low : num 0.897 0.897 0.894 0.91 0.909 ...

      ## $ close : num 0.897 0.897 0.914 0.914 0.917 ...

      ## $ currency: chr "AUDUSD" "AUDUSD" "AUDUSD" "AUDUSD" ...

      选择样本:2010年1月至2017年6月30号。

    日波动性:
    。最后把日波动的单位转化成点数(pips),这样有利于对比。

      剔除周末数据,因为周末的波动性非常低,通常不会进场交易。

      df <- df %>%

      filter(date >= ymd("2010-01-01") & date <= ymd("2017-06-30")) %>%

      group_by(currency) %>%

      mutate(dclose = c(NA, diff(close))) %>%

      mutate(pips = ifelse(currency %in% c("USDJPY", "GBPJPY"),

      round(dclose * 100, 1),

      round(dclose * 10000, 1))) %>%

      filter(wday(date, label = F, week_start = 1) != 6)

      df

      ## # A tibble: 13,691 x 8

      ## # Groups: currency [7]

      ## date open high low close currency dclose pips

      ##

      ## 1 2010-01-01 0.89725 0.89745 0.89713 0.89741 AUDUSD NA NA

      ## 2 2010-01-04 0.89823 0.91356 0.89379 0.91351 AUDUSD 0.01629 162.9

      ## 3 2010-01-05 0.91348 0.91737 0.90981 0.91444 AUDUSD 0.00093 9.3

      ## 4 2010-01-06 0.91442 0.91706 0.90916 0.91666 AUDUSD 0.00222 22.2

      ## 5 2010-01-07 0.91670 0.92661 0.91587 0.91886 AUDUSD 0.00220 22.0

      ## 6 2010-01-08 0.91876 0.92323 0.91226 0.91946 AUDUSD 0.00060 6.0

      ## 7 2010-01-11 0.92871 0.93247 0.92738 0.93086 AUDUSD 0.00715 71.5

      ## 8 2010-01-12 0.93091 0.93196 0.92054 0.92552 AUDUSD -0.00534 -53.4

      ## 9 2010-01-13 0.92554 0.92671 0.91701 0.92266 AUDUSD -0.00286 -28.6

      ## 10 2010-01-14 0.92270 0.93296 0.92050 0.92986 AUDUSD 0.00720 72.0

      ## # ... with 13,681 more rows

      增加一个分类变量trend,上涨记为1,下跌记为-1,然后按照currency和trend两个分类变量对日波动性分组,计算均值。

      by_trend <- df %>%

      mutate(trend = factor(ifelse(dclose > 0, 1, -1))) %>%

      filter(!is.na(trend)) %>%

      group_by(currency, trend) %>%

      summarise(mean_change = mean(pips))

      by_trend

      ## # A tibble: 14 x 3

      ## # Groups: currency [?]

      ## currency trend mean_change

      ##

      ## 1 AUDUSD -1 -48.07027

      ## 2 AUDUSD 1 45.52568

      ## 3 EURGBP -1 -31.23220

      ## 4 EURGBP 1 33.33613

      ## 5 EURUSD -1 -54.60387

      ## 6 EURUSD 1 54.50359

      ## 7 GBPJPY -1 -82.11813

      ## 8 GBPJPY 1 78.54186

      ## 9 GBPUSD -1 -61.70304

      ## 10 GBPUSD 1 59.85367

      ## 11 USDCAD -1 -43.21478

      ## 12 USDCAD 1 44.32697

      ## 13 USDJPY -1 -43.05808

      ## 14 USDJPY 1 43.42761

      绘制柱状图。

      by_trend %>%

      ggplot(aes(x = currency, y = abs(mean_change), fill = trend)) +

      geom_bar(stat = "identity", position = "dodge") +

      labs(title = "Daily volatility by Currency and Trend",

      x = "", y = "pips") +

      theme_bw()

      上图清楚表明,7个主要货币对在上涨和下跌的日子里的平均波幅几乎一致,没有明显差异。换句话来说,只要预测模型的胜率超过50%,都有望在长期内打败市场。

      这里并没有考虑到交易成本,点差,滑点,隔夜利息会对交易业绩构成显著冲击,为了实现持续盈利,个人认为一个专门预测未来涨跌概率的模型必须具备超过55%的胜率。

      欢迎加入【和高手一起玩赚EA】社群(群主QQ:3157002952,加好友时请注明暗号:66),在这里聚集了”外汇EA交易者、EA技术大神、EA爱好者、计算机宽客、金融极客、数据大师、草根经济学家”分享各种想法、算法、策略,共享思维碰撞带来的灵感。不仅有料,更有圈子!

      本社群有哪些资源?

      1)外汇资管业务,传统外汇资管业务,传统拨头皮EA+对冲EA+马丁EA

      2)外汇培训课程+外汇线下活动+外汇线下展会。

      3)EA编程,EA测试,DLL加密等MT4+MT5业务。

      4)海外私募挂靠

      5)策略资金对接

    特别声明:文章内容仅供参考,不造成任何投资建议。投资者据此操作,风险自担。

    网站首页 - 财经新闻 - 独家看点 - 股市动态 - 企业讯息 - 综合资讯 - 新股推荐 - 机构观点 - 现货理财

    CopyRight(C)2011 zggszx.com All Rights Reserved 蜀ICP备15028138号-1

    网络实名:中国股市在线 永久域名:www.zggszx.com 川公网安备 51172502000103号

    中国股市在线免费提供股票、基金、债券、外汇等资料均来自相关合作方及互联网,仅作为用户获取信息之目的,并不构成投资建议。

    市场有风险 投资需谨慎