最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

2012年10月17日 星期三

Excel VBA抓取上市交易明細

使用InternetExplorer.Application物件與QueryTables的方法來抓取,上市股票的劵商分點交易資料,可參考如下的程式碼


2012年10月14日 星期日

Excel VBA抓取股票代碼

使用QueryTables方法寫一個簡單的抓取上市櫃股票代碼,有興趣的可以參考。

2012年10月13日 星期六

2012年10月9日 星期二

2012年10月8日 星期一

Python 抓取上櫃交易明細(2)

使用Python以檔案下載的方式,抓取上櫃每日交易明細,將資料存入CSV檔 。

2012年10月5日 星期五

Python 抓取上櫃交易明細(1)

使用Python以解析網頁的方式,抓取上櫃每日交易明細,再將資料存入CSV檔 。

2012年9月29日 星期六

C/C++ 取得檔案大小

<方法一> 利用 ftell
unsigned long GetFileLength1 (FILE * fileName)
{
     unsigned long pos = ftell(fileName);
     unsigned long len = 0;
   
     fseek ( fileName, 0L, SEEK_END );
     len = ftell ( fileName );
     fseek ( fileName, pos, SEEK_SET );
     return len;
}

<方法二>利用stat
unsigned long GetFileLength2 (char * fileName)
{
    struct stat buf;
    int i = stat ( fileName, &buf );

    if (i !=0)
       MessageBox(NULL,"ERROR for STAT","ERROR",0);

    return buf.st_size;
}

<方法三>利用filelength 必須include< fcntl.h>
原型: long filelength(int fd)
long GetFileLength3(char *fileName)
{
    int fd = open(fileName,O_RDONLY | O_BINARY);
    if(fd == -1 ) return -1;
    long lsize = filelength(fd);
    close(fd);
    return lsize;
}

<方法四> 利用Windows API GetFileSize & GetFileSizeEx
Large File Size 請使用 GetFileSizeEx函式。

<方法五>利用Windows API  FindFirstFile()
/// For Windows:
#include <windows.h>
double dblFileSize(const char* fname)
{
  if (!fname && !*fname)
     return 0.0;
  HANDLE h;
  WIN32_FIND_DATA info;

  if ((h=FindFirstFile(fname,&info)) 
      != INVALID_HANDLE_VALUE)
  {
     FindClose(h);
     if ((info.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) == 0) // Is it a file?
     {
        union
        {
          struct { DWORD low, high; } lh;
          __int64 size; // MS large int extension
        } file;
        file.lh.low = info.nFileSizeLow;
        file.lh.high= info.nFileSizeHigh;
        return file.size; // will be casted to double
     }
     // It's a directory, not a file
  }
  return 0.0; // No such name.
}
方法 1~3都無法處理大檔案,要注意~
資料來源參考:這裡

識別檔案編碼UTF8與ANSI

開啟一個CSV的文字檔

以二進制的方式開起該文字檔

從上圖可以看出二進制檔的檔頭內容是EF BB BF,此即為UTF8編碼格式
若是在二進制檔的檔頭看不到EF BB BF,而是直接看到檔案的資料,則該檔即為ANSI編碼
其他的編碼原則如下表:

編碼
表示 (十六進位)
表示 (十進位)
UTF-8
EF BB BF
239 187 191
UTF-16(大端序)
FE FF
254 255
UTF-16(小端序)
FF FE
255 254
UTF-32(大端序)
00 00 FE FF
0 0 254 255
UTF-32(小端序)
FF FE 00 00
255 254 0 0
UTF-7
2B 2F 76和以下的一個位元組:[ 38 | 39 | 2B | 2F ]
43 47 118和以下的一個位元組:[ 56 | 57 | 43 | 47 ]
en:UTF-1
F7 64 4C
247 100 76
en:UTF-EBCDIC
DD 73 66 73
221 115 102 115
en:Standard Compression Scheme for Unicode
0E FE FF
14 254 255
en:BOCU-1
FB EE 28 及可能跟隨著FF
251 238 40 及可能跟隨著255

表格參考資料:維基

Batch教學--For使用

今天介紹使用Batch中的For指令

FOR /R – 列舉目前目錄下的全部子目錄名所有檔案
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
FOR /R %i IN (*) DO echo %i
FOR /D – 列舉目前目錄下的子目錄名
FOR /D %variable IN (set) DO command [command-parameters]
FOR /D %i IN (*) DO echo %i
FOR /L – 以增量形式從開始到結束一個數字序列
FOR /L %variable IN (start,step,end) DO command [command-parameters]
set sum=0
FOR /L %i IN (1, 1, 100) DO set /a sum=sum+%i
echo %sum%
>> 5050
FOR /F – 做在一個檔案裡的指令
FOR /F ["options"] %variable in (file-set) do command [command-parameters]
FOR /F ["options"] %variable in ("string") do command [command-parameters]
FOR /F ["options"] %variable in ('command') do command [command-parameters]
file-set為一個或多個檔案名稱。/f 分析每個檔案的每一行,跳過空白行。"options" 關鍵字:
  1. eol=c 用來決定斷行符號,預設為 \n,但可換成其他字元(其中 c 只能是一個字元)
  2. skip=n 用來決定要先跳過幾層迴圈(也就是跳過前面幾行的意思)
  3. delims=xxx 用來決定欄位的分隔字元,預設為空白與TAB符號,並可自訂多個字元,多個字元時需用逗號(,)區隔開。
  4. tokens=x,y,m-n用來決定一次要取出幾個欄位,第一個欄位會存放在第一個自動變數,第二個欄位會存放在第二個自動變數裡,依此類推,說明如下。
  • 第一個變數為%i並設並tokens=1-3,則後面將得到的變數為%%i、%%j、%%k
Set a=aaa_bbb_111-222-333
For /F "tokens=1-3 delims=_" %%i in ("%a%") do echo %%i  %%j  %%k
>> aaa  bbb  111-222-333
  • 第一個變數為%i並設並tokens=2,3,則後面將得到的變數為%%i、%%j
Set a=aaa_bbb_111-222-333
For /F "tokens=1-3 delims=_" %%i in ("%a%") do echo %%i  %%j
>> bbb  111-222-333


2012年9月24日 星期一

Batch教學--變數使用

環境變數的使用,可以做到跟VC++中CString的用法類似,各位可以參考如下。
set A=1234567890
set B=%A%

REM 從第3 字元後開始取2個字元
set B=%A:~3,2%
echo %B%
>>45

REM 從前面開始取5個字元
set B=%A:~,5%
echo %B%
>>12345

REM 從第3字元後開始取到後面。
set B=%A:~3%
echo %B%
>>4567890

REM 從後面開始取前5個字元。
set B=%A:~-5%
echo %B%
>>67890

REM 從開頭取到最後2個字元不取。
set B=%A:~0,-2%
echo %B%
>>12345678

REM 字元中有5的取代成sss。
set B=%A:5=sss%
echo %B%
>>1234sss67890
其他常用系統變數
系統變數
描述
%n(%0%1 ~ %9)
外部變數輸入所使用的變數代稱,如C/C++Argv
%CMDEXTVERSION%
展開為目前的命令處理擴充功能的版本號碼
%CMDCMDLINE%
處理目前命令提示字元視窗命令的cmd.exe的完整路徑
%CD%
目前的工作資料夾
%DATE%
目前的系統日期
%ERRORLEVEL%
最近執行過的命令的錯誤碼;非零的值表示發生過的錯誤碼
%ProgramFiles%
應用程式目錄,預設是C:\Program Files
%ProgramFiles(x86)%
應用程式目錄,預設是C:\Program Files(x86)
%Path%
執行檔的搜尋路徑
%RANDOM%
顯示032767之間的十進位整數亂數
%SystemRoot%
系統根目錄,預設是C:\WINNTC:\WINDOWS
%SystemDirectory%
系統目錄,預設是C:\WINNT\System32C:\WINDOWS\System32
%TIME%
目前的系統時間
%Temp%%Tmp%
暫存檔目錄
%USERNAME%
使用者帳號名稱
%WINDIR%
Windows目錄,預設是C:\WINNTC:\WINDOWS

Python 圖表工具


如果要顯示結點關係圖,可選擇歷史最悠久的是Graphviz 透過pyDot生成DOT檔。
如果是需要生成統計圖,則pyChart可能更加適合。
如果要做三維的圖形,可考慮Dislin
如果要一個歷史最悠久的,最受歡迎的,應該選擇Gnuplot可透過Gnuplot.py來訪問。
如果需要一個最前衛的,操作類似matlab的,則應該選擇matplotlib
如果你想從最底層來,而且喜歡SVG格式,則可看看SVGDraw吧。
生成各種Python圖表chardir
模組的高品質圖形輸出Python Matplotlib。
PyX - Python graphics package

Eexcel VBA資料類型

一、資料類型
在Access中可用的資料類型分為3種:標準型、自定義型、物件型。
1.標準型,共有7種。
  (1) 整數:尾碼符為"%"。
  (2) 長整數:尾碼符為"&"。
  (3) 單精確度:尾碼符為"!"。
  (4) 雙精度:尾碼符為"#"。
  (5) 貨幣:尾碼符為"@"。
  (6) 字串:尾碼符為"$"。
  (7) 變體:可用於任何資料類型。

二、變數定義
自定義型:它使用關鍵字Type來定義VBA產生新的資料類型,類似C/C++的結構,定義如下:
Type Point
   X as Integer
   Y as Integer
End Type

即定義了一個點(point )的資料結構,宣告與使用變數方式如下:
Dim pCurPoint as Point
PCurPoint.X=10
PCurPoint.Y=10

三、變數的作用域

2012年9月20日 星期四

Batch教學--IF指令

條件判斷
IF [NOT] EXIST filename command
IF [NOT] EXIST filename (command) ELSE (command)
IF [/I] [NOT] item1==item2 command
IF item1 Compare-op item2 command
IF item1 Compare-op item2 (command) ELSE (command)
IF DEFINED variable command

Compare-op:
EQU – 等於
NEQ – 不等於
LSS – 小於
LEQ – 小於或等於
GTR – 大於
GEQ – 大於或等於

大小相同
if "ABC"=="ABC" echo 大小寫相同

區分大小寫
if not "ABC"=="abc" echo 大小寫不同

不區分大小寫
if /I "ABC"=="abc" echo 兩者相同相等

判斷檔案是否存在
if NOT EXIST C:\text.txt echo c:\text.txt檔案不存在

如果環境變數是空,可在變數外加上特殊符號,以防止錯誤發生
IF "2" == "15" echo "bigger" 

確認環境變數是否存在
IF DEFINED a echo 123
set a=5
IF DEFINED a echo 123
set a=
IF DEFINED a echo 123

2012年9月18日 星期二

Batch教學--Set指令

顯示、計算環境變數
Set /a [expression]
Set /p variable=string
Set /p variable=<file

列出系統的所有環境變數
Set

列出系統以'P'開頭環境變數
Set P

將Amin加入USER環境變數
Set USER=Amin 

清除環境變數
Set USER=

將C:\test加入PATH環境變數
Set PATH=C:\test;%PATH%

環境變數的計算
Set /a a+=1 
運算子 (依照運算優先順序由高到低排列)
()                  - 組成一群
! ~ -               - 一元運算符
* / %               - 數字運算元
+ -                 - 數字運算元
<< >>               - 邏輯位移
&                   - 位元運算 and
^                   - 位元運算 exclusive or
|                   - 位元運算 or
= *= /= %= += –=    - 指定
&= ^= |= <<= >>=
,                   - 運算式分隔字元
各進制計算
SET /A Result=020          REM 八進制進算 
SET /A Result=16           REM 十進制進算
SET /A Result=0x10         REM 十六進制進算
SET /A Result=010+0x20-24  REM 混合進算

等待使用者輸入數值或字串再設定至環境變數a
Set /p a=

將檔案內容導入環境變數a
Set /p a=<file.txt

2012年9月17日 星期一

使用RW讀寫Smbus device

在網路上介紹透過RW或是RU來操作SMBus的資料很少,好不容易才找到可以參考的且實用的網頁,不過說明的又很有限,所以在此完整的說明操作流程。

1.下載安裝RWEverything,開啟RW中PCI Device table列表,找Smbus controller,如Intel PCH SMbus controoler: D31:F3,將預設以1 Byte顯示方式改為 4 Byte。
2.找到SMB_BASE的位置 , 如: offset 20h~23h。


3.右鍵點選”Open IO Space”, 開啟對應的IO Space table。


4.以下即開始介紹藉由IO操作SMBus讀寫Device的方法
(1)我們先來看幾個常用的暫存器。

(2)下面分別介紹Byte read、Word read、Block read讀取資料的步驟。

Byte read:
Step1:
清除暫存器狀態:SMB_BASE + 0x00 → Host Status。
填入0xFE清除暫存器狀態,數值變化的狀態0x40 → 0xFE → 0x00 → 0x40。

Step2:
填入裝置在SMBus的位址:SMB_BASE + 0x04 → Slave Address。
如Memory Slave Address 為0xA0~0xA6,Bit0=1代表read,所以填入0xA0 + 1 = 0xA1。

Step3:
指定欲讀取裝置內資訊擺放的起點:SMB_BASE + 0x03 → HOST Command。
讀取裝置內資訊的起始位置,從頭開始讀取,這裡先填0x00。

Step4:
選擇執行的方式與啟動:SMB_BASE + 0x02 → Host Control。
填入0x48,Bit6=1代表開始執行、Bit2~4代表選擇要使用的執行方式。



Step5:
讀取資料:SMB_BASE + 0x05 → Host Data0。
返回裝置內指定位置的資訊。



Word Read:
Step1:
清除暫存器狀態:SMB_BASE + 0x00 → Host Status。
填入0xFE清除暫存器狀態,數值變化的狀態0x40 → 0xFE → 0x00 → 0x40。

Step2:
填入裝置在SMBus的位址:SMB_BASE + 0x04 → Slave Address。
如Memory Slave Address 為0xA0~0xA6,Bit0=1代表read,所以填入0xA0 + 1 = 0xA1。

Step3:
指定欲讀取裝置內資訊擺放的起點:SMB_BASE + 0x03 → HOST Command。
讀取裝置內資訊的起始位置,從頭開始讀取,這裡先填0x00。

Step4:
選擇執行的方式與啟動:SMB_BASE + 0x02 → Host Control。
填入0x4C,Bit6=1代表開始執行、Bit2~4代表選擇要使用的執行方式。
SMB_BASE + 0x00 數值變化的狀態:0x40 → 0x42。
SMB_BASE + 0x02 數值變化的狀態:0x4C → 0x0C。



Step5:
讀取資料:SMB_BASE + 0x05 → Host Data0。
返回裝置內指定第一位置的資訊。

Step6:
讀取資料:SMB_BASE + 0x06 → Host Data1。
返回裝置內指定第二位置的資訊。


Block read:
Step1:
清除暫存器狀態:SMB_BASE + 0x00 → Host Status。
填入0xFE清除暫存器狀態,數值變化的狀態0x40 → 0xFE → 0x00 → 0x40。

Step2:
填入裝置在SMBus的位址:SMB_BASE + 0x04 → Slave Address。
如Memory Slave Address 為0xA0~0xA6,Bit0=1代表read,所以填入0xA0 + 1 = 0xA1。

Step3:
指定欲讀取裝置內資訊擺放的起點:SMB_BASE + 0x03 → HOST Command。
讀取裝置內數值的起始位置,從0x01頭開始讀取。

Step4:
選擇執行的方式與啟動:SMB_BASE + 0x02 → Host Control。
填入0x54,Bit6=1代表開始執行、Bit2~4代表選擇要使用的執行方式。
SMB_BASE + 0x00 數值變化的狀態:0x40 → 0xC1。
SMB_BASE + 0x02 數值變化的狀態:0x54 → 0x14。


Step5:
取得資料的長度:SMB_BASE + 0x05 → Host Data0。
回傳數值位元組數,該值也是愈讀取裝置啟始點的數值資料。


Step6:
SMB_BASE + 0x07 → HOST_BLOCK_DB。
返回block讀取的第一個位元組,該值為Step3指定起點 + 1數值。


Step7:
取得Block read全部數值:SMB_BASE + 0x00 → Host Status。
寫0xFF清除狀態位元,表示該筆資料已取走,通知SMBus傳回下一筆資料至offset 0x07的位置。
數值變化的狀態:0xC1 → 0xFE → 0x81 → 0xC1。
最後一筆資料顯示狀態:0xC1 → 0xFE → 0x82 → 0xC2。

以此類推,重複做Step7動作直到這個block讀完。

資料來源:怎樣在RU下讀寫Smbus device

2012年9月15日 星期六

使用Internet Explorer object下載每日上櫃交易明細


抓取上櫃交易明細需要使用POST來傳遞參數,在VBA中能使用的方法就是使用XmlHttp。
不過我們想嘗試使用其他Excel VBA抓取網頁數據的方法來抓取,於是選用了Internet Explorer物件來試著抓取上櫃交易明細。

如下使用Internet Explorer物件抓取上櫃交易明細
Option Explicit
Sub ie_test_Navigate_PostData()
    Dim objIE As Object
    Dim bPostData() As Byte
    Dim xlURL As String
    Dim UrlHeaders As String

    xlURL = "http://www.gretai.org.tw/ch/stock/aftertrading/broker_trading/download_ALLCSV.php"
    UrlHeaders = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
    bPostData = StrConv("stk_date=1010914&curstk=5349", vbFromUnicode)
    
    Set objIE = CreateObject("InternetExplorer.Application")
    With objIE
        .Visible = True
        .Navigate xlURL, , , bPostData, UrlHeaders
        While .ReadyState <> 4 Or .Busy = True
            DoEvents
        Wend
    End With
End Sub
雖然可以透過InternetExplorer物件來抓取上櫃交易明細,但當順利取得檔案時卻因需要點選下載檔案對話框,因此這裡可能就無法使用InternetExplorer物件抓取。


對於Navigate進階的使用可參考這裡

VC++, JavaScript的日期函數使用

因工作要使用VC++時間處理函數,加上近期在研究Highstock也需要使用到JavaScript時間處理函數,所以將兩者處理時間的方法一起列出

以下是一個使用VC++時間處理類別CTime的範例
int main(int argc, TCHAR* argv[])
{
 CTime cTime = CTime::GetCurrentTime(); 
 printf("Year : %d\n", cTime.GetYear());
 printf("Month : %d\n", cTime.GetMonth());
 printf("Day : %d\n", cTime.GetDay());
 printf("Hour : %d\n", cTime.GetHour());
 printf("Minute : %d\n", cTime.GetMinute());
 printf("Second : %d\n", cTime.GetSecond());
 printf("Time : %d\n", cTime.GetTime());
 return 1;
}
執行結果

以下是一個使用JavaScript時間處理函數的範例
<html>
  <head>
  <title>JavaScript Test Date Function</title>
  <script type="text/javascript">
    function run() {
      var CurrentTime = new Date();
      document.write("Year : " + (CurrentTime.getYear() + 1900) + "<br>")
      document.write("Month : " + (CurrentTime.getMonth() + 1) + "<br>")
      document.write("Date : " + CurrentTime.getDate() + "<br>")
      document.write("Hours : " + CurrentTime.getHours() + "<br>")
      document.write("Minutes : " + CurrentTime.getMinutes() + "<br>") 
      document.write("Seconds : " + CurrentTime.getSeconds() + "<br>")
      document.write("Time : " + CurrentTime.getTime() + "<br>")
    }
  </script>
  </head>
  <body onload = run();>
  </body>
</html>
執行結果

兩者的差異

VC++
JavaScript
Time
Second
Millisecond
Year
不加1900
需加1900
Month
1為起點,範圍1~12
0為起點,範圍0~11

2012年9月8日 星期六

使用Stored Procedure取得SQLyog的版本

透過SQLyog寫一個Stored Procedure(預存程序),來取得SQLyog版本資訊
DELIMITER //
CREATE
    PROCEDURE `stock`.`GetDBVersion`(OUT VERSION VARCHAR(60),OUT DAY VARCHAR(60))
    LANGUAGE SQL NOT DETERMINISTIC
    CONTAINS SQL SQL SECURITY DEFINER
    BEGIN
        SELECT VERSION() INTO VERSION;
        SELECT CURDATE() INTO DAY;
    END//
DELIMITER ;

取得SQLyog版本資訊前先初始化GetDBVersion預存程序
CALL GetDBVersion(@version,@day);

再下SQL指令取得版本
SELECT @version,@day;

執行結果

2012年9月7日 星期五

使用Stored Procedure列出交易日

透過SQLyog寫一個Stored Procedure(預存程序),來產生一個連續日期的序列
DELIMITER $$
CREATE
    PROCEDURE `stock`.`gen_time_sequence`(startstamp TIMESTAMP, endstamp TIMESTAMP, intval INTEGER, unitval VARCHAR(10))
    BEGIN
 DECLARE thisStamp TIMESTAMP;
 DECLARE nextStamp TIMESTAMP;
 SET thisStamp = startstamp;

 -- Drop and Create the temp table

 DROP TEMPORARY TABLE IF EXISTS timestamp_sequence;

 CREATE TEMPORARY TABLE IF NOT EXISTS timestamp_sequence(
 id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,    
 TIME TIMESTAMP
 );    
  
 -- 迴圈, 每次增加間隔
 REPEAT 
  SELECT CASE unitval
   WHEN 'MICROSECOND' THEN TIMESTAMPADD(MICROSECOND, intval, thisStamp)
   WHEN 'SECOND'      THEN TIMESTAMPADD(SECOND, intval, thisStamp)
   WHEN 'MINUTE'      THEN TIMESTAMPADD(MINUTE, intval, thisStamp)
   WHEN 'HOUR'        THEN TIMESTAMPADD(HOUR, intval, thisStamp)
   WHEN 'DAY'         THEN TIMESTAMPADD(DAY, intval, thisStamp)
   WHEN 'WEEK'        THEN TIMESTAMPADD(WEEK, intval, thisStamp)
   WHEN 'MONTH'       THEN TIMESTAMPADD(MONTH, intval, thisStamp)
   WHEN 'QUARTER'     THEN TIMESTAMPADD(QUARTER, intval, thisStamp)
   WHEN 'YEAR'        THEN TIMESTAMPADD(YEAR, intval, thisStamp)
   END INTO nextStamp;
  -- 過濾週六,週日與特殊日子
  IF DAYOFWEEK(thisStamp) <> 1 AND DAYOFWEEK(thisStamp) <> 7 OR DATE(thisStamp) = STR_TO_DATE('2012-08-02', '%Y-%m-%d') THEN
   INSERT INTO timestamp_sequence(Dateid, Weekdayid) SELECT DATE(thisStamp), DAYOFWEEK(thisStamp);
  ELSEIF DATE(thisStamp) = STR_TO_DATE('2012-03-03', '%Y-%m-%d') THEN
   INSERT INTO timestamp_sequence(Dateid, Weekdayid) SELECT DATE(thisStamp), DAYOFWEEK(thisStamp);
  END IF;
  SET thisStamp = nextStamp;
 UNTIL thisStamp >= endstamp
 END REPEAT;
    END$$
DELIMITER ;

要產生時間序列前先初始化gen_time_sequence預存程序
CALL gen_time_sequence('2012-01-01','2012-12-31', 1, 'DAY');  

取得時間序列產生的天數,執行以下SQL指令
SELECT COUNT(1) FROM timestamp_sequence;

執行結果

取得時間序列中的前10筆資料
select * from timestamp_sequence limit 10;

執行結果

2012年8月31日 星期五

資訊站台

國外網站
財經網
財經論壇
綜合型(技術面+基本面)---部落格
技術面---部落格
基本面---部落格
綜合型工具(基本面、技術面、籌碼面)
技術面工具
基本面工具
期貨選擇權
籌碼面工具
籌碼明細查詢
權證工具
其他資訊
財經單位

學習推薦

有投資課程
基本面書籍
  • 操盤人教你看財務報表     ISBN:9789867283245
  • 一次就懂:怪老子帶你看懂財報選好股     ISBN:9789867283412
  • 賺錢的邏輯你懂了!用大白話說的財務報表速讀術   ISBN:9789866316128
  • 財報的秘密—探索財報數字內涵,掌握公司價值變化   ISBN:9789866511158
  • 打敗外資賺大錢   ISBN:9789867615053(絕版書)
  • 聰明買台股   ISBN:9789868346529(絕版書)
技術面書籍
  • 技術分析不設防:化繁為簡   ISBN:9789866366017
Multicharts書籍
  • PowerLanguage程式交易語法大全   ISBN:9789866320156
  • multicharts快譯通   ISBN : 9789866320309
  • 分析師關鍵報告:期貨交易篇   , ISBN:9789866320408
  • 分析師關鍵報告2:張林忠教你程式交易   ISBN:9789866320743
  • 股市的科學煉金術:程式交易全圖解   ISBN:9789867283528
Python教學
Python參考書籍
  • Python 入門   ISBN:9578247354 (絕版書)
  • Python Web開發學習實錄   ISBN:9787302266334 (簡體書)
  • Python 程式設計入門 (適用於 2.x 與 3.x 版)    ISBN:9789864340057 (適合入門)
  • 金融科技實戰:Python與量化投資    ISBN:9864342703 (適合入門)
  • Python 入門邁向高手之路王者歸來    ISBN:9865000598 (適合入門)
Excel VBA線上教學
Excel VBA參考書籍
  • 超圖解Excel VBA 基礎講座   ISBN:9789574423439 (適合入門)
  • 超圖解Excel VBA 應用講座   ISBN:9789574423996 (適合入門)
  • 跟我學Excel VBA   ISBN:9789862760352(適合入門)
  • 跟我學Excel VBA:將複雜的操作用一個按鍵就搞定!(適用2016/2013/2010/2007)   ISBN:9789862769843 (適合入門)
  • Excel VBA 巨集的職場效率術:無痛學習 VBA程式×步驟式教學錄製巨集×200個範例立即套用  ISBN:9789864342839(適合入門)
  • Excel VBA基礎必修課-增量版(適用Excel 2016/2013/2010)   ISBN:9789864763948(適合入門) 
  • Excel VBA與巨集程式設計:新手入門就靠這一本   ISBN:9789862016909 (適合進階)
  • Excel VBA一點都不難:一鍵搞定所有報表   ISBN:9789862017562  (適合進階)
  • Excel VBA徹底研究   ISBN:9789575277239 (絕版書、適合進階)
  • Excel與外部資料無縫整合:使用Excel VBA與SQL建置小型系統與資料分析,快速提昇辦公效率200問   ISBN:9789862015889
  • 詳解Excel+Access的資料庫整合應用實務   ISBN:9789862012376
  • Excel 2003 Power Programming with VBA
Excel VBA討論區
JavaScript
其他
線上虛擬交易

關於 Amin 作者與網站

Resume

個人背景

大學念電機系以C語言寫程式,碩士論文題目與生物資訊相關「DNA蛋白質摺疊結構預測」,以C++、Perl、Shell作為研究的使用語言,畢業後在工作上則以C/C++為主要語言,開發MFC Windows視窗,平時自己喜歡使用程式輔助在數據方面的分析與應用,主要語言以Python與Excel VBA為主。
在2012年建立個人網站《iInfo資訊交流》,主要分享網路爬蟲、C/C++、C#、Excel VBA、Python、Google Apps Script、Batch軟體整合應用等相關技術內容為主,歡迎各領域朋友相互交流。

個人網站與粉絲專頁
學歷
  • 台大生物產業機電工程所碩士 (2006~2008),網頁連結
  • 龍華電機工程學系 (1999~2005),網頁連結
  • 大安高工冷凍空調科 (1996~1998),網頁連結
工作經歷
  • 凱衛資訊資深軟體工程師(2015/10 ~ 迄今)
  • 1. 以C/C++開發與維護 Server/Client 軟體。
    2. 以C#、Python開發部分工具程式。
    3. Excel 與 MultiCharts 整合應用講師。

  • 仁寶電腦高級軟體工程師(2008/10 ~ 2015/09)
  • 1. 工廠產線測試軟體與硬體的維護與開發。
    2. 協助廠商開發ODM/OEM 測試軟體。
    3. 以C/C++為主,開發Console與GUI軟體,在Winpe、Windows、UEFI上運作。

  • 台北碩士文化教育事業業務專員(2003/09 ~ 2008/07)
  • 1. 幫助大學生規劃研究所考試的課程內容與分析各類研究所出路。
    2. 到各大專院校校園做行銷企劃與招生業務。
個人著作
  • 大學專題 2003/06
  • 指導教授:黃德豐助理教授

    專題題目
    Windows 2000 Server叢集伺服器環境之建構

  • 大學參與國內期刊 2003/06
  • 指導教授:黃德豐助理教授

    期刊題目
    多級FIR樣本刪減濾波器近似參數選擇
    The optimal multistage multirate digital FIR parameter design
    該期刊名已改成龍華電機系研究生的論文名

  • 研究所論文 2008/08
  • 指導教授:陳倩瑜教授 (現任職於台灣人工智慧實驗室)

    論文題目
    使用ab initio結構預測方法建構蛋白質功能區結構模型之研究
    Constructing Structural Model of Protein Functional Domains using ab initio Structure Prediction
    連結:Https://hdl.handle.net/11296/29qskk

  • 電腦書籍 
  • 2019/04/01碁峰資訊出版《Excel VBA 實戰技巧|金融數據x網路爬蟲》
    連結:Http://books.gotop.com.tw/v_ACI031700 
    1. 本書榮獲 金石堂網路書店 2019年度百大暢銷書 第4名 連結連結
    2. 本書榮獲 博客來書店 2019年度百大度暢銷書 第19名 連結
    3. 本書榮獲 天瓏網路書店 2019年度百大度暢銷書 第46名 連結
專長 
  • C/C++、 Excel VBA、VBScript、Python、Google Apps Script、Batch、C#、MultiCharts
  • 網路資料爬蟲 (Excel VBA、VBScript、Python、Google Apps Script)

教學、演講、活動
【教學】
  • 2020/02~2020/05 行政院勞動部勞動力發展署「Python大數據金融股票期貨網路爬蟲資料分析實務班第01期127617」連結1連結2
  • 2019/12 T客邦「Python打造股票交易策略與LINE股市小秘書」連結
  • 2019/10 輔大經濟系「Python金融大數據爬蟲課」。
  • 2019/08~2019/10 行政院勞動部勞動力發展署「Python大數據金融股票期貨網路爬蟲資料分析實務班第01期124995」連結1連結2
  • 2019/07 iInfo 「Excel VBA 基礎語法班」連結
  • 2019/07 T客邦「Excel VBA 爬蟲實戰技巧,分析網站結構擷取資訊、運用VBA+爬蟲打造數據分析工具」連結
  • 2018/10 輔大經濟系「Python抓取金融數據」。
  • 2017/12 東吳巨資系「Excel VBA爬蟲」。
  • 2017/10 輔大經濟系「Python網頁爬蟲」。
  • 2017/08 連結、2017/10 連結、2018/03 連結 凱衛資訊「Excel與MultiCharts結合」。
【演講】
  • 2019/04 天瓏書局「Excel VBA 實戰技巧|金融數據x網路爬蟲」連結
  • 2019/04 高雄科技大學金資系「金融資訊專題講座」。
  • 2018/08 凱基期貨台北總公司「摩台OI與台指對應策略」。
  • 2018/04 群益期貨台北總公司「Python與台股盤後大數據應用」。
  • 2018/02 群益期貨台北總公司「Excel與DDE應用」。
  • 2016/Q2 凱衛資訊MultiCharts網聚講師。
