
アルゴリズムとその実装の一般的な概要
Twitterは、私のような暗号通貨プロジェクトにとって便利なプラットフォームのようです。 ここでは、特に、ユーザーと自分のアカウントが開かれているプログラムの間の便利な対話を整理できます。 そのため、私はTwitter用のボットの形で開発を設計することにしました。 特に、ボットは2時間ごとに、今後N日間のビットコインの価値の予測をツイートする必要がありました。 Nは日数で表した期間であり、予測は、関連情報を含むボットを要求した人々にとって最も興味深いものです。 したがって、たとえば、3人が5日間の予測を要求し、7人が2日間の予測に関心がある場合、ボットは2日間の予測をツイートします。
ボットはNode.jsに実装されており、私はかなり迅速に開発しました。 価格に関する過去および現在のデータのソースを検索し、それらを操作する方法を選択するのに時間がかかりました。 主な問題はアルゴリズムでした。 最後に、私は彼らがいくつかのより多くのものと組み合わせて最近傍のKメソッドを使用することを決定しました。
価格を予測する考慮された方法には、次の一連のアクションが含まれます。
-  次の予測に対するユーザーリクエストのコレクション。 
      
 -  最もリクエストされた予測の期間を見つける。 
      
 -  ビットコインの現在の値を取得します。 
      
 - ビットコインの価格が現在の価格に最も類似していた過去2か月間
K(10)
最も近い日付をK(10)
見つけます。
 -  見つかった各日付の価格( 
PAST_DATE
)について、そのN
日後のBTC価格(PAST_DATE
)を見つけます。
 -  各日付について、 
N_DAYS_AFTER_PAST_DATE
とPAST_DATE
差を計算します。
 -  見つかったすべての相違点の合計と、 
K
によって行われたものの分割K
 -   
N_DAYS_AFTER_PAST_DATE
とN_DAYS_AFTER_PAST_DATE
すべてのグループ間のビットコイン交換レートの平均変化のビデオで結果を取得しN_DAYS_AFTER_PAST_DATE
。 この結果は、ツイートを生成するときに使用されます。
 
このプロセスの主要なステップをより詳細に検討してください。
手順1.ユーザーリクエストを収集する
このステップでは、
twit
      
      モジュールとTwitter APIを使用して、
@coin_instinct Predict for <number> days
      
      を含むツイートが検索されます。 次に、ユーザーが予測を取得したい日数を表す数字が見つかったツイートから抽出され、これらの数字の配列が作成されます。
