2012年5月29日 星期二

程式交易─淺談順勢系統


程式交易的主要作用是─利用已知的歷史資料統計交易方法的績效。你可以有很多交易方法,但在績效不明前,如果貿然進入市場交易,那你可能是嫌錢太多了。就我所知,大多數賺錢的交易系統是所謂的順勢系統。看過許多的資料後,我發現“波段交易”是一種真正能產生利潤的交易方法。如下圖所示,這是一個簡單且合理的台指期貨順勢交易系統,搭配簡單的加碼、停損、停利機制,卻可產生驚人的效果。整個系統已考慮滑價、換倉、手續費、期交稅等等所有的成本,每口雙邊(一買一賣)交易成本為 4000 元,系統同時最多擁有 2 口大台。統計資料從 2001 年 1 月 1 日至 2003 年 11 月 7 止。平均每個月不含換倉,只交易 3 口單,換句話說,實在沒有必要去賺當沖的辛苦錢。套句 Larry Williams(首創威廉指標)的話,“你交易的時段越短,賺的錢越少”。

不算加碼,整個系統的(報酬/風險)比約為 2。不計加碼,(報酬/風險)比小於 1.5 的系統,千萬不要用。由圖中你不難發現,當系統連續大賠後,就是大賺的開始,反之亦然。如果將 Elliott Wave 考慮進去,你可以逃過某一段連續大賠的日子,但不是全部。所以,等待是值得的。以下數據不是最佳化後的數據,但離最佳化數據也不遠。Account size required $382,600.00 也就是說至少要 50 萬元才能使用此系統,這個程式是 2002 年底完成的,也就是說 2003 年開始才是真正在市場的績效,這點很重要,─般程式交易系統的績效在正式進入市場後,大多會下降很多,這是程式的績效最佳化後所帶來的後遺症。

滑價佔整個交易成本的比重是很大的,由於只能在買賣訊號發出後追價進場,因此進場價通常要比買賣訊號發生時的價格要差,而價差有可能大到 30 點,一般是在 10 點之內。我們不猜頭摸底,同樣的,我們也不猜買賣訊號是否發生。

每個交易市場都有其自我的特性,這些可以從歷史資料中觀察出來,金指的方向沒有大台指明顯,如果可能,盡量做大台指不要做金指,交易量大也是選擇大台指的原因之一。大台指的特性約同電指,但震盪較電指小一些。當然,交易市場的特性是會隨時間而改變的。Max intraday drawdown,為最大連續損失,如果將測試時間加長,這個數字會放大一倍,整個系統的(報酬/風險)比約為 3 ,也就是說,這個系統還不是非常穩定。產生最大連續損失的時候,通常也是均線糾結、走平的時候。解決的方法有二,一是“等待”,二是加入另一個特性相反的程式,用以降低最大損失。有句話說的好,“如果你能夠控制盤整,你就能控制整個世界”。以上只是個人交易上的一點淺見,如有謬誤,還請諒解。

虧損始終來自人性
程式交易本身還是需要人去執行
當發生連續虧損時
生活的壓力可能會迫使操作者無法確實執行交易訊號

總歸一句話
執行力才是重點

XMPP協定已一統即時訊息協定標準


自由軟體鑄造場得知Microsoft 打開 Messenger 大門 開始支援 XMPP,因此目前主流即時訊息都支援XMPP,包括Facebook chat
既然如此,當然找看看熟悉的Smack套件是否也有MSN的sample code。果然Github上有MS放出的LiveSDK,便有JAVAAndroid的程式碼。有空再把拿token那程式改成用httpclient
JAVA程式碼如下:
package messenger;

import java.net.URL;
import java.net.URLDecoder;

import javax.swing.JOptionPane;

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.MessageTypeFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.util.StringUtils;

/**
 * XmppClient class has all the XMPP specific logic. This class uses smack
 * library to connect to windows live messenger service. For Windows Live Xmpp
 * documentation see <link>
 */