【活動】
  • 2016/03  iInfo版聚主持人兼講師
個人作品

關於「iInfo 資訊交流」
「iInfo 資訊交流」前身為2008年成立的「iInfo 愛資訊」,主要提供大學生考研究所所需的考情資訊網站,在2012年轉變為程式整合應用網站,希望藉由以下的程式語言,能在網路上結交各位程式愛好者,一起在投資方面創造出更近一步的應用。
  • Python、Excel VBA、MySQL、C/C++、JavaScript、CSS、Batch、C#

2012年8月28日 星期二

使用xmpp操控Gtalk

下載安裝xmpppy-0.4.0.win32.exe : http://sourceforge.net/projects/xmpppy/files/xmpppy/0.4.0/
開起Python輸入以下程式碼,並修改所需的測試帳號即可開始操控Gtalk
#Python語言: python gtalk機器人
# coding: utf-8
# 這是根據xmpp封裝的Jabber聊天機器人類, 可以通過繼承,重載部分函數來自定義功能.
# Jabber ID(JID): 比如gamcat@gmail.com
import xmpp

class Bot:
    """ Jabber Bot Base Class """
    JID = ''
    PASSWORD = ''

    client = None   

    def __init__ (self, jid, password):
        self.JID = xmpp.JID(jid)
        self.PASSWORD = password

        self.login()

    def login (self):         
        self.client = xmpp.Client(self.JID.getDomain(), debug=[])
        if self.client.connect() == '':
            raise 'JabberBot not connected.'
        if self.client.auth(self.JID.getNode(), self.PASSWORD) == None:
            raise 'JabberBot authentication failed.'
        
        self.client.RegisterHandler('message', self.message_callback)
        self.client.RegisterHandler('presence', self.presence_callback)
        self.client.sendInitPresence()

    def message_callback (self, client, message):
        """ 默認消息回調(可通過繼承自定義) """

    def presence_callback (self, client, message):
        """ 默認事件回調,包括下面幾個(可通過繼承自定義) """
        type = message.getType()
        who = message.getFrom().getStripped()

        if type == 'subscribe':
            self.subscribe(who)
        elif type == 'unsubscribe':
            self.unsubscribe(who)
        elif type == 'subscribed':
            self.subscribed(who)
        elif type == 'unsubscribed':
            self.unsubscribed(who)
        elif type == 'available' or type == None:
            self.available(message)
        elif type == 'unavailable':
            self.unavailable(who)

    def subscribe (self, jid):
        """ 加好友 """
        self.client.send(xmpp.Presence(to=jid, typ='subscribed'))
        self.client.send(xmpp.Presence(to=jid, typ='subscribe'))

    def unsubscribe (self, jid):
        """ 取消好友 """
        self.client.send(xmpp.Presence(to=jid, typ='unsubscribe'))
        self.client.send(xmpp.Presence(to=jid, typ='unsubscribed'))

    def subscribed (self, jid):
        """ 已加 """

    def unsubscribed (self, jid):
        """ 已退 """
        
    def available (self, message):
        """ 上線 """

    def unavailable (self, jid):
        """ 下線 """

    def send (self, jid, message):
        """ 發消息給某人"""
        self.client.send(xmpp.protocol.Message(jid, message))

    def step (self):
        """ 用在迴圈中 """
        try:
            self.client.Process(1)
        except KeyboardInterrupt:   # Ctrl+C停止
            return False
        return True

#===========================
# 測試
#===========================
class Bot(Bot):
    def message_callback (self, cl, msg):
        fromid = msg.getFrom().getStripped()
        cont = msg.getBody()
        self.send2admin(msg)

    def send2admin (self, message):
        self.send('admin@gmail.com', 'Test')

if __name__ == '__main__':
    gb = Bot ('yourbot@gmail.com', '******')
    gb.send2admin ('Bot Started')

    # 開始運行
    while (gb.step()): pass

程式碼來源 : Python Gtalk機器人

使用pyxmpp操控Gtalk


搭配以下Python程式碼,即可對Gtalk發送訊息
#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyxmpp.jid import JID
from pyxmpp.message import Message
from pyxmpp.jabber.client import JabberClient
from pyxmpp.jabber.simple import send_message
from pyxmpp import streamtls

class Gtalk():
    def __init__(self, sid, spwd):
        self.sid = JID(sid)
        self.spwd = spwd

    def send_msg(self, rid,  msg):
        self.rid = JID(rid)
        if not self.sid.resource:
            self.sid = JID(self.sid.node, self.sid.domain, 'send_message')

        msg = Message(to_jid=self.rid, body=msg)
        def send(stream):
            stream.send(msg)

        self.xmpp_do(send)

    def xmpp_do(self, function):
        class Client(JabberClient):
            def session_started(self):
                function(self.stream)
                self.disconnect()

        tls = streamtls.TLSSettings(require=True, verify_peer=False)
        auth = ['sasl:PLAIN']
        gtalkClient = Client(self.sid, self.spwd, tls_settings=tls, auth_methods=auth)
        gtalkClient.connect()
        try:
            gtalkClient.loop(1)
        except KeyboardInterrupt:
            print u'disconnecting...'
            gtalkClient.disconnect()

if __name__ == '__main__':
    g = Gtalk('account@gmail.com', u'password')
    g.send_msg('to@gmail.com', 'Hello World')

程式碼來源 : 比較win32下python與java通過實現XMPP協定發送gtalk消息

2012年8月27日 星期一

