顯示具有 Finance 標籤的文章。 顯示所有文章
顯示具有 Finance 標籤的文章。 顯示所有文章

2010年8月2日 星期一

可轉債自動報價查詢 II

可轉債, CB, 自動化查詢, 股票, 金融

改進了之前的 script ,全部改成 python 來寫。可由標準輸入檔案讀入想查詢的台灣股市上市上櫃公司代號,完畢後輸出成 html table 並發信至指定的電郵信箱。


usage:

python thisscript.py < stocklist.txt


這支 script 基本上做了下面的事情:

1. 依代號查網頁 (tw.stock.yahoo.com)

2. 解析網頁資料

3. 輸出成 html table

4. 寄信 with attachment



#! /usr/bin/env python
# -*- coding: big5 -*-
import urllib2, re, sys, csv
import smtplib
from datetime import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email import encoders
from email.utils import COMMASPACE

html = '<html><table border="1" style="border-collapse:collapse;" borderColor=black>\n'
html = html + '<tr><th>代碼</th><th>HTTP</th><th>名稱</th><th>成交價</th><th>漲跌</th><th>買進</th><th>賣出</th>'
html = html + '<th>張數</th><th>昨收</th><th>開盤</th><th>最高</th><th>最低</th></tr>\n'
data = []
for line in sys.stdin:
F1, F2, F3, F4, F5 = '', '', '', '', ''
F1 = re.match('\d+', line).group(0)
url = 'http://tw.stock.yahoo.com/q/q?s=' + F1
myrequest = urllib2.Request(url)
myrequest.add_header('User-Agent', 'Mozilla 5.0')
try:
content = urllib2.urlopen(myrequest)
F2 = 'OK'
except:
F2 = 'Failed'
c = content.read()
m = re.search(r'href="/q/bc\?s=\d+">(\d+.*?)</a>', c)
F3 = m.group(1) if m else '-'
m = re.search(r'nowrap><b>(\d+.?\d+|\d+|-)</b></td>', c)
F4 = m.group(1) if m else '-'
m = re.search(r'nowrap><font color=#......>(▽\d+.\d+|△\d+.\d+|\d+.\d+|-)', c)
F5 = m.group(1) if m else '-'
F6 = re.findall(r'wrap>(\d+.?\d+|\d+|-)</td>', c)
data.append([F1, F2, F3, F4, F5]+F6[1:])
for line in sorted(data, key=lambda x: float(x[3]) if (x[3] <> '-') else x[3]):
result = ''
for x in line:
result = result + x + ','
result = re.sub(',' , '</td><td>', result)
result = '<tr><th>'+result+'</tr>\n'
result = re.sub(r'<th>(\d+)</td>', r'<th>\1</th>', result)
html = html + result

html = html + '</table></html>\n'

tt = datetime.now().timetuple()

me = "sender@email.address"
you = ['recipient1@email.address', 'recipient2@email.address']

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "CB Report " + str(tt[0]) + "-" + str(tt[1]) + "-"  + str(tt[2]) + " "  + str(tt[3]) + ":"  + str(tt[4]) + ":"  + str(tt[5])
msg['From'] = me
msg['To'] = COMMASPACE.join(you)

# Create the body of the message (a plain-text and an HTML version).
# text = """ <html><b>test</b></html> """
# html = """ this is html data """
# Record the MIME types of both parts - text/plain and text/html.
# part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html', _charset='Big5') # _charset is important to avoid bad characters

# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
#msg.attach(part1)
msg.attach(part2)

# Send the message via local SMTP server.
s = smtplib.SMTP('localhost')
# sendmail function takes 3 arguments: sender's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.quit()

2010年7月21日 星期三

可轉債自動報價查詢

關鍵字: perl, python, 可轉債 (convertible bond)


上市公司及上櫃公司的可轉債約有200多卷,可由公開資訊觀測站查詢相關的訊息。以可轉債的特性而言,比較有用的是跌到票面價格以下的債卷,但必須要常常追蹤價格以及市場消息,對於非專業人士實在力有未逮。如果要一筆一筆輸入 Yahoo 的投資組合來 monitor,也是耗時又費力。因此在一台 linux 上面寫了個 perl 的查詢器,再放到 crontab 來定時自動查詢,方便性增加不少。在這邊做個紀錄。

