2011年10月5日

[Python][Finance] 胡立陽的地心引力線

根據 "胡立陽的地心引力線說法" 去寫的工具:

胡立陽從電腦統計數據中發現,「30日移動平均線+72日移動平均線」的「平均數」正是股市地心引力的所在,倘若大盤漲幅超過10%,指數就會乖乖的被吸下來,而跌幅超過10%,指數也會被莫名的吸上去,大盤走勢彷彿跟著這條地心引力線上上下下,準確率高達9成以上。
雖說股市受到地心引力很有規律的上下走動,然而,這世界上,總會有令人意想不到的事情發生,難道,股市都一定按照地心引力來走,都不會有令人驚奇的意外發生嗎?胡立陽說,這樣的情況,的確偶爾發生,他提醒投資人,若大盤遠遠超過了地心引力線上方達10個交易日以上,這可是大牛市的先期預兆,投資人應順勢而為,從起漲點買進,反之,若大盤跌落在地心引力線下方,股市則由多轉空,投資人宜謹慎操作


使用方法
  1. 修改 StockGravity.bat 裡面的股票代號。只要 Yhoo! Finance 有的,都可以抓。像目前台灣 ETF 就沒有。(Google Finance 尚未支援下載台股) 
  2. 產生的 HTML 就是上面所描述的圖。抓取的日期是 "今天" 起往前推約兩年。 
  3. 請用 Chrome 或 FireFox 去開產生出來的 html,IE 怪怪的,不想理他。 
注意事項
高股息,低股價波動率的股票比較優。股價波動劇烈或要短期進出股票的,本方法不適合!
  1. 注意趨勢,要順勢而為,不是跌破就要進場! 
  2. 買賣點請參考 web 上的說明。 
  3. 長期持有
More Reference
台灣50那裡買?(How to Invest in 0050)

範例
當初發現 172x 的忠嘆是不錯的標的:股息高、股價波動小、又有前景、整體趨勢向上;於是決定納入小孩的教育基金持股。從九十塊起,每個月買個 3000 ~ 5000 塊零股。
台灣十年公債利率大約是 1.5 ~ 2 %,CPI 大約是 1.5% ~ 2%,所以複合的 4% 我當成是通貨膨脹率,股息獲利最少要 5%,所以如果以 6 塊的股息來算,120 塊以後我就停止買。後來股價突然來到 170,遠遠超過心臟所能負荷的程度,所以就賣出 (其實 160 時就想賣了,只是一忙就忘了)。最近又跌到 120 左右,可是趨勢向下,所以謹慎觀之,只小買 100 股。


Source Code
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import string
import getopt

from datetime import date
import urllib

HtmlName = 'StockGravity.html'

class StockGravity:
    '''
        Fetching historical data from Yahoo and
        Using Google Visualization: Annotated timeline to draw.
    '''
    def __init__(self, stockId = '4123.TWO'):
        today = date.today()
        today_y = today.year
        today_m = today.month
        today_d = today.day

        csv = 'http://ichart.finance.yahoo.com/table.csv?s=' + str(stockId)
        csv += '&a=' + str(today.month)
        csv += '&b=' + str(today.day)
        csv += '&c=' + str(today.year-2)
        csv += '&d=' + str(today.month)
        csv += '&e=' + str(today.day)
        csv += '&f=' + str(today.year)

        urlData = urllib.urlopen(csv).read()
        if urlData[0] == '<':
            print "Not Found"
            return

        #
        # Format is Date,       Open, High,  Low,Close,Volume,Adj Close
        #           2011-09-28,34.60,34.60,33.35,33.60, 54000,33.60
        #           2011-09-27,34.00,34.45,33.00,33.20, 71000,33.20
        # with '\n' as line-terminator
        urlData = string.replace(urlData, '\n',  ',')
        urlData = string.split(urlData, ',')
        # last '\n' is now ','
        urlData = urlData[:(len(urlData) - 1)]

        #
        # We only need [Date, Close, Avg30, Avg70, Avg30_70_2, Avg50, Avg50 * 0.9, Avg50 * 1.1]
        #

        # Skip Date,Open,High,Low,Close,Volume,Adj Close
        idx = 7
        stockDate = []
        stockClose = []
        while idx < len(urlData):
            stockDate.append(urlData[idx]);
            stockClose.append(float(urlData[idx + 6]));
            idx += 7

        stockAvg30 = []
        for i in range(0, len(stockDate) - 30):
            v = sum(stockClose[i:i+30]) / 30
            stockAvg30.append(v)

        stockAvg70 = []
        for i in range(0, len(stockDate) - 70):
            v = sum(stockClose[i:i+70]) / 70
            stockAvg70.append(v)

        stockAvg = []
        for i in range(0, len(stockAvg70)):
            v = (stockAvg30[i] + stockAvg70[i]) / 2
            stockAvg.append(v)

        f = open(HtmlName, 'w')
        f.write('''
        
          
            
            
          

          
        ''')
        s = '    StockID: ' + str(stockId)
        f.write(s)
        f.write('''
            
''') f.close() print 'Showed on '+HtmlName+'.\n' def __del__(self): pass def main(argv=None): if argv is None: argv = sys.argv try: try: (opts, args) = getopt.getopt(argv[1:], 'h', ['help']) except getopt.error, msg: print >> sys.stderr, 'Usage: ' + argv[0] + ' Stock-ID' if len(args) == 1: sg = StockGravity(args[0]) else: print >> sys.stderr, 'Usage: ' + argv[0] + ' Stock-ID' except Uerr: print >> sys.stderr, 'Usage: ' + argv[0] + ' Stock-ID' return 0 if __name__ == '__main__': sys.exit(main())


rem StockGravity.bat
@echo off
SET PATH=%PATH%;%cd%\bin

rem Stock number e.g. "^TWII", "3019.TW" or "8069.TWO"
SET STOCK="^TWII" "1723.TW" "2002.TW" "2412.TW" "8069.TWO"

if not exist html (
    mkdir html
)

for %%s in (%STOCK%) do (
    echo Fetching %%s...
    fetchCSV %%s
    move /y StockGravity.html html\%%s.html
)

pause

沒有留言: