銘柄同士の相関を取ってみるテスト

なんぞこれ?

↓ ここの株価データを使って、銘柄総当たりの相関を調べてみました http://softreed.la.coocan.jp/data.htm

なんか面白い発見ないかな。って期待しながら 出てきたデータを眺めて楽しむことができます。

はい。それだけです。

前準備

  1. gaushe をインストールしておいてください
  2. 上記サイトからデータを取ってきて 解凍。csvを適当な場所へ。
  3. csvから銘柄リストを作っておきます  - cat 201804.csv | cut -d ',' -f 2 | sort | uniq > code.lst

実行

以下ファイルを適当な名前で保存。実行すると標準出力に 以下フォーマットでデータがひねり出されていきます 「銘柄1」「銘柄2」「相関係数

calc.data とでも名前を付けたファイルにリダイレクトして保管しておきましょう。 ※めちゃくちゃ時間がかかります。2日くらいw

#!/usr/bin/env gosh

(use file.util)
(use text.tr)

;; 合計
(define sum (lambda (x) (apply + x)))

;; 平均
(define (ave lst)
  (/ (sum lst) (length lst)))

;; 共分散
(define (covariance lst)
  (-
    (ave
      (map (lambda (item) (* (car item) (cdr item))) lst))
    (* (ave (map car lst))
       (ave (map cdr lst)))))

;; 標準偏差
(define (standard-dev lst)
  (define ave-lst (ave lst))
  (ave
    (map
      (lambda (x)
        (expt (- x ave-lst) 2)) lst)))

;; 相関関数
(define (correctionFn lst)
  (define std
    (* (standard-dev (map car lst))
    (standard-dev (map cdr lst))))
  (cond
    ((zero? std) 9999)
    (else
      (inexact
        (/ (covariance lst) std)))))

;; 銘柄組み合わせ作成
(define (combination-pattern l)
 (define (pair-create top lst)
   (cond 
     ((null? lst) '())
     (else
       (cons
         (cons top (car lst))
         (pair-create top (cdr lst))))))
 (cond
  ((null? l) '())
  (else
    (append
      (pair-create (car l) (cdr l))
      (combination-pattern (cdr l))))))

;; 銘柄コードフィルタ
(define (create-filter no)
  (lambda (lst)
    (cond
      ((null? lst) '#f)
      (else (equal? (cadr lst) no)))))

;; 株価データ(一ヶ月分全銘柄)
(define kabu-lst
  (map
    (lambda (str) (string-split str ","))
    (file->string-list "./data/201804.csv")))

;; 銘柄コードリスト
(define code-lst
    (file->string-list "./data/code.lst"))

;; データ生成
(define (marge-data lst1 lst2)
  (cond
    ((null? lst1) '())
    ((null? lst2) '())
    (else
      (cons
        (cons (string->number (car lst1)) (string->number (car lst2)))
        (marge-data (cdr lst1) (cdr lst2))))))

;; 相関関数計算
(define (calcCorrectionFn no1 no2)
  (print
    (format "~A ~A ~A"
      no1
      no2
      (correctionFn
        (marge-data
          (map caddr (filter (create-filter no1) kabu-lst))
          (map caddr (filter (create-filter no2) kabu-lst)))))))

(define (all-calc lst)
  (cond
    ((null? lst) '())
    (else
      (calcCorrectionFn (caar lst) (cdar lst))
      (all-calc (cdr lst)))))

;; 組み合わせリスト
(define cmb-lst (combination-pattern code-lst))
(all-calc cmb-lst)

楽しみ方

出てきたデータはこんな感じで楽しみます。

head -n 1000 calc.data | awk '{printf"%.10f %d %d \n", $3,$1,$2}' | sort -r