下面是一開始用的 perl script,可以用標準輸入讀入可轉債代號文字檔案 (一個代號一列),查詢後輸出到標準輸出 (csv tab 分隔文字格式)。以下的方法也可以用來查詢一般的股票。


#!/usr/bin/perl -w
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
$ua = new LWP::UserAgent;                               # 產生 UserAgent 物件
my $year     = (localtime)[5] + 1900; # year
my $month   = (localtime)[4] + 1;     # month
my $day      = (localtime)[3];           # day
my $date = $year."-".$month."-".$day;
print "代碼"."\t"."HTTP"."\t"."名稱"."\t"."成交價"."\n";
foreach (<>) {
chomp($_);
$request = new HTTP::Request('GET', 'http://tw.stock.yahoo.com/q/q?s='.$_);     # 產生 Request 物件
$response = $ua->request($request);                     # 開始抓取網頁,並將結果傳會 $response
if ($response->is_success) {                    # 若抓取網頁成功,則印出 HTML 原始碼
        my $html = $response->content;
        if ($html =~ m{href="/q/bc\?s=\d+">(\d+.*?|-)}) {
                print $_."\tOK\t".$1."\t";}
                else {print $_."\tOK\t"."抓不到\t";}
        if ($html =~ m{nowrap>(\d+.?\d+)}) {
                print $1."\n";}
                else {print "抓不到\n";}
        } else {                                                # 若抓取網頁不成功,則印出錯誤訊息
        #print $response->error_as_HTML;
        print $_."\t"."網頁讀取有問題"."\n";
}
}

配合上 crontab 執行以下的 perl script 可以固定每天定時查詢後發信至指定的信箱,包括日期跟時間


#!/usr/bin/perl -w
my $year     = (localtime)[5] + 1900; # year
my $month   = (localtime)[4] + 1;     # month
my $day      = (localtime)[3];           # day
my $hour     = (localtime)[2];           # hour
my $minute  = (localtime)[1];           # minute
my $second = (localtime)[0];           # second
my $cbdate = $year."-".$month."-".$day." ".$hour.":".$minute.":".$second;
my $output = "/tmp/"."cblist-".$year."-".$month."-".$day."-".$hour."-".$minute."-".$second.".txt";


`/path-to-script/queryscript.pl < /convertible_bond_list.txt > $output`;
sleep(25);
open IN, ("< $output");


$to='your@email.address';
$from= 'your@email.address';
$subject='CB Report '.$cbdate;


open(MAIL, "|/usr/sbin/sendmail -t");


## Mail Header
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n\n";
## Mail Body
foreach () {
print MAIL $_;
}


close(MAIL);

查完後發現還是不夠完美,我希望可以針對成交價由小至大做排序,這樣只要看前面的幾個可轉債就好了,所以把查詢的  script 用 python 來改寫,輸出 csv 逗號分隔檔至標準輸出裝置,另外增加了 yahoo 上可查詢到的其他欄位。


#! /usr/bin/env python
# -*- coding: big5 -*-
import urllib2, re, sys, csv
print '代碼,HTTP,名稱,成交價,漲跌,買進,賣出,張數,昨收,開盤,最高,最低'
data = []
for line in sys.stdin:
    F1, F2, F3, F4, F5 = '', '', '', '', ''
    F1 = re.match('\d+', line).group(0)
    url = 'http://tw.stock.yahoo.com/q/q?s=' + F1
    myrequest = urllib2.Request(url)
    myrequest.add_header('User-Agent', 'Mozilla 5.0')
    try:
        content = urllib2.urlopen(myrequest)
        F2 = 'OK'
    except:
        F2 = 'Failed'
    c = content.read()
    m = re.search(r'href="/q/bc\?s=\d+">(\d+.*?)', c)
    F3 = m.group(1) if m else '-'
    m = re.search(r'nowrap>(\d+.?\d+|\d+|-)', c)
    F4 = m.group(1) if m else '-'
    m = re.search(r'nowrap>(▽\d+.\d+|△\d+.\d+|\d+.\d+|-)', c)
    F5 = m.group(1) if m else '-'
    F6 = re.findall(r'wrap>(\d+.?\d+|\d+|-)', c)
    data.append([F1, F2, F3, F4, F5]+F6[1:])
for line in sorted(data, key=lambda x: float(x[3]) if (x[3] <> '-') else x[3]):
    result = ''
    for x in line:
        result = result + x + ','
    print result[:-1]