在windows安裝pyxmpp,架設gtalk機器人

Google Talk是在geek中相當流行的一款IM用戶端,其採用了jabber的開放式協議xmpp,使得第三方開發非常方便。

jabber.py早已經被廢棄,不推薦
xmpppy是jabber.py的繼承者,使用方便簡單,有彩色debug輸出(如果你的shell支援彩色的話)
xmpppy適合羽量級的開發,不需要依賴其他python庫
pyxmpp是最符合XMPP和jabber協議的庫,作者本身就是Jabber標準組的成員之一
pyxmpp的安裝比xmpppy麻煩的多。需要libxml2、dnspython和M2Crypto,可惜不支持Win32

以下將介紹如何在windows下安裝pyxmpp環境

1. 下載安裝Python 2.7.3 : http://www.python.org/download/releases/2.7.3/
2. 下載安裝M2Crypto-0.20.2.win32-py2.7.exe : http://chandlerproject.org/Projects/MeTooCrypto#Downloads
3. 下載安裝dnspython-1.6.0.win32.exe : http://www.dnspython.org/kits/1.6.0/
4. 下載安裝libXML2 : http://xmlsoft.org/sources/win32/python/
5. 下載pyxmpp-1.1.2.tar.gz : https://github.com/Jajcus/pyxmpp/downloads/  (一定使用這裏這裡的安裝)
6. 將pyxmpp-1.1.2.tar.gz 解壓縮至C:\Python27\Lib中
7. 開啟命令提示字元,將操作目錄切換至C:\Python27\Lib\pyxmpp-1.1.2中 : "cd C:\Python27\Lib\pyxmpp-1.1.2"
8. 確認安裝pyxmpp所需的安裝資料庫與程式 : 輸入"configure.py" 執行
9. 建立pyxmpp安裝檔 : 輸入"python setup.py build" 執行
10. 開始安裝pyxmpp : 輸入"python setup.py install" 執行

2012年8月26日 星期日

Python與Excel連結的模組

在一次網路收尋資料中,發現了兩個可以透過python操作excel的簡單模組,分別是pyxll、openpyxl。代我先了解如何使用後,再將範例清楚的貼在文章上

2012年8月25日 星期六

Excel VBA使用正規化取得字串內容

一次的意外發現,原來VBA中也可以使用Regular Expression,以下使用個範例來幾單說明使用,後續再補充完整的內容
Option Explicit

Private Sub TestReg()
    Dim reg As Object
    Dim mc As Object
    Dim m As Object
    
    Set reg = CreateObject("vbscript.regExp")
    With reg
        .Global = True
        .IgnoreCase = True
        .Pattern = "\d+"
    End With

    Set mc = reg.Execute("123aaaaa987uiiui999")
    For Each m In mc
        MsgBox m.Value
    Next
End Sub

2012年8月23日 星期四

Excel VBA抓yahoo finance各項歷史成交資訊


歷史資料工作表中加入一個名為"下載"按鈕,如上圖中粉紅色按鈕,加入以下的程式碼
Option Explicit
Private Sub 歷史成交資訊_Click()
    Dim xlStockid As String, URL As String
    xlStockid = Range("B1")
    UsedRange.Offset(4).Clear
    URL = "http://ichart.finance.yahoo.com/table.csv?s=" & xlStockid & "&a=00&b=1&c=1998&d=" & Format(Month(Date) - 1, "00") & "&e=" & Day(Date) & "&f=" & Format(Year(Date), "0000") & "&g=d&ignore=.csv"
    
    With Workbooks.Open(URL)
        .Sheets(1).UsedRange.Offset(1).Copy [a5]
        .Close 0
    End With
End Sub

想要取得上市股票的歷史成交資訊,股票代碼請輸入".TW",如台泥 1101.TW
想要取得上櫃股票的歷史成交資訊,股票代碼 請輸入".TWO",如新普 6121.TWO
以上要注意有點"."的部份

各類指數名稱
對應代碼
美元兌台幣的歷史
USDTWD=x
台灣證交所

加權指數
^TWII
不含金融股
^TIWI
金融保險類
^TFNI
大陸

深圳綜合
^SZSC
深圳成份
^SZSC1
A股指數
^SZSA
A股成份
^SZSA1
B股指數
^SZSB
B股成份
^SZSB1
綜合指數
^SSEC
A股指數
^SSEA
B股指數
^SSEB
工業指數
^SSEI
商業指數
^SSEM
地產指數
^SSEP
公用事業
^SSEU
香港證交所

恆生指數
^HSI
金融指數
^HSNF
公用事業指數
^HSNU
地產指數
^HSNP
工商指數
^HSNC
中國企業指數
^HSCE
中資企業指數
^HSCC
亞太地區

中國 上海綜合指數
000001.SS
香港 恆生指數
^HSI
日本 Nikkei 225
^N225
新加坡 海峽時報指數
^STI
南韓 漢城綜合指數
^KS11
印度 BSE 30
^BSESN
印尼 雅加達指數
^JKSE
馬來西亞 KLSE Composite
^KLSE
澳洲 All Ordinaries
^AORD
菲律賓 PSE Composite
^PSI
斯里蘭卡 All Share
^CSE
歐洲

奧地利 ATX
^ATX
法國 CAC 40
^FCHI
德國
^GDAX
英國 FTSE 100
^FTSE
非洲/中東

埃及 CMA
^CCSI
以色列 TA-100
^TA100