public class msn {

public static final String Host = "xmpp.messenger.live.com";
public static final int Port = 5222;
public static final String Service = "messenger.live.com";

private String accessToken;
private XMPPConnection connection;

/**
 * This block initializes smack with SASL mechanism used by Windows Live.
 */
static {
SASLAuthentication.registerSASLMechanism("X-MESSENGER-OAUTH2",
XMessengerOAuth2.class);
SASLAuthentication.supportSASLMechanism("X-MESSENGER-OAUTH2");
}

public static void main(String[] args) throws InterruptedException {
/**
 * 1. Set up a string with the path to the website.
 * 2. Create a desktop variable.  The desktop class uses the computer's default browser to open the URL.
 * 3. Load the URL.
 * 4. Browse to the URL.
 */

//TODO put your own clientId here.
//String clientId = "000000004807AE0A";
//String scopes = "wl.messenger";
//String signInUrl = "https://oauth.live.com/authorize?client_id=" + clientId + "&redirect_uri=https://oauth.live.com/desktop&response_type=token&scope=" + scopes;

try {
// launch a web browser to take the user through the OAuth 2.0 consent flow
//BareBonesBrowserLaunch.browse(signInUrl);

// pop a dialog that tells the developer to copy and paste the URL and put it into a text box in the dialog
//String returnUrlString = (String)JOptionPane.showInputDialog("After completing the OAuth consent flow in the browser, copy and paste the return URL into this dialog box");
String returnUrlString = "https://oauth.live.com/desktop#access_token=EwAoAq1DBAAUlbRWyAJjK5w968Ru3Cyt%2f6GvwXwAAcQc5qjgPRbE4InoTBM3bsPTd0eAZIcSZiRxdNSMn3K8jSLvqJjDBfhjf3fd71C%2fBlGBFqDAs%2fFZYb1WYDPUfbL239Y3sXKA8ZFZgMOKIWWb%2beib%2fyTpNIW6m4O4SUMhAu5GYe3DAiC7JsXAnLgu%2bUFeUpF%2fEMjmrdRGzVDUjNNuwfKgdqpgvBD5kWAU1A3NNGhwxJZZhwOpKcogIcWZ%2fR7eKdFsYjGN9riWjBh2gcmk%2bGiEMifAxI0PoqeECqq9otHAZ1fz9NxCUbFssIQuy5mxlzjPu%2fWl9wmwRvZnHkDY4EiuDrfUw6SHflWirQ74nQ2fjv7Ew7Dk4nl%2fvvTymxcDZgAACPsOZ%2fNUm4kh%2bABDsVcnU0eMbHeEikN9WrYIwYTrTQKy2WtThAVuuNwsJOiqgyP%2fInBCWZMudPy0qGOlFoJriKm16OiYrgf44t9aua6MO7Lq0hJchmmbBm9%2fEsSquOhKaLOrNgx%2fVPs%2bqycd6sBkqzPJMD69eIztb%2fPnllMbX%2f4qDz1cUU1ySkE%2f3%2bMlENfPDKiNARAvKxSpljsM6yjMgwPCTawChrUgExYjbeGxAR16vY1N7ibTmwcgIB9ewoyghGeNBI7GHBdpOMzBbp%2b6YZQYBDHwPc7SXYoxPq1s8TAlfdXrrpj2J2kEpxuwPGM6VnBJN1yOdFsolRENflmAkTCh4gAA&token_type=bearer&expires_in=3600&scope=wl.messenger";
// take the string URL from the dialog and programmatically cram it into the access token parameter
String accessToken = urlTokenizerHelper(returnUrlString);

// log in using the access token
msn client = new msn(accessToken);
client.logIn();
Roster r = client.getRoster();
System.out.println(r.toString());
// make sure the program hasn't already closed before the login has completed
// in a real XMPP client, this would be replaced with waiting on UI events and Xmpp events 
Thread.sleep(1000000);
} catch (Exception e) {
System.out.println(e);
}
}

/**
 * This function helps to extract the access_token query string parameter from the return URL.
 */
public static String urlTokenizerHelper(String urlString) {
URL returnUrl = null;
try{
returnUrl = new URL(urlString);
}catch(Exception e){}
String queryParameters = returnUrl.getRef();
queryParameters = queryParameters.substring(queryParameters.indexOf("access_token"));
queryParameters = queryParameters.substring(queryParameters.indexOf("=")+1);

String encodedAccessToken = queryParameters.substring(0, queryParameters.indexOf("&"));

return URLDecoder.decode(encodedAccessToken);

}
/**
 * Constructor
 * 
 * @param accessToken
 *            The OAuth2.0 access token to be used for login.
 */
public msn(String accessToken) {
this.accessToken = accessToken;
}

/**
 * Get the Roster for this client instance.
 * 
 * @return The full Roster for the client.
 */
public Roster getRoster() {
return this.connection.getRoster();
}

/**
 * Get the Jid for this client instance.
 */
public String getLocalJid() {
return StringUtils.parseBareAddress(this.connection.getUser());
}

/**
 * Log in the client to the messenger service.
 */
public void logIn() {

// Create a connection. We use service name in config and asmack will do
// SRV look up locate the xmpp server.
ConnectionConfiguration connConfig = new ConnectionConfiguration(
msn.Service);
connConfig.setRosterLoadedAtLogin(true);
this.connection = new XMPPConnection(connConfig);

try {
this.connection.connect();

// We do not need user name in this case.
this.connection.login("", this.accessToken);
} catch (XMPPException ex) {
this.connection = null;
return;
}

System.out.println(String.format("Logged in as %s",
this.connection.getUser()));
// set the message and presence handlers
this.setPacketFilters();

// Set the status to available
Presence presence = new Presence(Presence.Type.available);
this.connection.sendPacket(presence);
}

/**
 * Send a text message to the buddy.
 * 
 * @param to
 *            The Buddy Jid.
 * @param text
 *            The text message to be sent.
 */
public void sendMessage(String to, String text) {
Message msg = new Message(to, Message.Type.chat);
msg.setBody(text);
this.connection.sendPacket(msg);
}

/**
 * Set the packet filters for handling incoming stanzas.
 */
private void setPacketFilters() {
if (this.connection != null) {
PacketFilter presenceFilter = new PacketTypeFilter(Presence.class);
this.connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
Presence presence = (Presence) packet;
handlePresenceReceived(presence);
}
}, presenceFilter);

PacketFilter messageFilter = new MessageTypeFilter(
Message.Type.chat);
this.connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
Message message = (Message) packet;
if (message.getBody() != null) {
handleMessageReceived(message);
}
}
}, messageFilter);
}
}

/**
 * Handle the presence stanza received.
 * 
 * @param presence
 *            The received presence stanza.
 */
private void handlePresenceReceived(Presence presence) {
String from = StringUtils.parseBareAddress(presence.getFrom());
System.out.println(String.format(
"Presence received from Jid: %s, Name: %s", from,
this.getContactName(from)));
}

/**
 * Handle the message stanza received.
 * 
 * @param message
 *            The received message stanza.
 */
private void handleMessageReceived(Message message) {
String from = StringUtils.parseBareAddress(message.getFrom());
System.out.println(String.format(
"Message received from Jid: %s, Name: %s", from,
this.getContactName(from)));
}

/**
 * Get friendly name of a contact given the jid.
 * 
 * @param jid
 *            Jid for the target contact.
 * 
 * @return The friendly name by looking up roster.
 */