ステップ2.ほとんどのユーザーに興味のある予測期間を見つける
ボットが2時間ごとに予測をツイートすると、この予測で使用された日数が配列で表されるブラックリストに保存されます。 この配列には、最後の4つのツイートの予測期間が含まれます。 このアプローチにより、同様のツイートが頻繁に表示されることや、過去8時間以内に既にツイートされた同じ予測の発行が回避されます。
 async function findMostFrequent(array, blackListArr) {   if(array.length == 0)       return null;   var modeMap = {};   var maxEl = array[0], maxCount = 1;   //     blackList    maxEl  ,    .         ,  generateRandom   var containsValidNumbers = false;   for(var i = 0; i < array.length; i++) {     if(!blackListArr.includes(array[i])) {       maxEl = array[i];       containsValidNumbers = true;       break;     }   }   if(!containsValidNumbers) return await generateRandom(blackListArr);   for(var i = 0; i < array.length; i++)   {       var el = array[i];       if(blackListArr.includes(el)) continue;       if(modeMap[el] == null)           modeMap[el] = 1;       else           modeMap[el]++;        if(modeMap[el] > maxCount)       {           maxEl = el;           maxCount = modeMap[el];       }   }   await addToBlackList(maxEl);   return maxEl;  }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      ここで紹介する機能は非常にシンプルです。 彼女は、最も頻繁に要求される予測期間を一連の数値から選択します。 見つかった番号が既に
blackListArr
      
      場合、関数は2番目に要求の多い予測を返します。 要求されたすべての予測期間がすでにブラックリストに含まれている場合、ボットはランダムに選択された期間の予測を行います。
ステップ3.ビットコインの現在の値を取得する
blockchain.info APIを使用して、ビットコインの現在の値を確認できます。 結果の値は変数に保存されます。
 function refreshBitcoinPrices() { const request = async () => {   var results = await fetch("https://blockchain.info/ticker");   results = await results.json();   bitcoinData.results = results;   if(bitcoinData.results) {console.log('Blockchain API works!');}   else console.log('Blockchain API is down at the moment.');   //      this.todayDate = new Date();   this.todayDate = this.todayDate.toISOString().split('T')[0];   console.log(this.todayDate);   console.log('New prices fetched.');   console.log('Most recent bitcoin price: '+bitcoinData.results.USD.last);   console.log('Time: '+new Date().getHours()+':'+new Date().getMinutes()); }   request();   //       setInterval(() => {     request();   },COIN_FETCH_TIMEOUT); // 1000*60*118 }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      この関数は、アルゴリズムの開始から2分後に開始します。
ステップ4. K個の最近傍の検索
ここでは、
PAST_DATE
      
      および
N_DAYS_AFTER_PAST_DATE
      
      必要なデータをロードするためにCoindesk APIへのリクエストを実行するなど、このステップで使用されるすべての機能の説明は提供しません。 ここに表示されているのは、現在の価格との類似度に基づいた近隣の検索です。 完全なプロジェクトコードは、私のGitHubリポジトリにあります 。
 async function getNearestNeighbours(similarities) { //      k(10),     0 var absSimilarities = []; similarities.forEach( (similarity) => {   absSimilarities.push({     date: similarity.date,     similarityScore: Math.abs(similarity.similarityScore)   }) }) absSimilarities = absSimilarities.sort(function(a,b) {   return (a.similarityScore > b.similarityScore) ? 1 : ((b.similarityScore > a.similarityScore) ? -1 : 0); }); var kNearest = []; for(var i = 0; i < K; i++) {   kNearest.push(absSimilarities[i].date); } return kNearest; }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      過去2か月間のすべてのビットコイン価格とその現在の値の差を計算したため、これらの値が0に最も近い日付を見つける必要があります。したがって、最初に
Math.abs
      
      を呼び出して、
similatityScore
      
      オブジェクトのすべてのプロパティを
similatityScore
      
      ます。次に、これらのプロパティに基づいて配列を降順に並べ替えます。
この段階では、ビットコインの価格が現在の価格に最も近い最初の10日付を見つけることができます。
ステップ5.結果の配列の形成
このステップでは、オブジェクトの配列を取得します。各オブジェクトには、プロパティ
start
      
      および
end
      
      が含まれています。
start
      
      プロパティは前の日付のいずれかのビットコイン価格を表し、
end
      
      プロパティはこの日から
N
      
      日後に価格を保存するために使用されます。 これらのデータに基づいて、価格を上下させると予測して予測を立てることができます。
 async function getFinalResults(kNearest,nDays) { var finalResults = []; var finalResult = {}; await forEach(kNearest, async(date) => {   var dateTime = new Date(date);   var pastDate = dateTime.toISOString().split('T')[0];   var futureDate = new Date(date);   futureDate.setDate(futureDate.getDate() + nDays);   futureDate = futureDate.toISOString().split('T')[0];     var valueForThatDay = this.coinDeskApiResults.bpi[pastDate];   var valueForFutureDay = this.coinDeskApiResults.bpi[futureDate];   finalResult = {     start: valueForThatDay,     end: valueForFutureDay   }   finalResults.push(finalResult); }) return finalResults; }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      ここでは、
kNearest
      
      すべての要素を
kNearest
      
      て特定の日付のデータを取得し、その後、結果を
finalResults
      
      配列に保存して返します。
ステップ6.予測
現在は、予測を形成するためだけに残っています。 これは、次の関数を使用して行われます。
 /** *    *  ,     * @param {*Array} data  ,      start  end * @param {*Float} currentBitcoinValue    */ async function calculatePrediction(data,currentBitcoinValue) { var finalPredictionData = {   raw: 0,   percentage: 0,   positive: '',   finalValue: 0 } var sum = 0; await forEach(data, async (value) => {   sum += value.end - value.start; }) sum = sum / K; finalPredictionData.raw = sum; finalPredictionData.finalValue = currentBitcoinValue + sum; finalPredictionData.positive = sum > 0 ? 'true' : 'false'; finalPredictionData.percentage = ((finalPredictionData.finalValue - currentBitcoinValue) / currentBitcoinValue) * 100; return finalPredictionData; }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      それだけで、予測が形成され、それをツイートするだけで、適切に発行されます。
まとめ
ボットについて詳しく知りたい場合は、前述のリポジトリを調べて、完全なプロジェクトコードを保存することをお勧めします。 さらに、この資料は今後数日間のビットコインの価格を予測するための私のアプローチを説明していることに注意したいので、まだ開発中です 。 ボットによって行われた予測は必ずしも正確ではありませんが、ほとんどの場合、予測値は実際の予測値と100〜200ドルだけ異なることに気付きました。 だから、どうやら、特に暗号通貨レートがどれほど狂っているかを考えると、ボットは通常それほど間違っていないと言うことができます。
説明されているアルゴリズムの主な問題は、ビットコインの履歴データのみを分析し、それらに基づいて予測を行うことです。 予測のためのメカニズムはありません。たとえば、価格の急激な下落です。 予測の「人的要因」を考慮に入れて取り組んでいます。 たとえば、ウェブサイトから記事を収集してこれを実装し、レートが突然変化する可能性のヒントを見つけて、このデータを方程式に追加することを分析することを計画しています。
ところで、この間ずっとボットについて話しましたが、決してあなたにそれを提示しませんでした。 彼には特別なアカウントcoin_instinctが開かれています。 彼に予測リクエストをツイートできます。
親愛なる読者! Twitterボットを開発していますか、それとも暗号通貨レートを予測していますか? もしそうなら、あなたの経験を共有してください。