trinoの走り書き RSSフィード

プログラム・数学・物理の他、音楽・ゲーム・評論・戯言・絶叫などがあります。

2013-09-13 また株予測はじめました

[][]GDI+を用いたjpeg保存

C#とかならすごく簡単なのだがC++場合はwindowsAPIには存在しないのでGDI+を使うのが普通みたいだ。調べたらいろいろ引っかかったのだがメモリ上のRGBからの保存方法が見つからなかったので頑張って書いてみました。

方法としては、GDI+にあるBitmapクラスを使い、まずは空のbitmapを生成してそこにピクセルの値を埋めていくととりあえずできることがわかった。

参考にしたページ。主にgoogleで上位に引っかかったページです(^^;

http://d.hatena.ne.jp/s0u/20080211/1202679717

http://relog.xii.jp/mt5r/2007/06/jpgtiffbmp.html

http://msdn.microsoft.com/en-us/library/ms533843.aspx

以下ソース

#include <Windows.h>
#include <GdiPlus.h>
#include <Gdiplusinit.h>
#pragma comment( lib, "gdiplus.lib" )


int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);


bool SaveAsJpegImage( const WCHAR* filename, const unsigned char* aRGBImage, int iSizeX, int iSizeY )
{
	//GDI+の初期化
	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

	{
		//bitmapの作成
		Gdiplus::Bitmap bmp( iSizeX, iSizeY );

		//データを転送
		const unsigned char* pPix = aRGBImage;
		for( int iY = 0; iY < iSizeY; ++iY ){
			for( int iX = 0; iX < iSizeX; ++iX ){
				Gdiplus::Color color( pPix[0], pPix[1], pPix[2] );
				bmp.SetPixel( iX, iY, color );

				pPix += 3;
			}
		}

		//jpegとしてセーブ
		CLSID id;
		GetEncoderClsid( L"image/jpeg", &id );
		bmp.Save( filename, &id );
	}

	//GDI+の開放
	Gdiplus::GdiplusShutdown(gdiplusToken);

	return false;
}


int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
	UINT  num = 0;          // number of image encoders
	UINT  size = 0;         // size of the image encoder array in bytes

	Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;

	Gdiplus::GetImageEncodersSize(&num, &size);
	if(size == 0)
		return -1;  // Failure

	pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
	if(pImageCodecInfo == NULL)
		return -1;  // Failure

	GetImageEncoders(num, size, pImageCodecInfo);

	for(UINT j = 0; j < num; ++j)
	{
		if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
		{
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;  // Success
		}    
	}

	free(pImageCodecInfo);
	return -1;  // Failure
}

GetEncoderClsidはほぼMSDNコピペです(^^;

Bitmapクラスコンストラクタを見るとひょっとしたらRGBメモリを直接食わせることも出来そうですがよくわかりませんでしたorz

惑星惑星 2013/09/14 14:12 株価予測はラベリング問題や強化学習などいろいろできそうで面白そうですね。隠れマルコフあたりが定番なのでしょうか。

n-trinon-trino 2013/09/15 21:58 いろいろやってますがメインはSVMです。

惑星惑星 2013/09/16 12:26 ということは、多値ラベリングを使われてるのでしょうか?ある時点の状態を買い、売り、ホールドでラベルをつける、みたいな。
特徴量として株価nグラムを使えば、隠れマルコフみたいに時間的遷移を取り込むことができる、ということですよね。nグラムが3以上になるとデータ量がでかくなりがちですが、特徴量の取り得る値が限られている場合は(5%刻みで保持する等)メモリに載りそうな感じがします。
特徴量選びはかなり面白そうですね。インデックス(TOPIX)もそうですし、Yahoo!の感情分析みたいにニュースの内容を自動で分析する(もしくはYahoo!をスクレイピング)とか、楽しそうです。
カーネルは使用されるのでしょうか?すごく気になります。(儲けのコアテクニックは当然公開できないと思いますがw実際、論文になったものは役に立たなくなりましたし)

n-trinon-trino 2013/09/16 14:36 > 多値ラベリングを使われてるのでしょうか?
いえ「上がる」「下がる」の2値です。SVRでなくSVCです。
特徴量もフーリエ変換とか極めて単純です。インデックスは東証平均だけ入れてますがそれ以外の数値しにくいのは入れていません。たぶん、そんなに面白い内容ではないと思います。

惑星惑星 2013/09/16 15:04 おっしゃる通り、予測は上げ下げの識別にして、売買決定は別にしないといけないですよね。勘違いしておりました…。少なくとも最大ドローダウン(最大やられ額)は管理しないとどうにもならないですよねw
商品系(コーヒーや金等)と為替はシストレのプラットフォームが整ってそうですね。日本株にもAPIがあるかどうかわからないですが、あれば工数がかなり削減できますね。
フーリエ変換で、エリオット波動理論を想起しました。(まったくの冗談ですが……)