private String getContactName(String jid) {
Roster roster = this.connection.getRoster();
RosterEntry entry = roster.getEntry(jid);
return entry.getName();
}
}


建置程式交易系統(4) - 逆勢策略

上一篇的建置程式交易系統(3) - 模式辨識介紹了簡單的模式辨識(pattern recognition)順勢策略。依據這基礎再衍伸出逆勢的策略,也就是取頭部或底部來賺反彈差價。
這假設是,既然有突然的大波動,便表示會有反彈,只要在頭部或底部確認後,進場作逆勢,可能可以獲利。
舉例來說,2012-04-09的台指期走勢如下:逆勢策略
從圖中可看出,08:52時有一個急跌,經過篩選,程式不進場,便開始抓取最低值,取底部,終於在09:05時開始拉回,確定拉回一段後,程式才進場作多,最後在09:43跌回時便出場停利以免又跌回去。這交易紀錄可比對期貨程式交易機器人4/9的交易紀錄
以上簡單說明期貨程式交易機器人的逆勢策略,之後再說明停利停損等規則。

建置程式交易系統(3) - 模式辨識

之前建置程式交易系統(2) - 決定獲利策略談到模式辨識(pattern recognition),本篇將說明那期貨程式交易機器人如何利用slide window和pattern來判別順勢進場點。
因報價都是tick data,一般都是用K棒來分析,但最小單位只能到一分K,在波動大時,幾秒鐘就變動很大,因此程式交易機器人是直接用tick值,但tick資料難免會有雜訊干擾,導致無法判斷正確走勢﹑,便利用訊號處理技術,將tick資料的雜訊過濾。而雜訊過濾技術有很多種,如FFTDCT等,個人是選擇DWT,因為這DWT只有加減法,能夠很快速處理。
因此,透過不斷輸入的tick資料,這程式只處理N個tick值,請見下圖。
slide window
而這N個tick,就可看成一個slide window,隨著資料進入而滑動。
那針對這N個tick,使用DWT處理後,變成只有25個tick資料,再比對其中6個tick,透過這6個tick的走勢來判斷是否為大波動,1.高低差是否超過一個值,2.最高是否為最後兩個tick(下跌就最低是否為最後兩個tick),3.最低是否為前面兩個tick(下跌就最高是否為前面兩個tick)。
pattern
圖a,便不符合規則1和規則3,而圖b便會進場做多。
實際案例,下圖為2012/3/22 09:14到09:16之間的台指期走勢。
台指期走勢
其中第一個slide window,便進場做多,第二個slide window,便進場做空,可比對期貨程式交易機器人3/22的交易紀錄
以上大致說明期貨程式交易機器人的順勢策略,之後再說明逆勢策略及停利停損的規則。

2012年5月22日 星期二

Web使用挖掘的應用研究


1   引言
  Web資料的爆炸性增長導致了顧客資訊的過量,合理地應用它們不僅可以使網站和商業公司在激烈的競爭中獲益,還可以找到合作長久同時又有利可固的顧客。如何策略地解決這個問題取決於我們對Web使用挖掘技術的有效應用,在Web上運用資料採擷技術發現和分析有用資訊逐漸成為知識發現研究的重要方向。

  Web是一個快速變化的資訊源,不單單是網上內容的急劇膨脹,頁面內容的改變也是極度頻繁,新聞、股票市場、廣告公司和網路股務中心都在一定的時間間隔內修改著他們的網上資訊;另外,網頁的連結和存取路徑也常常被改變,還要面對各種不同的用戶,而且用戶的數量也在不斷地增長。其使用興趣和目的各不相同,如何才能找到使用者感興趣的資訊?如何才能找到高品質的頁面?

  以上這些問題推動了在Internet上進行使用挖掘的研究,為了更好地管理Web網站的資料,使其高效地為網上使用者提供有效的資訊股務;挖掘使用者感興越的內容;跟蹤、分析使用者的使用模式;提高使用者使用網路的效率,我們要積極開展網路挖掘中使用挖掘的應用研究工作。Web使用挖掘的應用日益廣泛,尤其是在電子商務的大力支持下,越發顯示出蓬勃的生命力。它通過資料採擷技術對Web上的資料進行挖掘,從而發現Web上的使用者使用模式。

2   Web使用挖掘

  Web使用挖掘是從Web股務器中自動發現使用者的訪問模式。在Web伺服器日誌中自動搜集並記錄著使用者的訪問操作,還有通過CGI記錄的使用者註冊資訊。通過對這些使用者資訊的分析,可以找出使用者的訪問模式,確定產品的市場戰略,提高商業活動的效率,而且為網站的有效組織也提供了資訊,還可以為特定的使用者提供個性化的網路服務。

  目前常用的工具有模式發現工具和模式分析工具,它們提供了使用者行為的分析和資料的過濾,使用人工智慧、資料採擷、心理學和資訊理論從資料集中挖掘知識。在訪問模式發現以後,用相應的分析技術來理解、解釋和顯示這些模式。如使用0LAP連線分析處理技術,資料立方體簡化使用者使用模式的分析,還有用SQL查詢發現知識等。

2.1   Web使用挖掘的框架

