LoginSignup
0
0

solana 開発勉強日誌3 OrcaClammBot

Last updated at Posted at 2024-04-25

開発勉強日誌が行き詰まり(solana難しい)

とりあえずsolanaでbot的なやつ動かしたい
自分のモチベを維持する為に!!!
という事で見つけてきたのは

とても良さそう。面白そう

git clone https://github.com/regonn/OrcaClammBot.git
cd OrcaClammBot

上記でhello moon のAPIを取得

.env.sampleをコピーして.envを生成.
HELLO_MOON_API_KEY=14d0000-ab00-0000-a0a0-000000000
ANCHOR_PROVIDER_URL=https://api.mainnet-beta.solana.com
ANCHOR_WALLET=inu_neko.json
依存関係のインストール.
npm install
npm install @hellomoon/api

999-functions.tsのファイルが
import secret from "./wallet.json";
上記になっていたのでwallet.jsonを作成。Keypairを入力
Solflare Walletだとコード無しでkeypairを表示できるから便利

価格を予測する為に時系列データを取得.
npx ts-node 001-download-candle-sticks-data.ts

HELLO_MOON_APIのレスポンスが変わってるみたいで動かなかった
002-train.tsを変更

002-train.ts
import candleDataRaw from "./candleSticks.json";
import * as tf from "@tensorflow/tfjs-node";
import { TRAIN_TICKS_WINDOW, targetToken } from "./000-config";

interface Ohlc {
  mint: string;
  granularity: string;
  lastblockid: number;
  startTime: number;
  high: number;
  low: number;
  open: number;
  close: number;
  volume: number;
}

function parseCandleData(data: any): Ohlc[] {
  return data.map((item: any) => ({
    mint: item.mint,
    granularity: item.granularity,
    lastblockid: item.lastblockid,
    startTime: item.startTime,
    high: parseFloat(item.high),
    low: parseFloat(item.low),
    open: parseFloat(item.open),
    close: parseFloat(item.close),
    volume: parseFloat(item.volume),
  }));
}

const candleData: Ohlc[] = parseCandleData(candleDataRaw);

async function trainModel(
  trainX: number[][],
  trainY: number[]
): Promise<tf.LayersModel> {
  const tensorX = tf.tensor2d(trainX);
  const tensorY = tf.tensor1d(trainY);
  const model = tf.sequential();
  model.add(
    tf.layers.dense({
      inputShape: [tensorX.shape[1]],
      units: 64,
      activation: "relu",
    })
  );
  model.add(tf.layers.dense({ units: 32, activation: "relu" }));
  model.add(tf.layers.dense({ units: 1 }));
  model.compile({
    optimizer: tf.train.adam(),
    loss: tf.losses.meanSquaredError,
  });
  await model.fit(tensorX, tensorY, {
    batchSize: 32,
    epochs: 500,
    shuffle: true,
    verbose: 1,
  });
  return model;
}

function preprocessData(candleData: Ohlc[]): {
  trainX: number[][];
  trainY: number[];
} {
  const trainX: number[][] = [];
  const trainY: number[] = [];
  const volatilities = candleData.map(
    (candle) =>
      (Number(candle.high) - Number(candle.low)) / Math.pow(10, targetToken.decimals)
  );
  const windowSize = TRAIN_TICKS_WINDOW;
  for (let i = 0; i < candleData.length - windowSize - 1; i++) {
    const window = volatilities.slice(i, i + windowSize);
    const next = volatilities[i + windowSize];
    trainX.push(window);
    trainY.push(next);
  }
  return { trainX, trainY };
}

async function main() {
  const { trainX, trainY } = preprocessData(candleData);
  console.log("Training model...");
  const model = await trainModel(trainX, trainY);
  console.log("Model trained.");
  await model.save("file://./model");
}

main();
価格予測モデルを作成.
npx ts-node 002-train.ts

スクリーンショット 2024-04-26 051622.png
プログラムすたーと!

npm run start

スクリーンショット 2024-04-26 063708.png

依存関係の知識がなくてChatGPT4とあれこれしました
claude(無料版)の方が依存関係に良い答えを出してくれた(印象
とても面白いプログラムだと思い、今回取り上げさせて頂きました。
多種多様な戦略が出来そうだし、機械学習の予測モデルも個性が出そう。

@regonn_haizine様公開ありがとうございます

スクリーンショット 2024-04-26 065726.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0