這個  script 有幾個問題
1. 在比大小的時候,python 內建的排序遇到浮點數會被當成字串,因為一開始我們查詢回來的資料就是字串,因此比大小的時候要 type casting。
2. 有用到 key,所以必須要用 python2.4 以上。

2008年9月18日 星期四

Unpredictable Fortune

以下為 2008/07/23 舊聞

【鉅亨網記者陳慧琳‧台北】 台股昨(22)日小跌,融資波段減幅儘管昨日已首度 超越台股跌幅,但是融資還是持續殺出16億元,餘額來 到2741億元今(2008)年低水位,並創近17個月的新低, 法人表示,今日台股開盤大漲,除了因美股走揚,最主 要就是反映籌碼換手成功,底部訊號確定

融資餘額持續每日每日的遞減,相較於 5月22日最 高峰的3686億元,波段洗出高達945億元,幅度 25.64% 。至於大盤指數則從 5月20日當天最高點的9309點下修 ,因前天暴漲 270點,融資減幅就已首度超越大盤跌幅 ,再計算至昨天收盤的7065點,波段跌幅為24.1%。

融資餘額已降到2741億元,此水位是從去年 3月以 來新低的水位,代表散戶動向的融資餘額減肥成功,市場籌碼逐漸穩定,有利股市反彈

若分析近 1個月融資洗出最多個股,法人表示,融 資減肥主要集中在跌深的面板、低價電子及部分金融股 ,奇美電 3009(TW) 、友達 2409(TW) 累計20個交易日 融資分別減58240、39757張;其餘錸德 2349(TW) 、歌 林 1606(TW) 、華邦電 2344(TW) 、新纖 1409(TW) 及 彰銀 2801(TW) 、國泰金 2882(TW) 。

至於向來是散戶最愛的IC設計族群,前波跌勢兇猛 ,融資猛殺,不少個股股價腰斬、甚至還有打到 3折, 不過法人表示,近期IC設計族群率先止跌,包括聯家軍 的聯陽 3014(TW) 、原相 3227(TW) 、揚智 3041(TW) 等 ,隨著籌碼沉澱,股價都已經在6月底、7月初領先大盤 落底反彈,就已是浮現台股底部訊號。

法人表示,整體來看台股 7月見低點、8月整理,9 月台股伴隨電子業擺脫低迷,旺季來臨,預期可望回升 。電子族群中,NB相關族群業績成長佳,逢低仍可分批 承接; TFT面板相關族群在報價尚未止穩之前,宜維持 觀望。

2008年9月14日 星期日

台塑砸150億護盤 分析師:短多

台塑集團投入資金護盤,宣示穩定投資人信心意味十足。不過,分析師認為,護盤僅能代表股價來到長期相對低點,不代表股價立刻有表現機會,台塑集團動作可能帶動短期反彈效果,股價仍需回歸基本面看待。

台塑集團動用150億元資金護盤,為民國93年之後第二度進行護盤。美嘉資產管理總經理杜富國表示,這次護盤雖對股價沒有強烈鼓舞作用,但以台塑集團過去所建立的誠信形象,還是會受到市場肯定,也代表台塑集團股的投資買點浮現。

聯邦投信副總經理黎方國表示,企業經營階層理是最了解公司營運與產業狀況的人,買回自家的股票,代表肯定公司的經營面,具有宣示與振奮人心的效果,就理性投資人而言,確實可視為買點。

不過,四年前台塑集團買回自家公司股票,當時台灣的經濟成長率為6.07%,而今年則是備受質疑的4.3%,且台塑集團93年買進股票後,石化業景氣進入旺季,整體經濟環境優於現在,這次台塑集團再進場護盤,實質效益仍待觀察。

國際大通投顧分析師連乾文指出,去年亞洲乙烯新增產能僅有486萬噸,而今年第四季與明年上半年皆預期產能大增,導致乙烯價格快速滑落,自然壓縮塑化類股的獲利空間。從產業面來看,台塑集團確實面臨較艱難的困境。

連乾文說,短線大盤如果出現止跌,台塑四寶有反彈機會,不過,就中期表現而言,基本面確實不佳,股價難有太好表現。

2007年12月30日 星期日

投資金律 (The Four Pillars of Investing)

I. The First Pillar - Investing Theory


Risk and Reward


Growth stock vs. value stock