Web使用挖掘框架主要包括三部分:

 (1)資料頂處理,包括使用者識別、操作識別、路徑完善、事務標識、資料集成、資料轉換,將Web日誌轉化成面向不同領域的適合資料採擷的事務形式。

 (2)面向不同的領域採用資料採擷演算法,如關聯規則挖掘、序列模式挖掘、路徑分析挖掘、分類和聚類分析挖掘等。

 (3)模式分析的方法有:連線分析、視覺化、知識查詢和資訊過濾。模式分析工具將抽象的使用模式以直觀、容易理解的方式展現給分析者,分析者利用知識查詢語言,根據需要對挖掘過程加以限制,得到感興趣的使用模式。比如限定某一領域進行挖掘,然後就這一領域挖掘出來的使用模式進行分析,得出感興趣的結果。

  資訊過濾分兩部分:objective過濾和subjective過濾。objective過濾處理用不同模式發現關聯的數值型度量的變化,比如:支持度和興趣度;subjective過濾是用來處理使用挖掘通過分析網站內容和結構而形成訪問網頁的可信任度。對於Web使用挖掘,設想用網站結構和內容作為網站設計者的領域知識,在網頁之間進行連結以提供這些頁面的關聯支援,那麼在網頁之間的拓撲連結越強,這些網頁一起被訪問的可信度也就越高。類似地,在同一個內容簇或同一類裡的頁面被認為在一起被訪問的可信度遠遠大於不同簇或不同類中的頁面。圖1所示是Web使用挖掘系統框架。

2.2Web使用挖掘的實驗

  採用分類和聚類的挖掘方法,通過訪問網站的客戶流量的分析,得出群體客戶的訪問規律,使網站設計者可以根據客戶的訪問規律,在不同時間段內推薦不同品質的思務,有效提升網站的訪問人數。步驟如下:

 (1)瞭解上網客戶的身份,進行特定客戶群體分析,從訪客的造訪次數、停留時間及常訪問的頁面,找到有實用價值的客戶。

 (2)對網站特定主題內容和特定網頁進行深度分析,如:國慶日活動、旅遊介紹等,進一步瞭解網站內容與訪問客戶之間的互動關係,發現最吸引客戶的商品和服務。

 (3)通過參照訪問客戶參與網站活動效果及網頁流覽狀態.輔助網站內容規劃,評估網站內容。

  基於一些實驗資料類比,將一天24小時內某網站客戶流量進行分析,用表1、圖2表示出來,並分析出一天中的推薦服務量(圖3)。

3   網站結構和內容對使用挖掘的影響

  目前有許多工具可以進行資料的清理和Web伺服器日誌中的會話識別,還有大量的資料採擷演算法從預處理後的資料集中發現使用者使用模式和預測趨勢,但最終Web使用挖掘的效果依然不能令人滿意,其中一個重要的原因就是人們忽視了對使用挖掘效果起著重要影響作用的網站結構和內容。圖4所示的是Web使用挖掘的過程,從中不難看出,網站的結構和內容對整個Web使用挖掘過程的每個重要階段都是關鍵性的資料來源。在Web上有三種數據:內容資料、結構資料和使用者使用資料。內容資料是指網頁上實際存在的資料,是供網上用戶使用的,通常是由文本和圖像組成的;結構資料是用來組織內容的一種描述性的資料,主要是指頁與頁之間的超連結;而使用者使用資料是指Web頁面的使用模式,比如:IP位址、頁面引用和存取時間等資料。使用資料通常源于普通和擴展的思務器日誌。以上三種資料組建了資料提取、頁面流覽、點擊流和會話。頁面流覽是指用戶端使用者一次點擊網頁的行為,一系列的頁面流覽構成點擊流。

  網站結構和內容的處理是一個內部關聯的任務。網頁如何連結取決於網頁的流覽方式,網站內容的創建技術又決定著網站的內容和結構,而不同的使用者則決定著網站主頁內容的設計。因此,網站的結構、內容和使用者的使用有著密不可分的聯繫,網站的結構和內容影響著Web使用挖掘的不同階段,分頁檔在語義上依賴著網站內容,而網站內容的決定是一個手工過程,取決於創建網站的技術和分析目的。

4   使用挖掘在電子商務中的應用

  由於迅速發展的電子商務競爭異常激烈,所以網站銷售商一定要做好快速迎合線上顧客需求的準備。線上銷售的伸縮性使得人們能夠監控銷售,並且及時瞭解價格調整和產品服務的可適應性。另外,通過對銷售資訊的挖掘能展現影響產品所有方面的重要趨勢和模式,包括:貨運、銷售和庫存等。

  日益增長的網站訪問資訊和飛速發展的資料採擷技術使得網站能夠真正地為它的線上顧客提供個性化服務,市場應該使網站施效於它真正的客戶和利益。在一個動態的強競爭的網路環境中,電子商務必須通過較好地理解訪問頻繁的客戶和最有利可圖的顧客的行為,才能取得它們的競爭優勢。要想瞭解客戶的訪問行為就必須通過使用挖掘去挖掘你的網站資料,使網站的努力集中在有利可圖的顧客和前景上。

  目前大部分的公司都有自己網站產生出來的巨大數量的使用者資訊,因而大型的電子商務網站需要有適合大量資料的挖掘工具,希望能通過資料採擷得到益處。另外Web是個理想的市場環境,其中每筆交易都能被獲取和存儲,通過Web上的使用挖掘可以便網站達到以下目的:

‧識別Web客戶的關鍵特性。
‧測試和決定哪個市場活動影響力最大。
‧識別出對新產品特別有興趣的客戶。
‧降低商品的價格,改善和客戶的關係。
‧改善網站廣告和銷售過程。

  使用挖掘在電子商務中的具體挖掘步驟如圖5所示。

(1)縱覽數據

  通過對顧客的可視縱覽調查,能揭示一定顧客的特性統計,從而為網站設計者和市場經營者提供一些直接的戰略戰策。

(2)分析資料

  將資料按照不同類型的分析方法分成不同的簇,進行分類聚類的挖掘。


(3)數據建模

  建立網站訪問者的行為模型,發現和學習訪問者的特性和線上行為。例如,通過檢驗訪問者的特性、點擊廣告和進行線上購物的習性,結合資料採擷工具建模和預測網站訪問者的行為,將個性化的服務推薦給有極大興趣並且有購買欲望的顧客。一旦網站和顧客建立了相互瞭解的關係,那麼這些顧客將可能永遠是網站的老顧客。

(4)方法集成

  Web使用挖掘並不是一個孤立的單一過程.而是對網站各個有影響的方面都要進行分析的綜合過程。在這個分析的基礎上,發現和控制貨運週期和具體產品的趨勢,發現的模式能提示網站目前需要哪些貨源,以確保產品和思務的迅速遣送。

(5)客戶識別

  要通過使用網站所產生的事務和顧客資料瞭解購買者是誰,最喜歡買什麼?這就要求我們結合多方因素為每個訪問者建立一個唯一的記錄,獲取並分析每個購物者的行為資訊。

(6)機構分析

  分析作為一種回饋系統思務於電子商務網站,能影響網站的設計、銷售、庫存和市場經營。對客戶資訊的整體機構的分析挖掘,可以使網站瞭解購買者的個人資訊特點和購買物品的價格特點;瞭解所處熱賣的產品,及時調整庫存、貨運和計畫定單;並制定出浮動價格、增強廣告設計、獎員促銷等一系列行銷策略。

(7)個性化服務    

  Web允許人們按照自己的喜好定制新聞、天氣、市場和股票報告,但是人們必須要提供個人資訊,以便於網路瞭解我們的偏好,適時地推薦具有個性化特點的產品和服務。因而網站要積累大量的使用者資訊,為使用者提供感興趣的產品和思務,建立牢固可靠的貿易關係,個性化網站的設計應用。最大的利益取決於網站和顧客資訊的集成,這就要求在個性化基礎上挖掘相互之間的作用與影響,並建立使用者的個人偏好記錄。通過討論、聊天和郵件的方式學習顧客,並且可以進行相互影響的交流,從而形成網站的個性化思務。

  Web通過加大顧客的自由選擇權而促進了商務的發展,網站要遞送個性化的服務就需要挖掘Web使用資料發現顧客的特性,依靠這些資料的積累,進一步拓展網站的個性化功能。

  應答式的個性化服務將會變得很規範。顧客很願意以最少的代價去尋找所需的產品、服務和資訊,因而商業網站必須結合公司的庫存資料庫,以適應不同個性使用者的產品需求,同時也可以通過交叉推薦的方式來進行推薦。總之,個性化是通過網站和顧客之間的聯繫,使用積累資訊進行挖掘,又遞送商品服務于顧客的過程。

結束語

  Web挖掘是一個新興的有巨大發展前景的研究領域,其技術在國內外有著廣泛的應用。電子商務通過Web上的使用挖掘所提供的足夠的知識,可以鎖定相當數量的顧客進入商務關係中,以改善銷售狀況和保存客戶關係,從而增加市場效益。另外,通過Web使用的個性瞭解,比較已存在顧客的綜合個性,能在已有顧客的知識幫助下發掘出潛在的新顧客的個性、生活方式和特點。Web使用挖掘作為一個新興的研究領域,其應用技術依然面臨著很多挑戰。

Web結構挖掘演算法概述及應用



一、    引言
資料採擷是將人工智慧技術和資料庫技術緊密結合發展出的一門新的技術,利用電腦從龐大的資料中智慧地、自動地抽取有價值的知識模式,以滿足人們不同應用的需要。隨著互聯網的普及和迅猛發展、Web上信息量的爆炸式增長, 網上的資源得到極大豐富, 但也充斥著大量的垃圾資訊, 人們迫切需要能從這些紛繁蕪雜的資訊中找到有用知識的工具。鑒於資料採擷工具的日益成熟完善, 人們自然而然想到了要把資料採擷技術應用到Web上來。
Web挖掘指在WWW 上挖掘潛在的、有用的模式及隱藏的資訊過程。根據對Web資料的感興趣程度不同,Web挖掘一般可以分為三類:Web內容挖掘(Web Content mining)、 Web結構挖掘( Web structure mining)、 Web 用法挖掘(Web usage Mining)
其中Web 結構挖掘是對Web 的連結結構進行分析, 以對超連結分析來評估基礎Web 資源, 從而發現有用模式, 提高搜索品質。
二、    Web結構挖掘綜述
傳統的WEB搜尋引擎大多數是基於關鍵字匹配的,返回的結果是包含查詢項的文檔,也有基於目錄分類的搜尋引擎。這些搜尋引擎的結果並不令人滿意。有些網站有意提高關鍵字出現的頻率來提高自身在搜尋引擎中的重要性,破壞搜尋引擎結果的客觀性和準確性。另外,有些重要的網頁並不包含查詢項。搜尋引擎的分類目錄也不可能把所有的分類考慮全面,並且目錄大多靠人工維護,主觀性強,費用高,更新速度慢。
Web結構包括不同網頁之間的超連結結構和一個網頁內部的可以用HTML,XML表示成的樹開結構,以及文檔URL中的目錄路徑結構等。Web頁之間的超連結結構中包含了許多有用的資訊,當網頁A到網頁B存在一個超連結時,則說明網頁A的作者認為網頁B的內容非常重要,且兩個網頁的內容具有相似的主題。因此,指向一個文檔的超連結體現了該文檔的被引用情況。如果大量的連結都指向了同一個網頁,我們就認為它是一個權威頁。這就類似於論文對參考文獻的引用,如果某一篇文章經常被引用,就說明它非常重要。這種思想有助於對搜尋引擎的返回結果進行相關度排序。從WWW的組織結構和連結關係中推導知識。通過對Web網站的結構進行分析、變形和歸納,將Web頁面進行分類,分析一個網頁連結和被連結數量以及物件來建立Web自身的連結結構模式,確定不同頁面間的相似度和關聯度資訊。定位相關主題的權威網站,可以極大的提高檢索結果的品質。
基於這種超鏈分析的思想,Sergey Brin和Lawrence Page在1998年提出了PageRank演算法,同年J. Kleinberg提出了HITS演算法,其它一些學者也相繼提出了另外的連結分析演算法,如SALSA,PHITS,Bayesian等演算法。這些演算法有的已經在實際的系統中實現和使用,並且取得了良好的效果。
三、    WEB結構挖掘常見演算法
1、           PageRank演算法
PageRank演算法是Web超連結結構分析中最成功的代表之一。該演算法由Stanford大學的Brin和Page提出,是評價網頁權威性的一種重要工具。搜尋引擎Google、Yahoo、Baidu都是利用該演算法和anchor text標記、詞頻統計等因素相結合的方法對檢索出的大量結果進行相關度排序,將最權威的網頁儘量排在前面。
1)        PageRank基本原理
傳統情報檢索理論中的引文分析方法是確定學術文獻權威性的重要方法之一,即根據引文的數量來確定文獻的權威性。PageRank 的發明者對網路超連結結構和文獻引文機制的相似性進行了研究,把引文分析思想借鑒到網路文檔重要性的計算中來,利用網路自身的超連結結構給所有的網頁確定一個重要性的等級數,當從網頁A 連結到網頁B 時,就認為”網頁A 投了網頁B 一票”,增加了網頁B 的重要性。最後根據網頁的得票數評定其重要性,以此來?明實現排序演算法的優化,而這個重要性的量化指標就是PageRank 值。
但是網頁和學術上的出版文獻的差別是很大的。首先學術論文的出版發表非常的嚴格,而網頁的出版非常自由、成本很低並缺乏控制,用一個簡單的程式就可以產生大量的網頁和很多連結。另外學術出版物的引文一般和文章的領域有關係,而網頁的連結範圍領域卻很廣。可見簡單的連結數量計算並不能客觀真實地反映網頁的重要性,所以PageRank 除了考慮網頁得票數(即連結) 的純數量之外,還要分析為其投票的網頁的重要性,重要的網頁所投之票有助於增強其他網頁的“重要性”。簡單地說,PageRank 就是要從連結結構中獲取網頁的重要性,而網頁的重要
2)        PageRank的實現
PageRank在具體實現時會忽略掉Web頁面上的文本和其它內容,只考慮頁面間的超連結,把Web看成是一個巨大的有向圖G =(V,E),結點vI V代表一個Web頁面,有向邊(p,
q )I E代表從結點p指向結點q的超連結,結點p的出度是指從頁面p出發的超連結(outlink)的總數,而入度是指所有指向結點p的超連結(inlink)的總數。
PageRank的具體定義如下:將Web對應成有向圖,設W為該有向圖結點的集合,N=|W|, Fi是頁面i指向的所有頁面的集合,Bi是指向頁面i的所有頁面的集合。對每個出度為0的結點S,設FS ={有向圖中全部N個結點},則所有其他結點的Bi={B E i S},這樣可以將結點S所具有的PageRank值均勻地傳遞給其他所有頁面。PageRank的具體反覆運算公式為 。
其中,參數 d是 取值0到1之間的衰減因數,因為任何一個網頁的作者都認為其它的網頁不如自己的重要。d通常被置為0.85。
PageRank的實現過程為:將網頁的URL對應成唯一的整數,把每一個超連結用其整數ID存放到索引資料庫中,經過預處理(如去除資料庫中的懸擺指標)之後,設每個網頁的初
始PR值為1,通過以上的遞迴演算法計算每一個網頁的PageRank值,反復進行反覆運算,直至結果收斂。
2、           HITS演算法
1)        HITS基本原理
Hill Top 演算法的指導思想和PageRank 是一致的,即都通過反相連結的數量和品質來確定搜索結果的排序權重。但超連結的應用存在著許多的潛在的問題,如大量的連結是為了導航(如“點擊此按鈕返回主頁”)或付費廣告而創建的。而出於商業競爭的原因,儘管內容相關,有些網站又不會把超連結指向他們的競爭對手(如:Cisco公司不會將超連結指向Sun公司的主頁)。
HITS演算法他認為網頁的重要性應該依賴於用戶提出的查詢請求。而且對每一個網頁應該將其authority權重(由網頁的outlink決定)和hub權重(由網頁的inlink決定)分開來考慮,通過分析頁面之間的超連結結構,可以發現以下兩種類型的頁面:
中心網頁(hub):一個指向權威頁的超連結集合的Web頁
權威網頁(authority):一個被多個Hub頁指向的權威的Web頁
中心網頁(hub)

權威網頁(authority)
HITS演算法發現,在很多情況下,同一主題下的權威網頁(authority),如上例所述Cisco和SUN,之間並不存在相互的連結。所以,權威網頁(authority)通常都是通過中心網頁(hub)發生關聯的。
HITS演算法描述了權威網頁(authority)和中心網頁(hub)之間的一種依賴關係:一個好的中心網頁(hub)應該指向很多好的權威性網頁(authority),而一個好的權威性網頁(authority)應該被很多好的中心性網頁(hub)所指向。
2)        HITS的實現
HITS首先利用一個傳統的文本搜尋引擎(例如AltaVista)獲取一個與主題相關的網頁根集合(root set).然後向根集合中擴充那些指向根集合中網頁的網頁和根集合中網頁所指向的網頁,這樣就獲得了一個更大的基礎集合(base set).假設最終基礎集合中包含N 個網頁,那麼對於HITS 演算法來說,輸入資料就是一個N×N 的相鄰矩陣A,其中如果網頁i 存在一個連結到網頁j,則Aij=1,否則Aij=0。
HITS 演算法為每個網頁i 分配兩個度量值:中心度hi 和權威度ai.設向量a=(a1,a2, … ,aN)代表所有基礎集合中網頁的權威度,而向量h=(h1,h2, …,hN)則代表所有的中心度.最初,將這兩個向量均置為u=(1,1, … ,1).操作In(a)使向量a=ATh,而操作Out(h)使向量h=Aa.反復反覆運算上述兩個操作,每次反覆運算後對向量a 和h 範化,以保證其數值不會使計算溢出.Kleinberg 證明經過足夠的反覆運算次數,向量a 和h 將分別收斂於矩陣ATA 和AAT 的主特徵向量.通過以上過程可以看出,基礎集合中網頁的中心度和權威度從根本上是由基礎集合中的連結關係所決定的,更具體地說,是由矩陣ATA 和AAT 所決定
3、           其它演算法及歸類
連結分析演算法可以用來提高搜尋引擎的查詢效果,可以發現WWW上的重要的社區,可以分析某個網站的拓撲結構,聲望,分類等,可以用來實現文檔的自動分類等。歸根結底,能夠?明使用者在WWW海量的資訊裡面準確找到需要的資訊。這是一個正在迅速發展的研究領域。
PageRank和HITS是演算法中應用最廣的兩種,而其它一些類似的演算法有的處於研究階段,有的已經在具體的系統實現了。這些演算法大體可以分為3類,基於隨機漫遊模型的,比如PageRank,Repution演算法,基於Hub和Authority相互加強模型的,如HITS及其變種,基於概率模型的,如SALSA,PHITS,基於貝葉斯模型的,如貝葉斯演算法及其簡化版本。所有的演算法在實際應用中都結合傳統的內容分析技術進行了優化。一些實際的系統實現了某些演算法,並且獲得了很好的效果,Google實現了PageRank演算法,IBM Almaden Research Center 的Clever Project實現了ARC演算法,多倫多大學電腦系實現了一個原型系統TOPIC,來計算指定網頁有聲望的主題。
四、    PageRank與HITS演算法比較
顯而易見,兩者均是基於連結分析的搜尋引擎排序演算法,並且在演算法中二者均利用了特徵向量作為理論基礎和收斂性依據。但兩種演算法的不同點也非常明顯。
PageRank是對WWW的整體分析,通過模擬在WWW上的隨機遊動對每一個網頁計算其PageRank值。因此該演算法是獨立於使用者查詢的,可以對用戶要求產生快速的回應。HITS演算法是對WWW的局部分析,是根據特定的查詢產生不同的根集,然後計算網頁的Authority值和Hub值。該演算法是依賴於使用者查詢的,即時性差。
HITS演算法存在“主題漂移”的現象,如用戶在查詢“量子物理學”時,由於演算法中需要對初次檢索結果的根集擴充成基集,最終的檢索結果中會包含大量的有關“物理學”的網站。因此,HITS適合與寬主題的查詢,而PageRank則較好地克服了“主題漂移”的現象。
五、    應用WEB結構挖掘演算法提高網站價值
1、           選擇連結策略
在互聯網的海洋中,最重要的就是互聯互通,不被其他網站引用的網站就是“資訊孤島”。WEB結構挖掘引擎所有演算法都將網頁中的連結作為主要挖掘的物件,特別是實際應用中,大多數使用者都是使用基於PageRank演算法的Google, Yahoo,Baidu都搜尋引擎,因此可以採取以下幾種策略,提高網站的排名。
1)        廣泛連結策略
來自其他網站的任何反相連結都是有用的。當前常見的新搜尋引擎已經不再只是網站目錄的索引,而是更全面的網頁索引,所以無論來自其他網站任何地方的反相連結都是非常有價值的。
同時如果一個網頁只有大量的進入連結,而缺乏匯出連結,也會被搜尋引擎認為是沒有價值的網站。保證你的網站能夠幫助搜尋引擎更準確地判斷哪些是對使用者最有價值的資訊,也就是說如果你的網站只有外部反向連結而沒有匯出連結的話,也會對你的網站在搜索結果中的表現帶來負面影響。
2)        高品質連結策略
被PageRank高的網站引用能更快地提高PageRank數量只是關鍵因素之一,來自PageRank高的頁面的連結還能更快的提高被連結目標的PageRank
3)        無空連結策略
應當保持網站自身的健康,經常利用壞鏈檢查工具檢查網站中是否有死鏈。同時保持網頁內容/連結的穩定性和持久性:在搜尋引擎索引中網頁存在的歷史也是一個比較重要的因素,而且歷史比較久的網頁被連結的幾率越高。為了保證自己網頁能夠被比較持久的被其他網站的頁面引用,如果自己網頁中有連結更新時,最好能保留舊的頁面並做好連結轉向,以保持內容的連續性。
2、           構建友好的網站結構
有了合適的連結,就可以在演算法中取得一個比較理想的分值,但由於資料的挖掘過程中由機器Spider自動完成。因此還必須考慮讓引擎能完整的採集到所設計的連結,這就需要構建友好的網站結構。
1)        網站結構扁平化
網站目錄結構要扁平,因為每深一級目錄,PAGERANK降低1-2個檔次。假設首頁是3,其子可能目錄就是1了,更深可能就無法列入評級範圍了。
2)        表現和內容的分離
遵循w3c的規範,使用更規範的XHTML和XML作為顯示格式,JavaScript和CSS盡可能和網頁分離,一方面提高代碼重用度(也方便頁面緩存),另外一方面,由於有效內容占網頁長度的百分比高,也能提高相關關鍵字在頁面中的比重也增加了。因為挖掘引擎會更傾向於<title><h1><h2>……之間的內容,而不是正文。
3)        建立網站地圖
讓所有的頁面都有能夠快速入口:網站地圖,方便網頁爬蟲(spider)快速遍歷網站所有需要發佈的內容。如果首頁就是用Flash或圖片進入的話,無異於將搜尋引擎拒之門外,除了UI設計的用戶友好外,spider 友好也是非常重要的。
六、    結語
網路的結構挖掘技術已經是比較成熟的技術,特別是PageRank演算法已經應用到各大搜索網站中。所有的結構挖掘演算法都是基於網頁結構中超連結的分析。所不同的僅僅只是分析的效率改進和一些附加的分析條件。通過網站結構演算法的研究,可以有效地採取應對措施,提高網站在搜尋引擎中的排名。從而能網站可以有效的被客戶搜索。隨著電子商務的迅猛發展,企業應當儘早地重視這種被挖掘的技術應用,提高自身網站的價值。


參考文獻
〔 1 〕    何曉陽、吳強、吳治蓉,HITS 演算法與PageRank 演算法比較分析,情報雜誌2004 年第2 期
〔 2 〕    王曉宇、周傲,萬維網的連結結構分析及其應用綜述,軟體學報
〔 3 〕    Dan Thies,Google PageRank排名新演算法
〔 4 〕    Sergey Brin,Lawrence Page,Google的技術剖析,http:// www.51web.biz
〔 5 〕    曹軍,Google 的PageRank 技術剖析,情報雜誌2002 年第10 期
〔 6 〕    楊海東、張莉,PageRank 技術分析與搜尋引擎檢索效率研究,淮陰師範學院學報(自然科學版),第2 卷第3 期,2003 年8 月
〔 7 〕    吳軍、孫從梅,資料採擷技術在Web中的應用,內蒙古科技與經濟,2004年第12期
〔 8 〕    楊沅釗、吳薇、喻曉莉、楊國才,搜尋引擎排名改進演算法分析,《農業網路資訊》2005 年第2 期
〔 9 〕    陳灶芳黃國濤,用於互聯網資訊搜索系統的網路蜘蛛設計與實現,廣東科技
〔 10 〕          楊炳儒、李 岩、陳新中、王 霞,Web結構挖掘,計 算 機 工 程,2003年11月
〔 11 〕          WEB超鏈分析演算法縱覽
〔 12 〕          Web資料採擷的研究現狀及發展
〔 13 〕          陳莉,焦李成.Internet/Web資料採擷研究現狀及最新進展.西安電子科技大學學報(自然科學版).2001年2月第28卷第1期.
〔 14 〕          車東,如何提高網站在Google中的排名,http://www.zdnet.com.cn/
〔 15 〕          車東,提高網站在Google中的排名——面向搜尋引擎的網站設計
〔 16 〕          如何評價網站的人氣,http://www.zdnet.com.cn/developer/study/story/0,2000081626,39046113,00.htm
〔 17 〕          資料採擷未來研究方向及熱點,http://www.stcsm.gov.cn/fuwuzhinan/fb/bf/know/20010531-1.asp

2012年5月21日 星期一

Wordpress SEO - URL規範化設定


OK,這裡要講有關於 Wordpress的 URL網址規範化的設定方式,什麼是網址的規範化請參考這一篇文章的說明 網址的 URL規範化說明,在一系列相關的說明您都了解之後,再來做這個 wordpress的網址規範化會比較清楚一點,當然,如果你一點也不想知道原因和說明,你也可以直接照著做就可以了

以 Wordpress而言,其實有相關的外掛可以使用,你也可以參考這篇文章 Wordpress Permalink Redirect 重新導向URL外掛,主要的 URL規範化我們大致上可以分做以下幾個需求來討論

1. 包含www及不包含www的網域名稱被搜尋引擎視為不同的兩個網域的問題

2. 首頁 index.html指向的網址重複的問題

3. wordpress你雖然已經設定了固定的網址(可參考這篇文章 Wordpress SEO - 設定你的 permalink固定網址)但是你在網址列打入類似 http://domain.com/?p=1168 的網址還是會被訪客看到其網頁內容,分頁和分類的頁面也是如此,仍舊會有內容重覆性的問題

請注意喔,這裡是討論 URL的規範化並非所謂的最佳化,你不需要經過怎樣的審慎的思考或是評估的,你就是照著做就可以了

關於問題一及問題二你也可以透過修改你的 . htaccess檔案來做導向,詳情可以參考這篇文章 htaccess 如何做 301轉向(301 Redirect),不過說實在的,如果你的 wordpress實在也不是安裝在甚麼奇怪的地方,你只要安裝 Wordpress Permalink Redirect 重新導向URL外掛 就已經差不多問題都解決了,當然對於搜尋引擎的部分而言,你還可以利用 robot.txt的方式在一次的讓你的網頁被搜尋引擎爬行的更有規範

對於我而言,其實 wordpress blog的URL規範化問題更為複雜一點,如果你申請的主機就只是放你目前的這個 blog的話,其實你的 wordpress就直接安裝在根目錄下就好了,然後使用外掛解決一切問題 !!

因為我目前都還在實驗階段,因此雖然我有自己的固定 ip可以使用,但是我的主機上切了很多的子網域和 addon domain,對於我的各個網域之間的 URL規範化的問題會比較大一點 !!